> ## 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.

# PHP SDK: KYC, AML और लेन-देन

> Didit का आधिकारिक PHP SDK: किसी भी PSR-18 HTTP क्लाइंट पर सर्वर APIs के लिए टाइप्ड कॉल, webhook सत्यापन और token जाँच का क्विकस्टार्ट।

PHP के लिए Didit की आधिकारिक लाइब्रेरी। इसके लिए PHP 8.1 या उसके बाद का संस्करण चाहिए, और यह किसी भी PSR-18 HTTP क्लाइंट के साथ काम करती है; Guzzle आम तौर पर इस्तेमाल होने वाला विकल्प है। सभी SDK में समान सुविधाओं के लिए [सर्वर SDK अवलोकन](https://docs.didit.me/hi/integration/server-sdks/overview.md) देखें।

## इंस्टॉल

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

पैकेज [Packagist पर `didit-protocol/sdk-php`](https://packagist.org/packages/didit-protocol/sdk-php) है। इसका सोर्स और चेंजलॉग [GitHub पर didit-protocol/sdk-php](https://github.com/didit-protocol/sdk-php) में हैं।

[Authentication](#authentication-टोकन-सत्यापित-करें) के लिए टोकन सत्यापन हेतु `openssl` एक्सटेंशन भी आवश्यक है।

## क्लाइंट कॉन्फ़िगर करें

`new DiditClient()` एनवायरनमेंट से `DIDIT_API_KEY` पढ़ता है। इसे बदलने के लिए named arguments पास करें, या संगठन और एप्लिकेशन ID सेट करें, जिनकी ज़रूरत एप्लिकेशन-स्कोप वाले कॉल (केस, नेटवर्क, नियामकीय रिपोर्ट) को होती है। अनुरोध फ़ील्ड API के अपने फ़ील्ड नामों वाला एक array होता है; रिस्पॉन्स 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/hi/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/hi/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 सत्यापित करें

कच्चा body, जैसा प्राप्त हुआ, और अनुरोध हेडर पास करें। `verify` किसी भी ऐसी चीज़ पर `WebhookVerificationException` throw करता है जो वैध और ताज़ा डिलीवरी न हो, और अन्यथा एक टाइप्ड webhook इवेंट लौटाता है।

```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 request के साथ, request को ही headers के रूप में पास करें। जब आप सीक्रेट बदल रहे हों, तो दोनों पास करें: `[$newSecret, $oldSecret]`। इवेंट और हस्ताक्षर स्कीम के लिए [Webhooks](https://docs.didit.me/hi/integration/webhooks.md) देखें।

## लेन-देन की स्क्रीनिंग करें

कोई भुगतान, निकासी या क्रिप्टो ट्रांसफ़र [लेन-देन निगरानी](https://docs.didit.me/hi/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";
```

## Authentication टोकन सत्यापित करें

`Authentication` आपके बैकएंड में, हर request के लिए Didit को कॉल किए बिना, उन access tokens की जाँच करता है जिन पर आपका [Authentication](https://docs.didit.me/hi/authentication/overview.md) issuer साइन करता है। issuer की keys एक बार ही लाई जाएँ, हर अनुरोध पर नहीं, इसके लिए PSR-16 cache पास करें। यह कोड का आदान-प्रदान करता है, टोकन रीफ़्रेश करता है, सत्रों की जाँच और उन्हें निरस्त करता है, और स्टेप-अप चलाता है।

> [!NOTE]
>
> टोकन सत्यापन [अपने सर्वर पर टोकन सत्यापित करें](https://docs.didit.me/hi/authentication/tokens-and-jwks.md#अपने-सर्वर-पर-टोकन-सत्यापित-करें) में दी गई जाँचें करता है, आपके एप्लिकेशन के issuer और signing keys के विरुद्ध।

```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());
```

[API reference](https://docs.didit.me/hi/api-reference/overview.md) के सर्वर endpoint पेजों में अपने ऑपरेशन के लिए PHP नमूना होता है, सिवाय उन endpoints और फ़ील्ड के जो अभी किसी भी 1.0.1 रिलीज़ में नहीं हैं; वे [अवलोकन](https://docs.didit.me/hi/integration/server-sdks/overview.md) में सूचीबद्ध हैं।


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