> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/trigger-provisioning.md).

# Disparar el aprovisionamiento

## Resumen

Después de digitalizar una tarjeta, inicia una sesión de aprovisionamiento para aprovisionar la tarjeta digital.

Durante la sesión de aprovisionamiento, el **NFC Wallet** aprovisiona de forma segura el perfil de la tarjeta digital y las claves de pago en tu **aplicación de cartera digital**.

Inicia la sesión de aprovisionamiento justo después de recibir el `activationCode` de `MGDigitizationListener.onCPSActivationCodeAcquired`. Consulte [Digitalizar una tarjeta](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/digitize-a-card.md#sdk-integration).

Esta devolución de llamada también devuelve `digitalCardId`. Guárdalo para operaciones posteriores (por ejemplo, tokens de acceso, historial de transacciones y LCM). No lo necesitas para iniciar el aprovisionamiento seguro.

{% hint style="info" %}
Este paso también establece el canal seguro entre el **NFC Wallet SDK** y el **backend de Thales NFC Wallet**.

Esta configuración se denomina **inscripción del dispositivo** (también conocido como **inscripción CPS**).
{% endhint %}

## Diagrama de secuencia

<figure><img src="/files/833c5ecf8d166b4e7da038236ea3acc3946c2704" alt=""><figcaption><p>Flujo de aprovisionamiento seguro (inscripción del dispositivo y sesión de aprovisionamiento).</p></figcaption></figure>

## Integración del SDK

El aprovisionamiento seguro requiere **inscripción del dispositivo**.

La inscripción del dispositivo normalmente se requiere una vez por instancia de wallet en un dispositivo. Cuando se requiere la inscripción, el flujo de inscripción desencadena automáticamente la sesión de aprovisionamiento.

Si la inscripción del dispositivo ya está completa, inicia la sesión de aprovisionamiento llamando a `ProvisioningBusinessService.sendActivationCode(...)`.

El SDK solicita el `activationCode` a través de `EnrollingServiceListener.onCodeRequired(...)`. Proporciona el valor en ese momento.

### Requisitos previos

Antes de empezar, asegúrate de tener:

* Inicializado el **NFC Wallet SDK**. Consulte [Inicializar el SDK de NFC Wallet](/nfc-wallet-sdk-android/es/get-started/configuration/4.-initialize-the-nfc-wallet-sdk.md).
* Configurado las notificaciones push y obtenido un token push. Consulte [Notificaciones push](https://gitlab.sre.ops.gcloud.thalescloud.io/bps/gitbook/nfc-wallet-gitbook-docs/-/blob/dev-sdk/NFC-Wallet-SDK-Android/get-started/configuration/5.-push-notifications).
* Recibido el `activationCode` de la digitalización. Consulta [Digitalizar una tarjeta](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/digitize-a-card.md#sdk-integration).

### Inscripción del dispositivo

La inscripción del dispositivo requiere estas entradas:

* `activationCode` (`byte[]`): Devuelto por la digitalización.
* `walletId`: Obténlo usando `MGCardEnrollmentService.getWalletId()`. Pasa este valor como el `userId` parámetro a `EnrollingBusinessService.enroll(...)`. Consulte [Obtener el ID de la billetera](/nfc-wallet-sdk-android/es/get-started/configuration/4.-initialize-the-nfc-wallet-sdk.md#retrieving-the-wallet-id).
* `pushToken`: El token de push para **FCM** o **HMS Push Kit**.

{% hint style="warning" %}
Prefija **HMS Push Kit** los tokens con `HMS:` (por ejemplo, `HMS:<token>`).
{% endhint %}

### Comprobar el estado de la inscripción del dispositivo

Comprueba el estado de la inscripción del dispositivo usando `EnrollingBusinessService.isEnrolled()`.

Este estado indica si el canal seguro ya está establecido para la instancia actual de wallet en este dispositivo.

Devuelve un `EnrollmentStatus`:

* `ENROLLMENT_NEEDED`: Llama a `EnrollingBusinessService.enroll(...)`.
* `ENROLLMENT_IN_PROGRESS`: Llama a `EnrollingBusinessService.continueEnrollment(...)`.
* `ENROLLMENT_COMPLETE`: Llama a `ProvisioningBusinessService.sendActivationCode(...)`.

### Implemente `EnrollingServiceListener`

Implemente `EnrollingServiceListener` para dirigir el flujo de inscripción:

* `onCodeRequired`: Proporciona el `activationCode`.
* `onComplete`: La inscripción del dispositivo se completa correctamente.
* `onError`: Maneja los errores usando `ProvisioningServiceError`.

<pre class="language-java" data-title="MyEnrollingServiceListener.java"><code class="lang-java"><strong>public class MyEnrollingServiceListener implements EnrollingServiceListener {
</strong>
    // Recibido de MGDigitizationListener.onCPSActivationCodeAcquired(...)
    private final byte[] activationCode;

    public MyEnrollingServiceListener(final byte[] activationCode) {
        this.activationCode = activationCode;
    }

    @Override
    public void onStarted() {
        // Se llama cuando comienza el flujo de inscripción.
    }

    @Override
    public void onCodeRequired(final CHCodeVerifier chCodeVerifier) {
        // Se llama cuando se requiere el código de activación para continuar el flujo.
        final SecureCodeInputer inputer = chCodeVerifier.getSecureCodeInputer();
        for (final byte b : activationCode) {
            inputer.input(b);
        }
        inputer.finish();
    }

    @Override
    public void onComplete() {
        // Se llama una vez que la inscripción del dispositivo se completa correctamente.
        // En un flujo Green, esto normalmente significa que el aprovisionamiento está completo.
    }

    @Override
    public void onError(final ProvisioningServiceError error) {
        // Se llama cuando la inscripción del dispositivo falla.
        // Analice error.getCode() y aplique la lógica correcta de reintento / recuperación.
    }
}
</code></pre>

### Implementación del código de inscripción del dispositivo

```java
byte[] activationCode = ...; // de MGDigitizationListener.onCPSActivationCodeAcquired(...)
String pushToken = "..."; // de FCM o HMS Push Kit
String language = "en"; // Usa la configuración regional de tu app cuando sea posible.

// El ID de wallet es el identificador de usuario para la inscripción del dispositivo.
String walletId = MobileGatewayManager.INSTANCE.getCardEnrollmentService().getWalletId();

EnrollingServiceListener enrollingListener = new MyEnrollingServiceListener(activationCode);

final EnrollingBusinessService enrollingService = ProvisioningServiceManager.getEnrollingBusinessService();
final ProvisioningBusinessService provisioningBusinessService = ProvisioningServiceManager.getProvisioningBusinessService();

// Comprueba el estado de inscripción.
final EnrollmentStatus status = enrollingService.isEnrolled();
switch (status) {
    case ENROLLMENT_NEEDED:
        // Primer intento de inscripción del dispositivo en esta instancia de wallet.
        enrollingService.enroll(walletId, pushToken, language, enrollingListener);
        break;
    
    case ENROLLMENT_IN_PROGRESS:
        // La inscripción se inició antes y debe reanudarse.
        enrollingService.continueEnrollment(language, enrollingListener);
        break;
    
    case ENROLLMENT_COMPLETE:
        // La inscripción del dispositivo ya está completada.
        // Desencadena el aprovisionamiento de esta tarjeta.
        // El SDK solicita el código de activación a través de enrollingListener.onCodeRequired(...).
        provisioningBusinessService.sendActivationCode(enrollingListener);
        break;
    
    default:
        // Registrar error (estado desconocido).
 }

```


---

# 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.payments.thalescloud.io/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/trigger-provisioning.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.
