> 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/digitize-a-card/yellow-flow-digitization.md).

# Digitalización del flujo amarillo

## Resumen

El flujo amarillo es un **Tokenización** flujo en el que el **backend del emisor** aprueba la tokenización con autenticación escalonada (**ID\&V**).

Este flujo es común cuando el SDK de NFC Wallet se integra en un **aplicación de cartera digital** que admite tarjetas de varios emisores.

En este flujo, el **usuario final** completa ID\&V antes de que la tokenización pueda completarse.

## Experiencia de usuario

Consulte [Experiencia de usuario del flujo amarillo](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card.md#yellow-flow).

## Diagrama de secuencia

<figure><img src="/files/87352136f9857bed4ddb523ce84fbc6eafd79149" alt=""><figcaption><p>Secuencia de digitalización del flujo amarillo.</p></figcaption></figure>

## Integrar SDK

Después de [Comprobar la elegibilidad de la tarjeta](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/check-card-eligibility.md), implemente `MGDigitizationListener` para seguir el progreso de la digitalización. Luego:

1. Llamar a `MGCardEnrollmentService.digitizeCard(...)`.

   Proporcione una referencia a su `MGDigitizationListener`.
2. Si el backend del emisor aprueba la tokenización con autenticación escalonada (flujo amarillo), el SDK activa estos callbacks:
   1. `onCPSActivationCodeAcquired`

      Recibes el `activationCode` para iniciar el aprovisionamiento seguro.

      Consulte [Activar el aprovisionamiento](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card/trigger-provisioning.md).
   2. `onSelectIDVMethod`: Reciba los métodos de ID\&V para mostrarlos al usuario final. Consulte [Enumerar y seleccionar un método de ID\&V](#list-and-select-an-id-and-v-method).
   3. `onActivationRequired`: Se activa solo si el método de ID\&V seleccionado requiere activación (por ejemplo, OTP).
   4. `onComplete`: Las etapas de digitalización se han completado correctamente.

      si los métodos de ID\&V son:

      1. **cell\_phone**, **email** o **app\_to\_app con criptograma**: La tokenización se completa
      2. **website**, **customer\_service**, o **app\_to\_app sin criptograma**: La tokenización se completa después de que su [procesar notificaciones CPS](/nfc-wallet-sdk-android/es/get-started/configuration/5.-push-notifications/handle-push-notifications.md#process-cps-notifications-digital-card-operations).

{% hint style="info" %}
Para los **website**, **customer\_service**, o **app\_to\_app sin criptograma** métodos de ID\&V, el emisor activa el token usando la API de emisor de TSP.

En este caso, el aprovisionamiento solo se completa después de que usted [procesar notificaciones CPS](/nfc-wallet-sdk-android/es/get-started/configuration/5.-push-notifications/handle-push-notifications.md#process-cps-notifications-digital-card-operations).
{% endhint %}

### Enumerar y seleccionar un método de ID\&V

En `MGDigitizationListener.onSelectIDVMethod`, use `IDVMethodSelector` para enumerar los métodos de ID\&V disponibles.

`IDVMethodSelector.getIdvMethodList()` devuelve un array de `IDVMethod` con estos campos:

* `id`: Use este valor al seleccionar el método.
* `type`: El tipo de ID\&V (por ejemplo, OTP por SMS, OTP por correo electrónico o verificación mediante **aplicación del emisor**).
* `value`: El valor mostrado. El contenido depende de `type`.
* `isOTPRequired`: Indica si el SDK activará `onActivationRequired`.

NFC Wallet admite estos `type` valores:

* **cell\_phone**

  ID\&V usando un OTP enviado por SMS.

  Use `value` para mostrar el número de teléfono enmascarado al que se enviará el OTP.
* **email**

  ID\&V usando un OTP enviado por correo electrónico.

  Use `value` para mostrar la dirección de correo electrónico enmascarada a la que se enviará el OTP.
* **customer\_service**

  ID\&V mediante una llamada al servicio de atención al cliente del emisor.

  Use `value` para mostrar el número de teléfono al que el usuario final debe llamar.
* **website**

  El usuario final completa ID\&V en el sitio web del emisor.

  Use `value` para obtener la URL del sitio web.
* **app\_to\_app**

  La **aplicación de cartera digital** redirecciona al usuario final a la **aplicación del emisor**.

  Use `value` para mostrar el nombre de la aplicación del emisor.

Cuando el usuario final seleccione un método, capture su `id` y llame a `IDVMethodSelector.select(...)` para notificar al backend de NFC Wallet.

<pre class="language-java" data-expandable="true"><code class="lang-java">// Referencia de idvMethodSelector
IDVMethodSelector idvMethodSelector = null;

<strong>// Métodos de la interfaz MGDigitizationListener 
</strong><strong>@Override
</strong>public void onSelectIDVMethod(final IDVMethodSelector idvMethodSelector) {
    if (idvMethodSelector.getIdvMethodList().length == 0) {
        // Registrar error
    }
    
    this.idvMethodSelector = idvMethodSelector;
    
    displayIdvMethods();
}

// Método para construir la interfaz de diálogo para mostrar los posibles ID&#x26;V...
<strong>public void displayIdvMethods() {
</strong>    // ... así que la lista de posibles ID&#x26;V usando idvMethodSelector
    for (int i = 0; i &#x3C; idvMethodSelector.getIdvMethodList().length; i++) {
        IDVMethod idvMethod = idvMethodSelector.getIdvMethodList()[i];
        String id = idvMethod.getId();
        String type = idvMethod.getType();
        String value = idvMethod.getValue();
        boolean isOtpRequired = idvMethod.isOtpRequired();
        ...
    }
    ...
}

// Método que se llamará desde la interfaz, cuando el usuario final seleccione el método ID&#x26;V
// Proporcione el id del idvMethod seleccionado
public void selectIdvMethod( int idvSelectedMethodId) {
    idvMethodSelector.select( idvSelectedMethodId );
}
</code></pre>

### ID\&V con OTP

Si el usuario final selecciona **cell\_phone** o **email**, el TSP genera un OTP. Luego, el TSP solicita al emisor que envíe el OTP por SMS o correo electrónico.

El SDK de NFC Wallet activa `MGDigitizationListener.onActivationRequired` con `PendingCardActivation.getState()` establecido en `OTP_NEEDED`.

Tu **aplicación de cartera digital** debe mostrar una interfaz para introducir OTP.

Después de que el usuario final introduzca el OTP, llame a `PendingCardActivation.activate(...)` y proporcione el OTP.

Si el OTP es válido, el SDK activa `MGDigitizationListener.onComplete` de devolución de llamada.

{% hint style="info" %}
**Implemente la interfaz de introducción de OTP**

El SDK de NFC Wallet no proporciona una interfaz de introducción de OTP. Implemente y personalice la interfaz en su **aplicación de cartera digital**.
{% endhint %}

<pre class="language-java" data-expandable="true"><code class="lang-java">// referencia a su listener de digitalización de tarjetas
MyDigitizationListener digitizationListener = new MyDigitizationListener();

// Referencia de la activación de tarjeta pendiente
PendingCardActivation pendingCardActivation = null;

<strong>// Métodos de la interfaz MGDigitizationListener 
</strong><strong>@Override
</strong>public void onActivationRequired (PendingCardActivation pendingCardActivation) {
    this.pendingCardActivation = pendingCardActivation;
    
    PendingCardActivation activationState = pendingCardActivation.getState();
    switch( activationState ) {
        case OTP_NEEDED:
            // mostrar una interfaz para introducir un OTP
            ...
    }
    ...
}

// Método que se llamará desde la interfaz, cuando el OTP haya sido proporcionado por el usuario final
public void idvActivationWithOtp( String otp) {
    pendingCardActivation.activate( otp.getBytes(), digitizationListener );
}
</code></pre>

### ID\&V por servicio de atención al cliente o servicio web

Si el usuario final selecciona **customer\_service** o **website**, el emisor gestiona ID\&V directamente (por ejemplo, a través de un portal web del emisor o del servicio de atención al cliente del emisor).

Use `value` para obtener la URL del portal web o el número de teléfono del servicio de atención al cliente del emisor.

Después de que el emisor autentique correctamente al usuario final, el emisor activa el token usando la API de emisor de TSP.

Entonces el backend de NFC Wallet envía una `CPS` notificación push a la aplicación de monedero digital.

Procese el push como se describe en [Procesar notificaciones CPS](/nfc-wallet-sdk-android/es/get-started/configuration/5.-push-notifications/handle-push-notifications.md#process-cps-notifications-digital-card-operations).

### ID\&V de app a app

En este método de ID\&V, la aplicación de monedero digital redirecciona al usuario final a la aplicación del emisor.

El SDK de NFC Wallet activa `MGDigitizationListener.onActivationRequired` con `PendingCardActivation.getState()` establecido en `APP2APP_NEEDED`.

Use `PendingCardActivation.getAppToAppData()` para recuperar un `AppToAppData` objeto.

Use `AppToAppData.getPayLoad()`, `AppToAppData.getScheme()`, y `AppToAppData.getSource()` para redireccionar al usuario final a la aplicación del emisor.

```java
MGCardEnrollmentService enrollmentService = MobileGatewayManager.INSTANCE.getCardEnrollmentService();
PendingCardActivation pendingCardActivation = enrollmentService.getPendingCardActivation(digitalCardId);
PendingCardActivationState state = pendingCardActivation.getState();
if (PendingCardActivationState.APP2APP_NEEDED == state) {
  AppToAppData appToAppData = pendingCardActivation.getAppToAppData();
  if(appToAppData != null) {
    String scheme = appToAppData.getScheme();
    String source = appToAppData.getSource();
    String payload = appToAppData.getPayload();
  // use source para obtener packageId y la acción de intent para iniciar la aplicación del emisor
  }
}
```

Después de que la aplicación del emisor complete la autenticación, redirecciona al usuario final de vuelta a la aplicación de monedero digital.

Hay dos variantes:

* `AppToApp con criptograma`: La aplicación del emisor genera un criptograma del emisor.
* `AppToApp sin criptograma`: El emisor activa el token usando la API de emisor de TSP.

Para `AppToApp con criptograma`,

* llame a `PendingCardActivation.resumeAppToAppActivation(...)` y proporcione el criptograma del emisor.
* Si el criptograma es válido,
  * El SDK de NFC Wallet aprovisiona el perfil de la tarjeta digital en segundo plano.
  * y el SDK activa `MGDigitizationListener.onComplete` de devolución de llamada.

Para `AppToApp sin criptograma`,

* llame a `PendingCardActivation.resumeAppToAppActivation()`.
* Procese el push como se describe en [Procesar notificaciones CPS](/nfc-wallet-sdk-android/es/get-started/configuration/5.-push-notifications/handle-push-notifications.md#process-cps-notifications-digital-card-operations).


---

# 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/digitize-a-card/yellow-flow-digitization.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.
