> ## 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クライアントでサーバーAPIを型付きで呼び出せます。Webhook検証と認証トークンの確認にも対応しています。

DiditのPHP向け公式ライブラリです。PHP 8.1以降が必要で、PSR-18準拠のHTTPクライアントであればどれでも利用できます。一般的にはGuzzleを使います。すべてのSDKに共通する内容は[サーバーSDKの概要](https://docs.didit.me/ja/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`を読み込みます。名前付き引数を渡すと、この値を上書きできます。アプリケーション単位の呼び出し（ケース、ネットワーク、規制レポート）に必要な組織IDとアプリケーションIDも、名前付き引数で設定します。リクエストのフィールドは、API自体のフィールド名を使った1つの配列で指定します。レスポンスは、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/ja/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/ja/sessions-api/retrieve-session.md)。各機能の結果はリストで、ワークフローのノードごとに1件のエントリが含まれます。

```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]`のように両方を渡します。イベントと署名方式については[Webhook](https://docs.didit.me/ja/integration/webhooks.md)を参照してください。

## 取引をスクリーニングする

決済、出金、暗号資産の送金を[トランザクションモニタリング](https://docs.didit.me/ja/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`は、[Authentication](https://docs.didit.me/ja/authentication/overview.md)の発行者が署名したアクセストークンを、リクエストごとにDiditを呼び出すことなく、バックエンドで検証します。PSR-16キャッシュを渡すと、発行者の鍵はリクエストのたびではなく、一度だけ取得されます。また、コードの交換、トークンのリフレッシュ、セッションの確認と取り消し、ステップアップの実行も行います。

> [!NOTE]
>
> トークン検証では、アプリケーションの発行者と署名鍵に対して、[サーバーでトークンを検証する](https://docs.didit.me/ja/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());
```

[APIリファレンス](https://docs.didit.me/ja/api-reference/overview.md)のサーバーエンドポイントの各ページには、各操作を行うPHPのサンプルがあります。ただし、[概要](https://docs.didit.me/ja/integration/server-sdks/overview.md)に記載されている、まだどの1.0.1リリースにも含まれていないエンドポイントとフィールドは除きます。


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