> ## 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 PHP للتحقق من الهوية وAML والمعاملات

> دليل البدء السريع لـ Didit PHP SDK الرسمية: استدعاءات مكتوبة الأنواع لواجهات الخادم عبر أي عميل PSR-18، والتحقق من webhook وtoken المصادقة.

المكتبة الرسمية من Didit لـ PHP. تتطلب PHP 8.1 أو أحدث، وتعمل مع أي عميل HTTP متوافق مع PSR-18، ويُعد Guzzle الخيار الشائع. اطّلع على [نظرة عامة على حزم SDK للخادم](https://docs.didit.me/ar/integration/server-sdks/overview.md) لمعرفة ما تشترك فيه جميع الحزم.

## التثبيت

```bash theme={null}
composer require didit-protocol/sdk-php guzzlehttp/guzzle
```

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

يحتاج التحقق من tokens الخاصة بـ [المصادقة](#التحقق-من-tokens-الخاصة-بالمصادقة) أيضاً إلى الامتداد `openssl`.

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

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;
use Didit\RequestOptions;

$didit = new DiditClient(
    apiKey: getenv('DIDIT_API_KEY') ?: null,
    organizationId: getenv('DIDIT_ORGANIZATION_ID') ?: null,
    applicationId: getenv('DIDIT_APPLICATION_ID') ?: null,
    timeout: 30.0,
    maxRetries: 2,
);

// Options for a single call.
$decision = $didit->sessions->retrieveDecision(
    '11111111-2222-3333-4444-555555555555',
    [],
    new RequestOptions(timeout: 5.0, maxRetries: 0),
);
echo $decision->status, "\n";
```

## إنشاء جلسة

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;

$didit = new DiditClient();

$session = $didit->sessions->create([
    'workflow_id' => '11111111-2222-3333-4444-555555555555',
    'vendor_data' => 'user-123',
    'callback' => 'https://example.com/verification/done',
]);
echo $session->url, "\n";
```

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

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;

$didit = new DiditClient();

$decision = $didit->sessions->retrieveDecision('11111111-2222-3333-4444-555555555555');
echo $decision->status, "\n";
foreach ($decision->idVerifications ?? [] as $verification) {
    echo $verification->status, "\n";
}
```

## التحقق من webhook

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;
use Didit\Exception\WebhookVerificationException;
use Didit\Webhooks\Events\StatusUpdatedEvent;
use Psr\Http\Message\MessageInterface;

$didit = new DiditClient();

/** @param array<string, string|list<string>>|MessageInterface $headers */
function handleWebhook(DiditClient $didit, string $rawBody, array|MessageInterface $headers, string $secret): int
{
    try {
        $event = $didit->webhooks->verify($rawBody, $headers, $secret);
    } catch (WebhookVerificationException $e) {
        error_log('rejected: ' . $e->reason);
        return 400;
    }
    if ($event instanceof StatusUpdatedEvent) {
        error_log($event->sessionId . ' ' . $event->status);
    }
    return 200;
}

http_response_code(handleWebhook(
    $didit,
    (string) file_get_contents('php://input'),
    getallheaders(),
    (string) getenv('DIDIT_WEBHOOK_SECRET'),
));
```

في Laravel وSymfony، مرّر `$request->getContent()` و`$request->headers->all()`. مع طلب PSR-7، مرّر الطلب نفسه بدلاً من الترويسات. أثناء تدوير السر، مرّر الاثنين معاً: `[$newSecret, $oldSecret]`. راجع [Webhooks](https://docs.didit.me/ar/integration/webhooks.md) للاطلاع على الأحداث ومخطط التوقيع.

## فحص معاملة

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;

$didit = new DiditClient();

$transaction = $didit->transactions->create([
    'transaction_id' => 'txn-1001',
    'transaction_category' => 'finance',
    'transaction_details' => ['direction' => 'outbound', 'amount' => 1500.0, 'currency' => 'EUR'],
    'subject' => ['entity_type' => 'individual', 'vendor_data' => 'user-123', 'full_name' => 'Maria Garcia'],
]);
echo $transaction->status, ' ', $transaction->score, "\n";
```

## التحقق من tokens الخاصة بالمصادقة

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

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

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\Authentication\Authentication;
use Didit\Authentication\TokenVerificationException;

// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
$auth = Authentication::fromPublishableKey('pk_live_...');

function currentUser(Authentication $auth, string $accessToken): ?string
{
    try {
        $claims = $auth->verifyAccessToken($accessToken, audience: 'your-application-id');
    } catch (TokenVerificationException $e) {
        error_log('rejected: ' . $e->reason);
        return null;
    }
    return $claims->sub;
}
```

## الأخطاء

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;
use Didit\Exception\ApiStatusException;
use Didit\Exception\NotFoundException;

$didit = new DiditClient();

try {
    $didit->sessions->retrieveDecision('11111111-2222-3333-4444-555555555555');
} catch (NotFoundException $e) {
    echo "no such session\n";
} catch (ApiStatusException $e) {
    echo $e->status, ' ', $e->requestId, "\n";
}
```

## القوائم والملفات

```php theme={null}
<?php

require 'vendor/autoload.php';

use Didit\DiditClient;
use Didit\File;

$didit = new DiditClient();

// Lists page through every result.
foreach ($didit->sessions->list(['status' => 'Approved']) as $session) {
    echo $session->sessionId, "\n";
}

// Uploads take File::fromPath, File::fromBytes or File::fromStream.
$result = $didit->idVerification->verify([
    'front_image' => File::fromPath('id-front.jpg'),
    'back_image' => File::fromPath('id-back.jpg'),
]);
print_r($result->toArray());
```

تتضمن صفحات endpoint للخادم في [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) عيّنة PHP لعمليتها، باستثناء endpoint والحقول التي لم يصدر لها بعد أي إصدار 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.