> For the complete documentation index, see [llms.txt](https://docs.complycube.com/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.complycube.com/documentation/sdks/sdks-fr/integrations-mobiles/sdk-android/integration-guidee-par-les-verifications.md).

# Intégration guidée par les vérifications

## Vue d'ensemble

Ce guide vous guide à travers l’intégration du **SDK Android** avec ComplyCube en utilisant l’approche basée sur les contrôles, vous donnant un contrôle direct sur les étapes de vérification individuelles.

<figure><img src="/files/6483733adb6cbbdd3b802c4402bb528629b9c5b4" alt=""><figcaption><p>Vue du SDK mobile</p></figcaption></figure>

{% hint style="warning" %}
Vous consultez le **piloté par des vérifications** guide SDK - une approche qui offre un contrôle détaillé mais qui convient mieux aux **partenaires** ou **cas d’utilisation avancés.**  Nous recommandons d’utiliser **l’intégration des flux de travail** pour la plupart des implémentations.
{% endhint %}

## Flux d'intégration

Le SDK mobile s’exécute dans votre application mobile, mais s’appuie sur votre backend pour créer **des jetons sécurisés**. Voici comment cela fonctionne :

{% stepper %}
{% step %}

#### **Créer un client**

Enregistrez un nouveau **client** (c.-à-d. client) à l’aide de l’API ComplyCube.
{% endstep %}

{% step %}

#### **Générez un jeton SDK**

Votre backend demande un **jeton JWT** lié à ce client.
{% endstep %}

{% step %}

#### Initialisez le SDK dans votre application mobile

Passez le jeton et les paramètres à l’initialiseur du SDK.
{% endstep %}

{% step %}

#### Capturez des documents, des vidéos et des selfies

Le SDK guide votre client à travers les étapes requises.
{% endstep %}

{% step %}

#### Effectuez des vérifications

Les données capturées sont envoyées en toute sécurité à ComplyCube pour les vérifications, et les résultats sont fournis en temps réel via l’API ou les webhooks.
{% endstep %}
{% endstepper %}

<figure><img src="/files/e73166f67b13a0aff209fd48ef5a958e5b0f9d9b" alt=""><figcaption><p>Flux d’intégration du SDK mobile</p></figcaption></figure>

## Guide d'intégration

Explorez le code source et les projets d’exemple dans notre dépôt : [![GitHub](https://img.shields.io/badge/View%20on-GitHub-black?logo=github)](https://github.com/complycube/complycube-android-sdk).<br>

{% stepper %}
{% step %}

#### Installer le SDK

Notre SDK nécessite les dépôts ci-dessous.

```java
repositories {
  mavenCentral()
}

dependencies {
    implementation "com.complycube:complycube-sdk:+"
}
```

{% endstep %}

{% step %}

#### **Créer un client**

Chaque parcours de vérification commence par un **client** (c.-à-d. le client). Utilisez l’API pour [créer le client](/documentation/api-reference/core-resources/clients/create-a-client.md).

Cela doit être fait sur votre **backend de l’application mobile** serveur, et non dans l’application mobile elle-même.

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/clients \
     -H 'Authorization: <YOUR_API_KEY>' \
     -H 'Content-Type: application/json' \
     -d '{
          "type": "person",
          "email": "john.doe@example.com",
          "personDetails":{
               "firstName": "John",
               "lastName" :"Doe"
          }
        }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const client = await complycube.client.create({
  type: "person",
  email: "john.doe@example.com",
  personDetails: {
    firstName: "John",
    lastName: "Doe"
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient
cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

new_client = {
    'type':'person',
    'email':'john.doe@example.com',
    'personDetails': {
        'firstName':'John',
        'lastName':'Doe'
    }
}

client = cc_api.clients.create(**new_client)
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$result = $ccapi->clients()->create([
    'type' => 'person',
    'email' => 'john@doe.com',
    'personDetails' => [
        'firstName' => 'John',
        'lastName' => 'Doe'
    ]
]);
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Clients;

var clientApi = new ClientApi(new ComplyCubeClient("<YOUR_API_KEY>"));
var newClient = new ClientRequest {
  type = "person",
  email = "john@doe.com",
  personDetails = new PersonDetails {
    firstName = "John",
    lastName = "Doe"
  }
}

var client = await clientApi.CreateAsync(newClient);
```

{% endtab %}
{% endtabs %}

**Exemple de réponse**

La réponse contiendra un `id` (l’ID du client). Il est requis pour l’étape suivante.

```json
{
    "id": "5eb04fcd0f3e360008035eb1",
    "type": "person",
    "email": "john.doe@example.com",
    "personDetails": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "createdAt": "2020-01-04T17:24:29.146Z",
    "updatedAt": "2020-01-04T17:24:29.146Z"
}
```

{% hint style="info" %}
Voir [Référence de l’API Clients](/documentation/api-reference/core-resources/clients.md) pour en savoir plus.
{% endhint %}
{% endstep %}

{% step %}

#### Générez un jeton SDK

Votre backend doit créer un **jeton SDK** pour chaque nouveau flux. Ce jeton permet aux clients d’envoyer des données personnelles en toute sécurité depuis votre application mobile vers ComplyCube.

Les jetons ont une courte durée de vie et ne doivent pas être réutilisés.

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/tokens \\
     -H 'Authorization: <YOUR_API_KEY>' \\
     -H 'Content-Type: application/json' \\
     -d '{
           "clientId":"CLIENT_ID",
           "appId": "com.complycube.SampleApp"
         }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");
​
const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });
​
const token = await complycube.token.generate("CLIENT_ID", {
    appId: "com.complycube.SampleApp"
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient
​
cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')
​
token = cc_api.tokens.create('CLIENT_ID', appId='com.complycube.SampleApp')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$token = $ccapi->tokens()->generate('CLIENT_ID', 'com.complycube.SampleApp');
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.SDKTokens;

var sdkTokenApi = new SDKTokenApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var sdkTokenRequest = {
  clientId = "CLIENT_ID",
  appId = "com.complycube.SampleApp"
}

var sdkToken = await sdkTokenApi.GenerateToken(sdkTokenRequest);
```

{% endtab %}
{% endtabs %}

**Exemple de réponse**

```json
{
    "token": "<CLIENT_TOKEN>"
}
```

{% hint style="info" %}
Voir [Référence de l'API du jeton SDK](/documentation/api-reference/other-resources/tokens.md) pour en savoir plus.
{% endhint %}
{% endstep %}

{% step %}

#### Préparez les étapes

Configurez les étapes que vous souhaitez inclure dans votre flux.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
val complyCubeBuilder = ComplyCubeSdk.Builder(this, callback =  { }).apply {
    withStages(
        Document(
            identityDocumentType = Passport(), DrivingLicence(),
            useLiveCaptureOnly = false
        ),
        SelfiePhoto()
    )
}
```

{% endtab %}

{% tab title="Java" %}

```java
IdentityDocumentType[] identityDocumentTypes;

identityDocumentTypes = new IdentityDocumentType[1];

identityDocumentTypes[0] = new DrivingLicence();

Document document = new Document(
    // type de document
    null,
    // types de documents
    identityDocumentTypes,
    // guidage activé
    true,
    // capture en direct uniquement
    false,
    // assistance ML activée
    true,
    // limite de tentatives
    5,
    // NFC activé
    true
);
```

{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

#### Initialiser le SDK

Vous pouvez maintenant initialiser un flux. La séquence d’étapes que vous spécifiez détermine l’ordre dans lequel votre client voit ces étapes.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
val complyCubeBuilder = ComplyCubeSdk.Builder(this, callback =  { }).apply {
    withStages(
        Document(
            identityDocumentType = Passport(), DrivingLicence(),
            useLiveCaptureOnly = false
        ),
        SelfiePhoto()
    )
}.start(
    ClientAuth(
        token = "SDK_TOKEN",
        clientId = "CLIENT_ID"
    )
)
```

{% endtab %}

{% tab title="Java" %}

```java
ComplyCubeSdk.Builder complycubeFlow =
    new ComplyCubeSdk.Builder(this, result - > {});

complycubeFlow.withStages(
    document,
    new SelfiePhoto()
);

complycubeFlow.start(new ClientAuth(
    "SDK_TOKEN",
    "CLIENT_ID"
));
```

{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

#### Effectuer des vérifications

En utilisant les `StageResults` renvoyés par le flux, vous pouvez déclencher votre **backend mobile** afin d’exécuter les contrôles nécessaires sur votre client.

Par exemple, utilisez le résultat d’une capture de selfie et de document comme suit :

* `StageResult.Document.Id` pour lancer une [Contrôle du document](https://docs.complycube.com/api-reference/check-types/document-check).
* `StageResult.Document.Id` et `StageResult.LivePhoto.Id` pour lancer une [Contrôle d’identité](https://docs.complycube.com/api-reference/check-types/identity-check).

**Exemple de requête pour un contrôle du document**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/checks \
     -H 'Authorization: <YOUR_API_KEY>' \\
     -H 'Content-Type: application/json' \\
     -d '{
            "clientId":"CLIENT_ID",
            "type": "document_check",
            "documentId":"DOCUMENT_ID"
         }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const check = await complycube.check.create("CLIENT_ID", {
    type: "document_check",
    documentId: "DOCUMENT_ID"
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

check = cc_api.checks.create(
    "CLIENT_ID", 
    "document_check", 
    documentId="DOCUMENT_ID"
)
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$result = $ccapi->checks()->create('CLIENT_ID', [
    'type' => 'document_check',
    'documentId' => 'DOCUMENT_ID'
]);
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Checks;

var checkApi = new CheckApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var checkRequest = new CheckRequest {
  clientId = "CLIENT_ID",
  type = "document_check",
  documentId = "DOCUMENT_ID"
};

var check = await checkApi.CreateAsync(checkRequest);
```

{% endtab %}
{% endtabs %}

Si vous avez [configuré des webhooks](https://docs.complycube.com/api-reference/other-resources/webhooks/create-a-webhook) comme décrit dans notre [guide des webhooks](https://docs.complycube.com/documentation/guides/webhooks), vous serez informé lorsqu'une vérification sera terminée.

Pour récupérer les résultats de la vérification, vous pouvez effectuer une requête GET [requête de vérification](https://docs.complycube.com/api-reference/checks/get-a-check).
{% endstep %}

{% step %}

#### Récupérer les résultats de vérification

Votre backend mobile peut récupérer tous les résultats de contrôle à l’aide de notre API.

Tous nos contrôles sont **asynchrones.** Si vous avez [configuré des webhooks](https://docs.complycube.com/api-reference/other-resources/webhooks/create-a-webhook) comme décrit dans notre [guide des webhooks](https://docs.complycube.com/documentation/guides/webhooks), vous serez informé lorsqu'une vérification sera terminée.

Pour récupérer les résultats de la vérification, vous pouvez effectuer une requête GET [requête de vérification](https://docs.complycube.com/api-reference/checks/get-a-check).

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET https://api.complycube.com/v1/checks/{:checkId} \\
     -H 'Authorization: <YOUR_API_KEY>' 
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const check = await complycube.check.get("CHECK_ID");
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

check = cc_api.checks.get('CHECK_ID')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$check = $ccapi->checks()->get('CHECK_ID');
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Checks;

var checkApi = new CheckApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var check = await checkApi.GetAsync("CHECK_ID");
```

{% endtab %}
{% endtabs %}
{% endstep %}
{% endstepper %}

## Étapes

Chaque étape du flux peut être personnalisée pour créer le parcours idéal pour vos clients.

L’extrait ci-dessous montre comment configurer un flux personnalisé à l’aide du SDK mobile ComplyCube.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var complycubeFlow = ComplyCubeSdk.Builder(this, callback = ...)
  .withSDKToken("SDK_Token")
  .withClientId("CLIENT_ID")
  .withStages(
    Welcome(...),
    Consent(...),
    Document(...),
    SelfiePhoto(...),
    AddressCapture(...),
    ProofOfAddress(...),
    Complete(...)
  )
  .withLookAndFeel(...)
  .withCustomLanguage(...)

complycubeFlow.start()
```

{% endtab %}

{% tab title="Java" %}

```java
complycubeFlow.withStages(
    new Welcome(...),
    new UserConsent(...),
    new Document(...),
    new SelfiePhoto(...),
    new AddressCapture(...),
    new ProofOfAddress(...),
    new Complete(...)
);

complycubeFlow.withLookAndFeel(...);
complycubeFlow.withCustomLanguage(..);
```

{% endtab %}
{% endtabs %}

### **Bienvenue**

L’écran de bienvenue est toujours affiché en premier dans le processus de vérification. Il affiche un message de bienvenue ainsi qu’un résumé des étapes configurées que l’utilisateur devra compléter.

Vous pouvez personnaliser le titre de l’écran pour l’aligner sur le ton et l’identité visuelle de votre application.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var welcomeStage = Welcome(
    title = "Titre d'écran personnalisé",
    message = "Message de bienvenue personnalisé."
)
```

{% endtab %}

{% tab title="Java" %}

```java
 Welcome welcome = new Welcome(
     "Titre d'écran personnalisé",
     "Message de bienvenue personnalisé",
     null
 );
```

{% endtab %}
{% endtabs %}

### **Consentement**

Cette étape sert à recueillir le consentement explicite de l’utilisateur avant de poursuivre le flux de vérification. Elle vous aide à répondre aux exigences réglementaires et de conformité, le cas échéant.

Vous pouvez personnaliser le titre de l’écran et le message pour les adapter à vos besoins juridiques ou à votre identité de marque.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var consentStage = Consent(
    title = "Titre d'écran de consentement personnalisé"
)
```

{% endtab %}

{% tab title="Java" %}

```java
UserConsent userConsent = new UserConsent(
    "Titre d'écran de consentement personnalisé",
    null,
    null
);
```

{% endtab %}
{% endtabs %}

### **Photo et vidéo de selfie**

Vous pouvez demander soit une photo selfie (c.-à-d. une [Photo en direct](/documentation/api-reference/core-resources/live-photos.md)) ou une vidéo selfie (c.-à-d. une [Vidéo en direct](/documentation/api-reference/core-resources/live-videos.md)) du client dans le cadre du processus de vérification biométrique.

* **Photo**: Capture une image fixe et effectue une vérification passive de la vivacité avant d’autoriser l’envoi.
* **Vidéo**: Enregistre une courte vidéo où l’utilisateur effectue un défi affiché à l’écran (par ex. un mouvement de tête ou une phrase à prononcer).

{% hint style="warning" %}
Si vous essayez d’ajouter les deux types d’étapes, le SDK lèvera une **`ComplyCubeErrorCode.BiometricStageCount`** erreur indiquant la présence de plusieurs étapes incompatibles.
{% endhint %}

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var selfiePhoto = SelfiePhoto(
    // Activez l’assistance ML pendant la capture
    isMLAssistantEnabled = false
)
```

{% endtab %}

{% tab title="Java" %}

```java
SelfiePhoto selfiePhoto = new SelfiePhoto(
    // guidage activé
    true,
    // capture en direct uniquement
    true,
    // assistance ML activée
    false,
    // limite de tentatives
    5
);
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var selfieVideo = SelfieVideo(
    // Activez l’assistance ML pendant la capture
    isMLAssistantEnabled = false
)
```

{% endtab %}

{% tab title="Java" %}

```java
 SelfieVideo selfieVideo = new SelfieVideo(
     // guidage activé
     true,
     // assistance ML activée
     false,
     // limite de tentatives
     5
 );
```

{% endtab %}
{% endtabs %}

### **Document**

L’étape Document permet aux utilisateurs de sélectionner et de capturer un document d’identité à des fins de vérification (par exemple, passeport, carte d’identité, permis de séjour). Vous pouvez personnaliser ces écrans pour :

* Limiter la portée des types de documents que le client peut sélectionner, par exemple, passeport uniquement.
* Définir les pays émetteurs de documents autorisés pour chaque type de document.
* Ajouter ou supprimer la capture automatisée à l’aide d’une assistance intelligente.
* Afficher ou masquer les écrans d’instructions avant la capture.
* Définir une limite de tentatives afin de permettre aux clients de poursuivre le parcours, quelle que soit la qualité de la capture.

{% hint style="info" %}
Si vous fournissez un seul type de document, l’écran de sélection du type de document sera ignoré. L’écran de sélection du pays sera ignoré si vous fournissez un seul pays pour un type de document donné.
{% endhint %}

Vous pouvez contrôler si des écrans d’instructions sont affichés avant chaque capture par caméra en activant ou en désactivant le mode d’assistance. Ne désactivez le mode d’assistance que si vos utilisateurs sont déjà clairement informés des étapes de capture, car ces écrans contribuent à réduire les erreurs des utilisateurs et à améliorer la qualité de la capture.

{% hint style="info" %}
Veuillez noter que le `retryLimit` que vous définissez ici aura priorité sur la limite de tentatives qui a été définie globalement dans vos [paramètres d’automatisation](https://portal.complycube.com/automations).
{% endhint %}

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var documentStage = Document(
    // Définissez les types de documents et limitez les pays activés
    Passport(), DrivingLicence((Country.GB, Country.US)),

    // Activez ou désactivez des conseils supplémentaires pour l’utilisateur
    isGuidanceEnabled = true,

    // Activez ou désactivez la possibilité de téléverser une image depuis un fichier
    useLiveCaptureOnly = true,

    // Activez l’assistance ML pendant la capture
    isMLAssistantEnabled = true,
    
    // Définir un maximum de tentatives de contrôle qualité avant le téléversement des contrôles souples
    retryLimit = 3
)
```

{% endtab %}

{% tab title="Java" %}

```java
IdentityDocumentType[] identityDocumentTypes;

identityDocumentTypes = new IdentityDocumentType[1];

identityDocumentTypes[0] = new DrivingLicence();

Document document = new Document(
    null,
    identityDocumentTypes, // types de documents
    true, // guidage activé
    false, // capture en direct uniquement
    true, // assistance ML activée
    5, // limite de tentatives
    true // NFC activé
);
```

{% endtab %}
{% endtabs %}

### Capture NFC

Le SDK mobile ComplyCube prend en charge la lecture basée sur la NFC **puce RFID** des documents d'identité équipés de puces intégrées. Cela permet une extraction sécurisée des données et une authentification documentaire hautement fiable.

{% hint style="info" %}
Veuillez contacter votre **Responsable de compte** ou [service d’assistance](https://support.complycube.com/hc/en-gb/requests/new) pour accéder à notre SDK mobile compatible NFC.
{% endhint %}

#### Prérequis

1. Commencez par ajouter vos identifiants d’accès au dépôt du SDK ComplyCube compatible NFC dans le `gradle.properties` fichier de votre **application mobile**:

```gradle
artifactory_user= "USERNAME"
artifactory_password= "ENCRYPTED PASS"
artifactory_contextUrl= https://complycuberepo.jfrog.io/artifactory
```

2. Ensuite, mettez à jour le fichier de niveau projet `build.gradle` avec les paramètres Maven du dépôt du SDK ComplyCube :

```gradle
buildscript {
    repositories {
        ...
    }
    dependencies {
        ....
        // Vérifiez ici la dernière version : 
        // http://plugins.gradle.org/plugin/com.jfrog.artifactory
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4+"
    }
    ...
}

allprojects {
    apply plugin: "com.jfrog.artifactory"
    ...
}

artifactory {
  contextUrl = "${artifactory_contextUrl}"  
  resolve {
    repository {
      repoKey = 'cc-gradle-release'
      username = "${artifactory_user}"
      password = "${artifactory_password}"
      maven = true
    }
  }
}
```

3. Mettez à jour le fichier de niveau module `build.gradle` avec la dépendance SDK :

```gradle
dependencies {
    implementation "com.complycube:complycube-sdk:+"
    implementation "com.complycube:nfc-plugin:+"
}
```

#### Activation de la capture NFC

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var documentStage = Document(
    // Ajoutez cette propriété pour activer NFC
    isNFCEnabled = true,
)
```

{% endtab %}

{% tab title="Java" %}

```java
IdentityDocumentType[] identityDocumentTypes;

identityDocumentTypes = new IdentityDocumentType[1];

identityDocumentTypes[0] = new Passport();

Document document = new Document(
    null,
    // types de documents
    identityDocumentTypes,
    // guidage activé
    true,
    // capture en direct uniquement
    false,
    // assistance ML activée
    true,
    // limite de tentatives
    5,
    // NFC activé
    true
);
```

{% endtab %}
{% endtabs %}

### **Capture d’adresse**

Cette étape permet aux utilisateurs de saisir manuellement leur adresse résidentielle. Vous pouvez la personnaliser pour :

* Restreindre la saisie à des pays spécifiques
* Activer ou désactiver la fonction de saisie semi-automatique de l’adresse pour une saisie plus rapide et plus précise

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
var addressCaptureStage = AddressCapture(
    // Cela active l'autocomplétion d'adresse
    useAutoComplete = true,
    
    // Une liste de pays acceptables pour la fonctionnalité de saisie d'adresse
    allowedCountries = setOf(Country.GB,Country.US)
)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
Set<Country> countries = new HashSet<> ();

countries.add(Country.GB);
countries.add(Country.US);

AddressCapture addressCapture = new AddressCapture(
    // useAutoComplete
    true,
    // pays autorisés
    countries
);
```

{% endtab %}
{% endtabs %}

### **Justificatif de domicile**

Cette étape permet aux clients de soumettre un document vérifiant leur adresse de résidence. Vous pouvez configurer les types de documents acceptés, comme les factures de services publics ou les relevés bancaires, et choisir si les clients peuvent téléverser un fichier ou doivent capturer le document en direct à l’aide de la caméra de leur appareil.

{% hint style="info" %}
Par défaut, cette étape inclut le **étape de capture de l’adresse** avec l’autocomplétion activée pour aider les utilisateurs lors de la saisie. L’autocomplétion peut être désactivée si elle n’est pas nécessaire.
{% endhint %}

{% tabs %}
{% tab title="Kotlin" %}
{% code fullWidth="false" %}

```kotlin
var poaStage = ProofOfAddress(
    // Une liste de types de documents pris en charge pouvant être soumis
    UtilityBill(), BankStatement(),

    // Lorsqu’elle est désactivée, le client sera contraint d’effectuer une capture en direct
    useLiveCaptureOnly = false,

    // Cela active la saisie d'adresse pendant le flux de justificatif de domicile
    isAddressCaptureEnabled = false
    ...
)
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}

```java
LinkedHashSet<ProofOfAddressDocumentType> documentTypes =
    new LinkedHashSet<ProofOfAddressDocumentType> ();

documentTypes.add(new UtilityBill());
documentTypes.add(new BankStatement());

ProofOfAddress poaStage = new ProofOfAddress(
    documentTypes,
    // guidage activé
    true,
    // capture en direct uniquement
    false,
    // assistance ML activée
    true,
    // limite de tentatives
    5,
    // saisie d'adresse activée
    false
);
```

{% endtab %}
{% endtabs %}

### **Finalisation**

Vous pouvez inclure une étape de finalisation à la fin du flux afin de confirmer que le processus s’est terminé avec succès. Cet écran offre à l’utilisateur un point de fin clair et peut être personnalisé pour afficher un message de confirmation ou les étapes suivantes.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
val completionStage = Complete(
    title = "Merci !",
    message = "Votre soumission KYC a été finalisée"
)
```

{% endtab %}

{% tab title="Java" %}

```java
Complete complete = new Complete(
    "Titre de fin personnalisé",
    "Message de fin personnalisé",
    null
);
```

{% endtab %}
{% endtabs %}

## Branding

Le SDK vous permet de personnaliser l’interface utilisateur pour l’aligner sur l’identité visuelle de votre application. Vous pouvez définir les couleurs principales et d’accentuation lors de la configuration afin d’aligner le flux de vérification sur les lignes directrices de votre marque. En savoir plus sur nos **propriétés d’apparence** (voir ci-dessous).

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
complycubeFlow.withLookAndFeel(
    lookAndFeel = LookAndFeel(
        primaryButtonBgColor = Color.RED,
        /* Peut également être défini sur UIInterfaceStyle.LIGHT 
        ou UIInterfaceStyle.INHERITED */
        uiInterfaceStyle = UIInterfaceStyle.DARK
    )
)
```

{% endtab %}

{% tab title="Java" %}

```java
complycubeFlow.withLookAndFeel(new LookAndFeel(
    // couleur de fond du bouton principal
    Color.parseColor("#FF0000"),
    // style de l'interface utilisateur
    UIInterfaceStyle.DARK,
    ...
));
```

{% endtab %}
{% endtabs %}

<details>

<summary>Propriétés d’apparence</summary>

<table><thead><tr><th width="371.70703125">Propriété d’apparence</th><th>Description</th></tr></thead><tbody><tr><td><code>primaryButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton d’action principal.</td></tr><tr><td><code>primaryButtonTextColor</code></td><td>Couleur du texte du bouton d’action principal.</td></tr><tr><td><code>primaryButtonBorderColor</code></td><td>Couleur de la bordure du bouton d’action principal.</td></tr><tr><td><code>secondaryButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton secondaire.</td></tr><tr><td><code>secondaryButtonPressedBgColor</code></td><td>Couleur d’arrière-plan du bouton d’action secondaire enfoncé.<br><br><em>Non pris en charge par Android.</em></td></tr><tr><td><code>secondaryButtonTextColor</code></td><td>Couleur du texte du bouton d’action secondaire.</td></tr><tr><td><code>secondaryButtonBorderColor</code></td><td>Couleur de la bordure du bouton d’action secondaire.</td></tr><tr><td><code>documentTypeSelectorBgColor</code></td><td>Couleur du bouton de sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorBorderColor</code></td><td>Couleur de la bordure du bouton de sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorTitleTextColor</code></td><td>Couleur du texte du titre de la sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorDescriptionTextColor</code></td><td>Couleur du texte de description de la sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorIconColor</code></td><td>Couleur de l’icône de sélection du type de document.</td></tr><tr><td><code>bodyTextColor</code></td><td>Couleur du texte du corps de l’écran.</td></tr><tr><td><code>linkButtonTextColor</code></td><td>Couleur des liens.<br><br><em>Non pris en charge par Android.</em></td></tr><tr><td><code>headingTextColor</code></td><td>Couleur du texte du titre.</td></tr><tr><td><code>subheadingTextColor</code></td><td>Couleur du texte du sous-titre.</td></tr><tr><td><code>infoPanelTitleColor</code></td><td>Couleur du titre du panneau d’informations.</td></tr><tr><td><code>infoPanelDescriptionTextColor</code></td><td>Couleur du texte de description du panneau d’informations.</td></tr><tr><td><code>infoPanelBgColor</code></td><td>Couleur d’arrière-plan du panneau d’informations.</td></tr><tr><td><code>infoPanelIconColor</code></td><td>Couleur de l’icône du panneau d’informations.</td></tr><tr><td><code>errorPanelTitleColor</code></td><td>Couleur du titre du panneau d’erreur.</td></tr><tr><td><code>errorPanelDescriptionTextColor</code></td><td>Couleur du texte de description du panneau d’erreur.</td></tr><tr><td><code>errorPanelBgColor</code></td><td>Couleur d’arrière-plan du panneau d’erreur.</td></tr><tr><td><code>errorPanelIconColor</code></td><td>Couleur de l’icône du panneau d’erreur.</td></tr><tr><td><code>cameraButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton de capture de la caméra.</td></tr><tr><td><code>uiInterfaceStyle</code></td><td>Définissez le SDK pour utiliser le mode sombre, le mode clair ou l’héritage du système.</td></tr></tbody></table>

</details>

## Localisation

Le SDK prend en charge plusieurs langues, notamment celles énumérées ci-dessous.

{% columns %}
{% column %}

* Arabe - `ar` 🇦🇪
* Chinois (simplifié) - `zh` 🇨🇳
* Chinois (traditionnel) - `hk` 🇨🇳
* Néerlandais - `nl` 🇳🇱
* Anglais - `en` 🇺🇸
* Français - `fr` 🇫🇷
* Allemand - `de` 🇩🇪
* Hindi - `hi` 🇮🇳
* Indonésien -  `identifiant` 🇮🇩
* Italien - `it` 🇮🇹
  {% endcolumn %}

{% column %}

* Japonais -  `ja` 🇯🇵
* Coréen -  `ko` 🇰🇷
* Norvégien - `no` 🇳🇴
* Polonais - `po` 🇵🇱
* Portugais - `pt` 🇵🇹
* Espagnol - `es` 🇪🇸
* Suédois - `sv` 🇸🇪
* Thaï -  `th` 🇹🇭
* Vietnamien -  `vi` 🇻🇳
* et plus encore...
  {% endcolumn %}
  {% endcolumns %}

## Gestion des résultats

Pour exécuter les contrôles de vérification, vous devez implémenter les **succès**, **annulé**, et **erreur** callbacks.

En cas d’achèvement réussi (`onSuccess`), vous pouvez déclencher [des requêtes de vérification](/documentation/api-reference/core-resources/checks/create-a-check.md) depuis votre backend en utilisant les identifiants de ressource renvoyés dans l’objet résultat. Ces identifiants correspondent aux éléments téléversés (par ex. documents, selfies) et peuvent être utilisés pour lancer des contrôles de vérification via l’API ComplyCube.

Si l’utilisateur quitte le flux avant la fin, le `onCancelled` callback est appelée avec une raison descriptive indiquant pourquoi la session a été annulée (par ex. sortie de l’utilisateur, délai d’attente, autorisation refusée)

{% hint style="info" %}
Dans certains cas, le client peut annuler le flux après avoir terminé une ou plusieurs étapes de capture. Si cela se produit, toutes les données capturées avant l’annulation, comme des documents ou des médias biométriques, peuvent déjà avoir été téléversées vers son dossier client.
{% endhint %}

Si le SDK rencontre un problème, le `onError` callback est déclenchée avec un `ComplyCubeError` objet contenant le type d’erreur et le message. Consultez les **codes d’erreur** (voir ci-dessous) pour une liste complète des cas d’erreur possibles.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
// Enregistrez un gestionnaire de résultats pour traiter l’issue du flux.
var complycubeFlow =
    ComplyCubeSdk.Builder(
        this,
        callback = { result ->
            when (result) {
                is Result.Success -> { 
                /*
                Gestion des résultats réussis :
                Notre flux par défaut comprend trois composants : un document d’identité,
                un selfie (photo en direct) et un justificatif de domicile. En cas de 
                à la fin, le 'Result' contiendra un tableau de résultats d'étape.
                Chaque résultat d'étape fournit l'ID de l'élément téléversé :
                  - 'StageResult.Document.Id' : l'ID du document téléversé.
                  - 'StageResult.LivePhoto.Id' : l'ID de la photo en direct téléversée.
                  - 'StageResult.ProofOfAddress.Id' : l'ID du document de justificatif de domicile téléversé.
                */
                }
                is Result.Cancelled -> { /* Gérer le résultat annulé */ }
                is Result.Error -> {
                    // Gérer les erreurs
                    when (result.errorCode) {
                        ComplyCubeErrorCode.UploadError -> {
                            // Gérer l’erreur de téléversement
                        }
                        ComplyCubeErrorCode.BiometricStageCount -> {
                            // Gérer l’erreur BiometricStageCount
                        }
                        // ... autres gestionnaires d’erreurs
                    }
                }
                else -> {}
            }
        }
    )

complycubeFlow.start(clientAuth)
```

{% endtab %}

{% tab title="Java" %}

```java
// Enregistrez un gestionnaire de résultats pour traiter l’issue du flux.
ComplyCubeSdk.Builder complycubeFlow = new ComplyCubeSdk.Builder(this, result -> {
    if (result instanceof Result.Success) {
        /*
        Gestion des résultats réussis :
        Notre flux par défaut comprend trois composants : un document d’identité,
        un selfie (photo en direct) et un justificatif de domicile. En cas de 
        à la fin, le 'Result' contiendra un tableau de résultats d'étape.
        Chaque résultat d'étape fournit l'ID de l'élément téléversé :
          - 'StageResult.Document.Id' : l'ID du document téléversé.
          - 'StageResult.LivePhoto.Id' : l'ID de la photo en direct téléversée.
          - 'StageResult.ProofOfAddress.Id' : l'ID du document de justificatif de domicile téléversé.
        */
    } else if (result instanceof Result.Error) {
        switch (((Result.Error) result).getErrorCode()) {
            case ComplyCubeErrorCode.UploadError.INSTANCE:
                // Gérer l’erreur de téléversement
                break;
            case ComplyCubeErrorCode.BiometricStageCount.INSTANCE:
                // Gérer l’erreur BiometricStageCount
                break;
                // ... autres gestionnaires d’erreurs
            default:
        }
    } else if (result instanceof Result.Canceled) {
        // Gérer le résultat annulé
    }
    return null;
});
```

{% endtab %}
{% endtabs %}

<details>

<summary>Codes d’erreur</summary>

<table data-full-width="false"><thead><tr><th width="312.48828125">Type d'erreur</th><th>Description</th></tr></thead><tbody><tr><td><code>Nombre d'étapes biométriques</code></td><td>La configuration contient des doublons <strong>photo de selfie</strong> ou <strong>vidéo selfie</strong> étapes.</td></tr><tr><td><code>Annulé</code></td><td>Le client a annulé le flux et quitté le SDK (a déclenché le <code>onCancelled</code> callback).</td></tr><tr><td><code>Connectivité</code></td><td>Une erreur réseau s'est produite.</td></tr><tr><td><code>Document obligatoire</code></td><td>Un <strong>étape de document</strong> est requise en fonction des étapes configurées, mais n'a pas été incluse.</td></tr><tr><td><code>Jeton expiré</code></td><td>Le jeton du SDK a expiré. Générez un nouveau jeton et redémarrez le flux.</td></tr><tr><td><code>Erreur de flux</code></td><td>Une erreur irrécupérable s'est produite pendant le flux.</td></tr><tr><td><code>Code pays invalide</code></td><td>Un code pays invalide a été fourni.</td></tr><tr><td><code>Jailbroken</code></td><td>Le SDK ne peut pas s'exécuter sur cet appareil car il a été jailbreaké ou compromis.</td></tr><tr><td><code>Aucun accès au disque</code></td><td>Le client a refusé les autorisations d'accès au disque requises par le SDK.</td></tr><tr><td><code>Aucun type de document</code></td><td>Un <strong>étape de document</strong> a été initialisé sans spécifier de types de document.</td></tr><tr><td><code>Aucun résultat</code></td><td>Aucun résultat n'a été renvoyé au rappel. Si cela persiste, veuillez contacter l'assistance.</td></tr><tr><td><code>Aucun consentement de l'utilisateur</code></td><td>Le client n'a pas fourni son consentement pour poursuivre le flux du SDK.</td></tr><tr><td><code>Non autorisé</code></td><td>Le SDK a tenté d'accéder à un point de terminaison qu'il n'est pas autorisé à utiliser.</td></tr><tr><td><code>Inconnu</code></td><td>Une erreur inattendue s'est produite. Si cela se reproduit régulièrement, contactez l'assistance.</td></tr><tr><td><code>Combinaison pays/type de document non prise en charge</code></td><td>La combinaison sélectionnée de pays et de type de document n'est pas prise en charge.</td></tr><tr><td><code>Type de document non pris en charge</code></td><td>Le type de document fourni n'est pas pris en charge.</td></tr><tr><td><code>Erreur de téléversement</code></td><td>Une erreur est survenue lors du téléversement d'un document ou d'un selfie.</td></tr><tr><td><code>Téléversement nécessitant une assistance</code></td><td>Si <code>useLiveCaptureOnly</code> est défini sur <code>false</code>, l'assistance doit être activée en définissant <code>isGuidanceEnabled</code> à <code>true</code>.</td></tr></tbody></table>

</details>

## Suivi des événements

Le SDK suit une gamme de **événements** tout au long du parcours de vérification, couvrant toutes les interactions clés des utilisateurs à chaque étape. Consultez ci-dessous la liste des événements.

Si vous devez mettre en œuvre des analyses personnalisées, vous pouvez vous raccorder à ces événements et déclencher en conséquence votre propre logique de suivi.

Pour intégrer votre propre suivi, définissez une fonction et appliquez-la à l’aide de `withEventHandler` lors de l’initialisation du `Builder`:

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
complycubeBuilder.withEventHandler(true) { event ->
    // Insérez ici le suivi utilisateur personnalisé
}
```

{% endtab %}

{% tab title="Java" %}

```java
complycubeFlow.withEventHandler(true, analyticsEvent ->
    // Insérez ici le suivi utilisateur personnalisé
);
```

{% endtab %}
{% endtabs %}

<details>

<summary>Événements</summary>

| Événement                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><code>INTRODUCTION</code><br><br>Le client a atteint l'écran d'introduction.</p>                                                                                                                                       |
| <p><code>ÉTAPE\_DE\_CONSENTEMENT</code><br><br>Le client a atteint l'écran de consentement.</p>                                                                                                                           |
| <p><code>AVERTISSEMENT\_ÉTAPE\_DE\_CONSENTEMENT</code><br><br>Le client a tenté de quitter sans donner son consentement.</p>                                                                                              |
| <p><code>AUTORISATION\_D'ACCÈS\_À\_LA\_CAMÉRA</code><br><br>Le client a atteint l'écran de demande d'autorisation de la caméra.</p>                                                                                       |
| <p><code>ÉTAPE\_GUIDE\_DE\_CAPTURE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de guide de capture de document.</p>                                                                                           |
| <p><code>ÉTAPE\_TYPE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de sélection du type de document pour une capture de document.</p>                                                                           |
| <p><code>ÉTAPE\_SÉLECTION\_DU\_PAYS</code><br><br>Le client a atteint l'écran de sélection du pays pour une capture de document.</p>                                                                                      |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour un document d'identité à une face.</p>                                                                |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un document d'identité à une face.</p>                                         |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour un document d'identité à une face.</p>                                                   |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_CAMÉRA</code><br><br>Le client a atteint l'écran de capture par caméra pour la face avant d'un document d'identité à deux faces.</p>                                               |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour la face avant d'un document d'identité à deux faces.</p>                        |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour la face avant d'un document d'identité à deux faces.</p>                                  |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_CAMÉRA</code><br><br>Le client a atteint l'écran de capture par caméra pour la face arrière d'un document d'identité à deux faces.</p>                                           |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour la face arrière d'un document d'identité à deux faces.</p>                    |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour la face arrière d'un document d'identité à deux faces.</p>                              |
| <p><code>ÉTAPE\_BIOMÉTRIE\_GUIDE\_DE\_CAPTURE\_DE\_SELFIE</code><br><br>Le client a atteint l'écran de guide de capture de selfie.</p>                                                                                    |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_SELFIE</code><br><br>Le client a atteint l'écran de capture photo de selfie par caméra.</p>                                                                                            |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_SELFIE\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture photo de selfie manuelle par caméra.</p>                                                                     |
| <p><code>ÉTAPE\_BIOMÉTRIE\_VÉRIFICATION\_QUALITÉ\_SELFIE</code><br><br>Le client a atteint l'écran de prévisualisation de la photo de selfie.</p>                                                                         |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_VIDÉO</code><br><br>Le client a atteint l'écran de caméra de selfie vidéo.</p>                                                                                                         |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_VIDÉO\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un selfie vidéo.</p>                                                                 |
| <p><code>ÉTAPE\_BIOMÉTRIE\_PREMIÈRE\_ACTION\_VIDÉO</code><br><br>Le client a atteint la première action d'une capture de selfie vidéo.</p>                                                                                |
| <p><code>ÉTAPE\_BIOMÉTRIE\_DEUXIÈME\_ACTION\_VIDÉO</code><br><br>Le client a atteint la deuxième action d'une capture de selfie vidéo.</p>                                                                                |
| <p><code>ÉTAPE\_BIOMÉTRIE\_VÉRIFICATION\_QUALITÉ\_VIDÉO</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un selfie vidéo.</p>                                                                |
| <p><code>ÉTAPE\_GUIDE\_DE\_CAPTURE\_DU\_JUSTIFICATIF\_DE\_DOMICILE</code><br><br>Le client a atteint l'écran de guide de capture du justificatif de domicile.</p>                                                         |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_TYPE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de sélection du type de document pour une capture de justificatif de domicile.</p>                               |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_SÉLECTION\_DU\_PAYS</code><br><br>Le client a atteint l'écran de sélection du pays pour une capture de justificatif de domicile.</p>                                          |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour un justificatif de domicile à une face.</p>                                         |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour un justificatif de domicile à une face.</p>                      |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour un justificatif de domicile à une face.</p>                            |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour la face avant d'un justificatif de domicile à deux faces.</p>                        |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour la face avant d'un justificatif de domicile à deux faces.</p>     |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_VÉRIFICATION\_QUALITÉ</code><br>Le client a atteint l'écran d'aperçu de qualité pour la face avant d'un justificatif de domicile à deux faces.</p>               |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour la face arrière d'un justificatif de domicile à deux faces.</p>                    |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour la face arrière d'un justificatif de domicile à deux faces.</p> |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_VÉRIFICATION\_QUALITÉ</code><br>Le client a atteint l'écran d'aperçu de qualité pour la face arrière d'un justificatif de domicile à deux faces.</p>           |
| <p><code>ÉTAPE\_DE\_FINALISATION</code><br><br>Le client a atteint l'écran de fin.</p>                                                                                                                                    |

</details>

## Gestion de l’expiration du jeton

Pour gérer l’expiration du jeton de manière fluide, vous pouvez fournir une fonction de rappel qui génère un nouveau jeton SDK lorsque nécessaire. Cela permet au flux de se poursuivre sans interruption, sans que l’utilisateur ait à redémarrer la session manuellement.

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
var complyCubeBuilder = ComplyCubeSdk.Builder(this,
    callback = { result ->
        if (result is Result.Error) {
            if (result.errorCode is ComplyCubeErrorCode.ExpiredToken) {
                // Insérez ici votre code personnalisé de renouvellement du jeton
            }
        }
    }
)
```

{% endtab %}

{% tab title="Java" %}

```java
ComplyCubeSdk.Builder complyCubeBuilder =
    new ComplyCubeSdk.Builder(this, result -> {
        if (result instanceof Result.Error) {
            if (((Result.Error) result).getErrorCode() == ComplyCubeErrorCode.ExpiredToken.INSTANCE) {
                // Insérez ici votre code personnalisé de renouvellement du jeton
            }
        }
        return null;
    });
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.complycube.com/documentation/sdks/sdks-fr/integrations-mobiles/sdk-android/integration-guidee-par-les-verifications.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
