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

> Panduan cepat SDK resmi Didit untuk Java dan Kotlin: builder bertipe untuk API server, panggilan sinkron dan asinkron, verifikasi webhook, dan cek token.

Resmi Didit library untuk Java dan Kotlin. Library ini memerlukan Java 11 atau yang lebih baru, dan hanya bergantung pada `java.net.http`, Jackson, serta anotasi nullness JSpecify. Setiap metode memiliki varian `...Async` yang mengembalikan `CompletableFuture`. Lihat [ikhtisar SDK server](https://docs.didit.me/id/integration/server-sdks/overview.md) untuk hal-hal yang dimiliki bersama oleh setiap SDK.

## Instalasi

```kotlin Gradle theme={null}
implementation("me.didit:didit-java:1.0.1")
```

```xml Maven theme={null}
<dependency>
  <groupId>me.didit</groupId>
  <artifactId>didit-java</artifactId>
  <version>1.0.1</version>
</dependency>
```

Artefak ini tersedia di [`me.didit:didit-java` di Maven Central](https://central.sonatype.com/artifact/me.didit/didit-java). Kode sumber dan log perubahannya ada di [didit-protocol/sdk-java](https://github.com/didit-protocol/sdk-java) di GitHub.

## Mengonfigurasi klien

`new Didit()` membaca `DIDIT_API_KEY` dari lingkungan. Gunakan builder untuk menimpanya, atau untuk mengatur ID organisasi dan ID aplikasi yang dibutuhkan oleh panggilan dengan cakupan aplikasi (kasus, jaringan, laporan regulasi).

```java theme={null}
import java.time.Duration;
import me.didit.Didit;
import me.didit.core.RequestOptions;
import me.didit.types.SessionsRetrieveDecisionParams;

Didit client = Didit.builder()
        .apiKey(System.getenv("DIDIT_API_KEY"))
        .organizationId(System.getenv("DIDIT_ORGANIZATION_ID"))
        .applicationId(System.getenv("DIDIT_APPLICATION_ID"))
        .timeout(Duration.ofSeconds(30))
        .maxRetries(2)
        .build();

// Options for a single call.
var decision = client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555",
        SessionsRetrieveDecisionParams.builder().build(),
        RequestOptions.builder().timeout(Duration.ofSeconds(5)).build());
System.out.println(decision.status().orElse(null));
```

Tipe permintaan berupa builder yang `build()`-nya memeriksa kolom wajib. Kolom respons opsional berupa nilai `Optional`; di Kotlin, bacalah dengan `.getOrNull()`. Cuplikan di halaman ini dan di setiap halaman [Referensi API](https://docs.didit.me/id/api-reference/overview.md) adalah isi dari sebuah metode, dengan impor yang dibutuhkan di atasnya.

## Membuat sesi

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

```java theme={null}
import me.didit.Didit;
import me.didit.types.SessionsCreateParams;

Didit client = new Didit();

var session = client.sessions().create(SessionsCreateParams.builder()
        .workflowId("11111111-2222-3333-4444-555555555555")
        .vendorData("user-123")
        .callback("https://example.com/verification/done")
        .build());
System.out.println(session.url());
```

## Membaca 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 untuk setiap node alur kerja.

```java theme={null}
import java.util.List;
import me.didit.Didit;

Didit client = new Didit();

var decision = client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555");
decision.status().ifPresent(status -> System.out.println(status));
for (var verification : decision.idVerifications().orElse(List.of())) {
    System.out.println(verification.status().orElse(null));
}
```

## Memverifikasi webhook

Teruskan body mentah, persis seperti yang diterima, beserta header permintaan. `Webhooks.verify` melempar `WebhookVerificationException` untuk apa pun yang bukan pengiriman yang valid dan masih baru, dan mengembalikan event bertipe jika tidak.

```java theme={null}
import java.util.Map;
import me.didit.errors.WebhookVerificationException;
import me.didit.webhooks.SessionStatusUpdatedEvent;
import me.didit.webhooks.WebhookEvent;
import me.didit.webhooks.Webhooks;

public class DiditWebhookHandler {
    private final String secret = System.getenv("DIDIT_WEBHOOK_SECRET");

    public int handle(byte[] rawBody, Map<String, String> headers) {
        WebhookEvent event;
        try {
            event = Webhooks.verify(rawBody, headers, secret);
        } catch (WebhookVerificationException e) {
            System.out.println("rejected: " + e.reason());
            return 400;
        }
        if (event instanceof SessionStatusUpdatedEvent) {
            SessionStatusUpdatedEvent updated = (SessionStatusUpdatedEvent) event;
            System.out.println(updated.sessionId().orElse("") + " " + updated.status().orElse(""));
        }
        return 200;
    }
}
```

Di Spring Boot, ambil body sebagai `@RequestBody byte[] body` dan header sebagai `@RequestHeader Map<String, String> headers`. Untuk menerima dua rahasia selama Anda melakukan rotasi salah satunya, teruskan `VerifyOptions`. Lihat [Webhooks](https://docs.didit.me/id/integration/webhooks.md) untuk event dan skema tanda tangannya.

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

```java theme={null}
import me.didit.Didit;
import me.didit.types.TransactionsCreateParams;

Didit client = new Didit();

var transaction = client.transactions().create(TransactionsCreateParams.builder()
        .transactionId("txn-1001")
        .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
        .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                .amount(1500.0)
                .currency("EUR")
                .build())
        .subject(TransactionsCreateParams.Subject.builder()
                .entityType("individual")
                .vendorData("user-123")
                .fullName("Maria Garcia")
                .build())
        .build());
System.out.println(transaction.status().orElse(null) + " " + transaction.score().orElse(null));
```

## Memverifikasi 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. Kelas ini juga menukar kode, menyegarkan token, memeriksa dan mencabut sesi, serta menjalankan step-up.

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

```java theme={null}
import me.didit.authentication.AccessTokenClaims;
import me.didit.authentication.Authentication;
import me.didit.errors.TokenVerificationException;

public class CurrentUser {
    // The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
    private final Authentication auth = Authentication.builder()
            .publishableKey("pk_live_...")
            .clientId("your-application-id")
            .build();

    public String subject(String accessToken) {
        try {
            AccessTokenClaims claims = auth.verifyAccessToken(accessToken);
            return claims.subject();
        } catch (TokenVerificationException e) {
            System.out.println("rejected: " + e.reason());
            return null;
        }
    }
}
```

## Galat

Setiap pengecualian merupakan turunan dari `DiditException` yang tidak diperiksa.

```java theme={null}
import me.didit.Didit;
import me.didit.errors.ApiStatusException;
import me.didit.errors.NotFoundException;

Didit client = new Didit();

try {
    client.sessions().retrieveDecision("11111111-2222-3333-4444-555555555555");
} catch (NotFoundException e) {
    System.out.println("no such session");
} catch (ApiStatusException e) {
    System.out.println(e.statusCode() + " " + e.requestId().orElse(""));
}
```

## Daftar dan berkas

```java theme={null}
import java.nio.file.Path;
import me.didit.Didit;
import me.didit.types.IdVerificationVerifyParams;
import me.didit.types.SessionsListParams;

Didit client = new Didit();

// Lists page through every result.
for (var session : client.sessions().list(SessionsListParams.builder().status("Approved").build())) {
    System.out.println(session);
}

// Uploads take a Path or a FileUpload (bytes or a stream).
var result = client.idVerification().verify(IdVerificationVerifyParams.builder()
        .frontImage(Path.of("id-front.jpg"))
        .backImage(Path.of("id-back.jpg"))
        .build());
System.out.println(result);
```

Halaman endpoint server di [Referensi API](https://docs.didit.me/id/api-reference/overview.md) memiliki contoh Java untuk operasinya, kecuali endpoint dan kolom yang belum ada di rilis 1.0.1 mana pun, 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.