> ## 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 untuk KYC, AML, dan Transaksi

> Panduan cepat SDK PHP resmi Didit: panggilan API server bertipe via klien HTTP PSR-18 apa pun, verifikasi webhook, dan cek token autentikasi.

Pustaka resmi Didit untuk PHP. Pustaka ini memerlukan PHP 8.1 atau yang lebih baru dan berfungsi dengan klien HTTP PSR-18 apa pun; Guzzle adalah pilihan yang umum. Lihat [ikhtisar SDK server](https://docs.didit.me/id/integration/server-sdks/overview.md) untuk hal-hal yang dimiliki semua SDK.

## Instal

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

Paketnya tersedia di [`didit-protocol/sdk-php` di Packagist](https://packagist.org/packages/didit-protocol/sdk-php). Sumber dan changelog-nya ada di [didit-protocol/sdk-php](https://github.com/didit-protocol/sdk-php) di GitHub.

Verifikasi token untuk [Authentication](#verifikasi-token-authentication) juga memerlukan ekstensi `openssl`.

## Konfigurasikan klien

`new DiditClient()` membaca `DIDIT_API_KEY` dari lingkungan. Berikan argumen bernama untuk menimpanya, atau untuk mengatur ID organisasi dan ID aplikasi yang dibutuhkan panggilan dengan cakupan aplikasi (kasus, jaringan, laporan regulasi). Kolom permintaan berupa satu array dengan nama kolom API itu sendiri; respons berupa objek hanya-baca dengan properti camelCase dan `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";
```

## Buat sesi

Buat [sesi verifikasi](https://docs.didit.me/id/sessions-api/create-session.md) untuk sebuah alur kerja dan arahkan pengguna Anda ke URL-nya.

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

## Baca keputusan

Ketika pengguna selesai (atau ketika webhook tiba), [baca keputusannya](https://docs.didit.me/id/sessions-api/retrieve-session.md). Setiap hasil fitur berupa daftar dengan satu entri per node alur kerja.

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

## Verifikasi webhook

Berikan isi mentah, persis seperti yang diterima, beserta header permintaan. `verify` melempar `WebhookVerificationException` untuk pengiriman apa pun yang tidak valid atau sudah tidak cukup baru, dan mengembalikan event bertipe jika valid.

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

Di Laravel dan Symfony, berikan `$request->getContent()` dan `$request->headers->all()`; dengan permintaan PSR-7, berikan permintaan itu sendiri sebagai header. Selama Anda merotasi rahasia, berikan keduanya: `[$newSecret, $oldSecret]`. Lihat [Webhooks](https://docs.didit.me/id/integration/webhooks.md) untuk event dan skema tanda tangan.

## Skrining transaksi

Kirimkan pembayaran, penarikan, atau transfer kripto ke [pemantauan transaksi](https://docs.didit.me/id/transaction-monitoring/overview.md); respons memuat status dan skor risikonya.

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

## Verifikasi token Authentication

`Authentication` memeriksa token akses yang ditandatangani oleh penerbit [Authentication](https://docs.didit.me/id/authentication/overview.md) Anda, di backend Anda, tanpa memanggil Didit untuk setiap permintaan. Berikan cache PSR-16 agar kunci milik penerbit hanya diambil sekali, bukan pada setiap permintaan. Kelas ini juga menukar kode, menyegarkan token, memeriksa dan mencabut sesi, serta menjalankan step-up.

> [!NOTE]
>
> Verifikasi token melakukan pemeriksaan yang dijelaskan dalam [Verifikasi token di server Anda](https://docs.didit.me/id/authentication/tokens-and-jwks.md#verifikasi-token-di-server-anda), terhadap penerbit aplikasi Anda dan kunci penandatanganannya.

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

## Kesalahan

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

## Daftar dan file

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

Halaman endpoint server di [referensi API](https://docs.didit.me/id/api-reference/overview.md) memiliki contoh PHP untuk operasinya, kecuali untuk endpoint dan kolom yang belum ada di rilis 1.0.1, yang disebutkan di [ikhtisar](https://docs.didit.me/id/integration/server-sdks/overview.md).


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