> ## 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 Didit : KYC, AML et transactions

> Démarrez avec le SDK PHP officiel de Didit : appels typés aux API serveur, vérification des webhooks et tokens d'authentification.

La bibliothèque officielle de Didit pour PHP. Elle nécessite PHP 8.1 ou une version ultérieure et fonctionne avec n'importe quel client HTTP compatible PSR-18 ; Guzzle est le choix le plus courant. Consultez la [vue d'ensemble des SDK serveur](https://docs.didit.me/fr/integration/server-sdks/overview.md) pour connaître les éléments communs à tous les SDK.

## Installation

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

Le package est [`didit-protocol/sdk-php` sur Packagist](https://packagist.org/packages/didit-protocol/sdk-php). Son code source et son journal des modifications se trouvent dans [didit-protocol/sdk-php](https://github.com/didit-protocol/sdk-php) sur GitHub.

La vérification des tokens pour [Authentication](#vérifier-les-tokens-d’authentication) nécessite également l'extension `openssl`.

## Configurer le client

`new DiditClient()` lit `DIDIT_API_KEY` depuis l'environnement. Passez des arguments nommés pour le remplacer, ou pour définir les identifiants de l'organisation et de l'application dont ont besoin les appels rattachés à une application (dossiers, réseaux, rapports réglementaires). Les champs de requête sont un tableau unique utilisant les noms de champs de l'API ; les réponses sont des objets en lecture seule aux propriétés en camelCase et disposent de `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";
```

## Créer une session

Créez une [session de vérification](https://docs.didit.me/fr/sessions-api/create-session.md) pour un workflow, puis envoyez votre utilisateur à son 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";
```

## Lire la décision

Lorsque l'utilisateur a terminé (ou lorsque le webhook arrive), [lisez la décision](https://docs.didit.me/fr/sessions-api/retrieve-session.md). Chaque résultat de fonctionnalité est une liste comportant une entrée par nœud du workflow.

```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";
}
```

## Vérifier un webhook

Transmettez le corps brut, tel que reçu, ainsi que les en-têtes de la requête. `verify` lève `WebhookVerificationException` pour toute livraison qui n'est pas valide et récente, et renvoie un événement typé dans le cas contraire.

```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'),
));
```

Dans Laravel et Symfony, transmettez `$request->getContent()` et `$request->headers->all()` ; avec une requête PSR-7, transmettez la requête elle-même comme en-têtes. Pendant la rotation du secret, transmettez les deux : `[$newSecret, $oldSecret]`. Consultez [Webhooks](https://docs.didit.me/fr/integration/webhooks.md) pour les événements et le schéma de signature.

## Filtrer une transaction

Soumettez un paiement, un retrait ou un transfert de cryptoactifs à la [surveillance des transactions](https://docs.didit.me/fr/transaction-monitoring/overview.md) ; la réponse contient son statut et son score de risque.

```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";
```

## Vérifier les tokens d'Authentication

`Authentication` contrôle les tokens d'accès signés par votre émetteur [Authentication](https://docs.didit.me/fr/authentication/overview.md), dans votre backend, sans appeler Didit pour chaque requête. Transmettez un cache PSR-16 pour que les clés de l'émetteur ne soient récupérées qu'une seule fois, et non à chaque requête. Cette classe permet également d'échanger des codes, de rafraîchir des tokens, de contrôler et de révoquer des sessions, et d'exécuter des vérifications renforcées.

> [!NOTE]
>
> La vérification des tokens effectue les contrôles décrits dans [Vérifier un token sur votre serveur](https://docs.didit.me/fr/authentication/tokens-and-jwks.md#vérifier-un-jeton-sur-votre-serveur), par rapport à l'émetteur et aux clés de signature de votre application.

```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;
}
```

## Erreurs

```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";
}
```

## Listes et fichiers

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

Les pages des endpoints serveur de la [référence API](https://docs.didit.me/fr/api-reference/overview.md) comportent un exemple PHP pour leur opération, à l'exception des endpoints et des champs qu'aucune version 1.0.1 ne propose encore, mentionnés dans la [vue d'ensemble](https://docs.didit.me/fr/integration/server-sdks/overview.md).


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