> ## 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 de PHP para KYC, AML y transacciones

> SDK oficial de PHP de Didit: llamadas tipadas a las API de servidor con cualquier cliente PSR-18, verificación de webhooks y tokens de autenticación.

La biblioteca oficial de Didit para PHP. Requiere PHP 8.1 o posterior y funciona con cualquier cliente HTTP PSR-18; Guzzle es la opción habitual. Consulta la [descripción general de los SDK de servidor](https://docs.didit.me/es/integration/server-sdks/overview.md) para ver lo que comparten todos los SDK.

## Instalación

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

El paquete es [`didit-protocol/sdk-php` en Packagist](https://packagist.org/packages/didit-protocol/sdk-php). Su código fuente y su registro de cambios están en [didit-protocol/sdk-php](https://github.com/didit-protocol/sdk-php) en GitHub.

La verificación de tokens para [Authentication](#verificar-tokens-de-authentication) también necesita la extensión `openssl`.

## Configurar el cliente

`new DiditClient()` lee `DIDIT_API_KEY` del entorno. Pase argumentos con nombre para sobrescribirla, o para indicar los ID de la organización y de la aplicación que necesitan las llamadas con ámbito de aplicación (casos, redes, informes regulatorios). Los campos de la solicitud son un único array con los nombres de campo propios de la API; las respuestas son objetos de solo lectura con propiedades en camelCase y `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";
```

## Crear una sesión

Crea una [sesión de verificación](https://docs.didit.me/es/sessions-api/create-session.md) para un workflow y envía a tu usuario a su 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";
```

## Leer la decisión

Cuando el usuario termine (o cuando llegue el webhook), [lee el resultado](https://docs.didit.me/es/sessions-api/retrieve-session.md). Cada resultado de función es una lista con una entrada por nodo del flujo.

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

## Verificar un webhook

Pasa el cuerpo sin procesar, exactamente como se recibió, y los encabezados de la solicitud. `verify` lanza `WebhookVerificationException` para cualquier cosa que no sea una entrega válida y reciente, y en caso contrario devuelve un evento tipado.

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

En Laravel y Symfony, pasa `$request->getContent()` y `$request->headers->all()`; con una solicitud PSR-7, pasa la propia solicitud como encabezados. Mientras rotas el secreto, pasa ambos: `[$newSecret, $oldSecret]`. Consulta [Webhooks](https://docs.didit.me/es/integration/webhooks.md) para ver los eventos y el esquema de firma.

## Analizar una transacción

Envía un pago, una retirada o una transferencia de criptomonedas a [monitorización de transacciones](https://docs.didit.me/es/transaction-monitoring/overview.md); la respuesta incluye su estado y su puntuación de riesgo.

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

## Verificar tokens de Authentication

`Authentication` comprueba en tu backend los tokens de acceso que firma tu emisor de [Authentication](https://docs.didit.me/es/authentication/overview.md), sin llamar a Didit en cada solicitud. Pasa una caché PSR-16 para que las claves del emisor se obtengan una sola vez, y no en cada solicitud. También intercambia códigos, renueva tokens, comprueba y revoca sesiones, y ejecuta step-ups.

> [!NOTE]
>
> La verificación de tokens realiza las comprobaciones descritas en [Verificar un token en tu servidor](https://docs.didit.me/es/authentication/tokens-and-jwks.md#verificar-un-token-en-tu-servidor), con el emisor y las claves de firma de tu aplicación.

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

## Errores

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

## Listas y archivos

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

Las páginas de endpoints de servidor de la [referencia de la API](https://docs.didit.me/es/api-reference/overview.md) incluyen un ejemplo en PHP para usarlos, salvo los endpoints y campos que todavía no están en ninguna versión 1.0.1, indicados en la [descripción general](https://docs.didit.me/es/integration/server-sdks/overview.md).


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