> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# حزمة تطوير بايثون (SDK) لـ KYC وAML والمعاملات

> دليل البدء السريع لحزمة Didit Python SDK الرسمية: عملاء متزامنين وغير متزامنين مع أنواع محددة لواجهات الخادم، والتحقق من webhook، وفحص رموز المصادقة (token).

الحزمة الرسمية من Didit للغة Python. تتطلب Python 3.10 أو أحدث، وتوفّر عميلاً متزامناً هو `Didit` وعميلاً غير متزامن هو `AsyncDidit`، وكلاهما يوفّر الطرق نفسها. راجع [نظرة عامة على SDKs الخادم](https://docs.didit.me/ar/integration/server-sdks/overview.md) لمعرفة ما تشترك فيه جميع حِزم SDK.

## التثبيت

```bash theme={null}
pip install didit-sdk
```

الحزمة هي [`didit-sdk` على PyPI](https://pypi.org/project/didit-sdk/). يوجد مصدرها وسجل التغييرات في [didit-protocol/sdk-python](https://github.com/didit-protocol/sdk-python) على GitHub.

للتحقق من token الخاصة بـ [Authentication](#التحقق-من-token-المصادقة)، ثبّت الإضافة التي تضيف فحص التوقيع:

```bash theme={null}
pip install "didit-sdk[auth]"
```

## إعداد العميل

تقرأ `Didit()` القيمة `DIDIT_API_KEY` من متغيرات البيئة. مرّر خيارات لتجاوزها، أو لتعيين معرّفات المؤسسة والتطبيق التي تحتاجها الاستدعاءات الخاصة بنطاق التطبيق، مثل الحالات والشبكات والتقارير التنظيمية.

```python theme={null}
import os

from didit import Didit

client = Didit(
    api_key=os.environ["DIDIT_API_KEY"],
    organization_id=os.environ.get("DIDIT_ORGANIZATION_ID"),
    application_id=os.environ.get("DIDIT_APPLICATION_ID"),
    timeout=30,
    max_retries=2,
)

# Options for a single call.
fast = client.with_options(timeout=5, max_retries=0)
```

## إنشاء جلسة

أنشئ [جلسة تحقق](https://docs.didit.me/ar/sessions-api/create-session.md) لسير عمل، ثم أرسل مستخدمك إلى عنوان URL الخاص بها.

```python theme={null}
from didit import Didit

client = Didit()

session = client.sessions.create(
    workflow_id="11111111-2222-3333-4444-555555555555",
    vendor_data="user-123",
    callback="https://example.com/verification/done",
)
print(session.url)
```

## قراءة القرار

عندما ينهي المستخدم العملية (أو عند وصول webhook)، [اقرأ القرار](https://docs.didit.me/ar/sessions-api/retrieve-session.md). كل نتيجة ميزة هي قائمة تحتوي على عنصر واحد لكل عقدة في سير العمل.

```python theme={null}
from didit import Didit

client = Didit()

decision = client.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
print(decision.status)
for verification in decision.id_verifications or []:
    print(verification.first_name, verification.last_name)
```

## التحقق من webhook

مرّر البايتات الخام لجسم الطلب بالضبط وترويسات الطلب. تُطلق `verify` الاستثناء `WebhookVerificationError` عند أي تسليم غير صالح أو قديم، لذا يكفي التقاط هذه الفئة وحدها.

```python theme={null}
import os

import didit

WEBHOOK_SECRET = os.environ["DIDIT_WEBHOOK_SECRET"]


def handle_webhook(raw_body: bytes, headers: didit.webhooks.HeadersLike) -> int:
    try:
        event = didit.webhooks.verify(raw_body, headers, WEBHOOK_SECRET)
    except didit.WebhookVerificationError as error:
        print("rejected:", error.reason)
        return 400
    if isinstance(event, didit.webhooks.SessionStatusUpdatedEvent):
        print(event.session_id, event.status)
    return 200
```

في Flask يكون ذلك `handle_webhook(request.get_data(), dict(request.headers))`؛ وفي FastAPI يكون `handle_webhook(await request.body(), request.headers)`. أثناء تدوير السر، مرّر الاثنين: `[new_secret, old_secret]`. راجع [Webhooks](https://docs.didit.me/ar/integration/webhooks.md) للأحداث ومخطط التوقيع.

## فحص معاملة

أرسل دفعةً أو عمليةَ سحبٍ أو تحويلاً بالعملات الرقمية إلى [مراقبة المعاملات](https://docs.didit.me/ar/transaction-monitoring/overview.md)؛ تتضمن الاستجابة حالتها ودرجة المخاطر.

```python theme={null}
from didit import Didit

client = Didit()

transaction = client.transactions.create(
    transaction_id="txn-1001",
    transaction_category="finance",
    transaction_details={"direction": "outbound", "amount": 1500, "currency": "EUR"},
    subject={"entity_type": "individual", "vendor_data": "user-123", "full_name": "Maria Garcia"},
)
print(transaction.status, transaction.score)
```

## التحقق من token المصادقة

يتحقق `didit.authentication` من token الوصول التي يوقّعها مُصدِر [Authentication](https://docs.didit.me/ar/authentication/overview.md) لديك، وذلك في الخادم الخلفي لديك، دون استدعاء Didit في كل طلب. كما يستبدل الأكواد، ويجدّد token، ويتحقق من الجلسات ويلغيها، وينفّذ عمليات التحقق الإضافية.

> [!NOTE]
>
> يتضمن التحقق من token إجراء الفحوصات الواردة في [التحقق من token على الخادم لديك](https://docs.didit.me/ar/authentication/tokens-and-jwks.md#التحقق-من-رمز-على-الخادم-لديك)، مقابل المُصدِر ومفاتيح التوقيع الخاصة بتطبيقك.

```python theme={null}
from didit.authentication import Authentication, TokenVerificationError

# The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
auth = Authentication.from_publishable_key("pk_live_...", client_id="your-application-id")


def current_user(access_token: str) -> str | None:
    try:
        claims = auth.verify_access_token(access_token)
    except TokenVerificationError as error:
        print("rejected:", error.reason)
        return None
    return claims.sub
```

## الأخطاء

```python theme={null}
import didit
from didit import Didit

client = Didit()

try:
    client.sessions.retrieve_decision("11111111-2222-3333-4444-555555555555")
except didit.NotFoundError:
    print("no such session")
except didit.RateLimitError as error:
    print("slow down, request", error.request_id)
except didit.APIStatusError as error:
    print(error.status_code, error.body)
```

## القوائم والملفات والعمليات غير المتزامنة

```python theme={null}
import asyncio
from pathlib import Path

from didit import AsyncDidit, Didit

client = Didit()

# Lists page through every result.
for session in client.sessions.list(status="Approved"):
    print(session.session_id)

# Uploads take a path, bytes or an open file.
result = client.id_verification.verify(front_image=Path("id-front.jpg"), back_image=Path("id-back.jpg"))
print(result.id_verification)


async def main() -> None:
    async with AsyncDidit() as aclient:
        session = await aclient.sessions.create(workflow_id="11111111-2222-3333-4444-555555555555")
        print(session.url)


asyncio.run(main())
```

تتضمن صفحات endpoint للخادم في [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) عينة Python لعمليتها، باستثناء الـ endpoints والحقول التي لم يتضمنها أي إصدار 1.0.1 بعد، والمذكورة في [النظرة العامة](https://docs.didit.me/ar/integration/server-sdks/overview.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.