> ## 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 et Kotlin pour KYC, AML et transactions

> Intégrez le SDK Didit Java et Kotlin : builders typés pour les API, appels synchrones et asynchrones, vérification de webhooks et tokens.

La bibliothèque officielle Didit pour Java et Kotlin. Elle nécessite Java 11 ou une version ultérieure et dépend uniquement de `java.net.http`, Jackson et des annotations de nullabilité JSpecify. Chaque méthode dispose d'une variante `...Async` qui renvoie un `CompletableFuture`. Consultez la [vue d'ensemble des SDK serveur](https://docs.didit.me/fr/integration/server-sdks/overview.md) pour découvrir ce que partagent tous les SDK.

## Installation

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

L'artefact est [`me.didit:didit-java` sur Maven Central](https://central.sonatype.com/artifact/me.didit/didit-java). Son code source et son journal des modifications se trouvent dans [didit-protocol/sdk-java](https://github.com/didit-protocol/sdk-java) sur GitHub.

## Configurer le client

`new Didit()` lit `DIDIT_API_KEY` depuis l'environnement. Utilisez le builder pour la surcharger, ou pour définir les identifiants d'organisation et d'application requis par les appels à portée d'application (dossiers, réseaux, rapports réglementaires).

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

Les types de requête sont des builders dont le `build()` valide les champs obligatoires. Les champs de réponse optionnels sont des valeurs `Optional` ; en Kotlin, lisez-les avec `.getOrNull()`. Les extraits de code sur cette page et sur chaque page de la [référence API](https://docs.didit.me/fr/api-reference/overview.md) représentent le corps d'une méthode, précédé des imports nécessaires.

## Créer une session

Créez une [session de vérification](https://docs.didit.me/fr/sessions-api/create-session.md) pour un workflow et redirigez votre utilisateur vers son URL.

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

## Lire la décision

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

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

## Vérifier un webhook

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

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

Dans Spring Boot, récupérez le corps sous la forme `@RequestBody byte[] body` et les en-têtes sous la forme `@RequestHeader Map<String, String> headers`. Pour accepter deux secrets pendant que vous en renouvelez un, transmettez `VerifyOptions`. Consultez [Webhooks](https://docs.didit.me/fr/integration/webhooks.md) pour connaître les événements et le mécanisme de signature.

## Filtrer une transaction

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

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

## Vérifier les tokens Authentication

`Authentication` vérifie les tokens d'accès signés par votre émetteur d'[Authentication](https://docs.didit.me/fr/authentication/overview.md), dans votre backend, sans appeler Didit pour chaque requête. Il permet également d'échanger des codes, de rafraîchir des tokens, de vérifier et de révoquer des sessions, et d'effectuer des authentifications renforcées.

> [!NOTE]
>
> La vérification de token 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.

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

## Erreurs

Chaque exception hérite de l'exception non contrôlée `DiditException`.

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

## Listes et fichiers

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

Les pages des endpoints serveur de la [référence API](https://docs.didit.me/fr/api-reference/overview.md) proposent un exemple en Java pour leur opération, à l'exception des endpoints et des champs qu'aucune version 1.0.1 n'intègre encore, répertorié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.