> 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/merchant-tokenization/es/ctf-y-daf-de-visa/implement-ctf-and-daf/create-device-binding-yellow-flow/activate-binding-with-app-to-app.md).

# Activar la vinculación con app-to-app

El **aplicación del comerciante** redirecciona al **usuario final** a la **aplicación del emisor** para aprobar la solicitud de vinculación. La decisión de aprobación proviene del **backend del emisor** vía **VTS**.

{% hint style="info" %}
La vinculación del dispositivo comienza en la aplicación del comerciante, pero la aprobación final proviene del backend del emisor.

Evite la desincronización dispositivo/servidor. Active la vinculación localmente solo después de que el solicitante del token sea notificado del éxito.
{% endhint %}

## Flujo

<figure><img src="/files/aa408ed161506483573dfaff2c4a567e9ab62bf6" alt=""><figcaption><p>Flujo de vinculación de dispositivo app-a-app.</p></figcaption></figure>

<table><thead><tr><th width="100">Paso</th><th>Descripción</th></tr></thead><tbody><tr><td>1</td><td>El usuario final selecciona la opción app-a-app.</td></tr><tr><td>2</td><td>La decisión se reenvía al backend de Thales.</td></tr><tr><td>3</td><td>La aplicación del comerciante redirige al usuario final a la aplicación del emisor.</td></tr><tr><td>4</td><td>El usuario final se autentica y valida la solicitud de vinculación en la aplicación del emisor.</td></tr><tr><td>5</td><td>El emisor acepta la solicitud de vinculación e informa a VTS.</td></tr><tr><td>6-7</td><td>VTS notifica al backend de Thales para informar al backend del comerciante/PSP.</td></tr><tr><td>8</td><td>El backend del comerciante/PSP comunica el resultado a la aplicación del comerciante.</td></tr><tr><td>9</td><td>La aplicación del comerciante finaliza la sesión de vinculación pendiente en el SDK de Thales.</td></tr></tbody></table>

## Integración del SDK

Esta página continúa el flujo después de [Crear vinculación de dispositivo (flujo amarillo)](/merchant-tokenization/es/ctf-y-daf-de-visa/implement-ctf-and-daf/create-device-binding-yellow-flow.md).

### 1. Seleccione el método ID\&V app-a-app

Durante `createBinding` o `resumeBinding`, seleccione el método ID\&V app-a-app.

{% tabs %}
{% tab title="Android" %}
Una vez que la aplicación envía correctamente el `método ID&V` , se `onIssuerAuthenticationReady` callback se devolverá a la aplicación. De lo contrario, se devolverá un `onError` callback.

```java
@Override
public void onIssuerAuthenticationRequired(IDVSession idvSession) { 
    // Enviar el método ID&V APP_TO_APP
    for (IDVMethod idvMethod : idvSession.getIdvMethods()) {
        if (idvMethod.getType().equals(IDVType.APP_TO_APP)) {
            idvSession.selectIdvMethod(idvMethod);
        }
    }
}

@Override
public void onIssuerAuthenticationReady(IDVSession idvSession, 
                                        @Nullable OtpActivationStatus status) {
    
}

@Override
public void onError(TMGClientException exception) { 
    // Comprobar si hay algún error
    int errorCode = exception.getErrorCode();
    int errorMessage = exception.getMessage();
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
guard let idvSession = VisaService.shared.idvSession else {
    // No hay sesión IDV.
    return
}
// 1. Mostrar lista de métodos IDV.
do {
    let idvMethods = try idvSession.idvMethods
    let selectedIdvMethod = idvMethods[0] // el usuario selecciona un método idv app a app
    
    // 2. Enviar el método IDV.
    idvSession.selectIDVMethod(selectedIdvMethod) { (result) in
        if let otpActivationStatus = result {
        
        } else {
            if selectedIdvMethod.type == .appToApp {
                let idvType = selectedIdvMethod.type
                let requestPayload = selectedIdvMethod.requestPayload
                let source = selectedIdvMethod.source
                let value = selectedIdvMethod.value
                // 3. Iniciar una aplicación.
            }
        }
    }
} catch let error {
    // Maneja el error.
}

// 4. La falla en el paso 2, selectIDVMethod, se manejará en completionHandler.
VisaService.shared.completionHandler = { (session, error) in
    // 5. Comprobar si es un error de selectIDVMethod.
    if let session = session,
        let error = error,
        error.description == TMGError.invalidIdvMethod.description {
        VisaService.shared.idvSession = session
        // 6. Reintentar el flujo IDV.
    }
}
```

{% endtab %}
{% endtabs %}

### 2. Obtener datos de redirección app-a-app

{% hint style="info" %}
Su aplicación del comerciante debe manejar la redirección app-a-app. Esto está fuera del alcance del SDK de Thales.
{% endhint %}

{% tabs %}
{% tab title="Android" %}
La aplicación del comerciante puede usar el [enlace profundo](https://developer.android.com/training/app-links/deep-linking) mecanismo para iniciar la aplicación del emisor. Los datos necesarios para la activación de la vinculación pueden recuperarse del `objeto IDVMethod` .

```java
// Obtiene los datos adicionales para app a app.
IDVType idvType = idvMethod.getType();
String requestPayload = idvMethod.getRequestPayload();
String source = idvMethod.getSource();
String value = idvMethod.getValue();
```

{% endtab %}

{% tab title="iOS" %}
La aplicación del comerciante puede usar [Esquemas de URL](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) o [Enlaces universales](https://developer.apple.com/ios/universal-links) para iniciar la aplicación del emisor. Los datos necesarios para la activación de la vinculación pueden recuperarse del `objeto IDVMethod` .

```swift
let idvType = selectedIdvMethod.type
let requestPayload = selectedIdvMethod.requestPayload
let source = selectedIdvMethod.source
let value = selectedIdvMethod.value
```

{% endtab %}
{% endtabs %}

### 3. Activar la vinculación

Después de que el usuario final regrese de la aplicación del emisor, espere a que su backend del comerciante o PSP confirme la aprobación. Luego active la vinculación localmente llamando a `activateBinding` en el `IDVSession` .

Pase `null` para indicar que el flujo está completo.

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

```java
@Override
public void onIssuerAuthenticationReady(IDVSession idvSession, 
                                        @Nullable OtpActivationStatus status) { 
    // Activar la vinculación localmente
    idvSession.activateBinding(null);
}

@Override
public void onError(TMGClientException exception) { 
    // Comprobar si hay algún error
    int errorCode = exception.getErrorCode();
    int errorMessage = exception.getMessage();
}
```

El resultado del proceso de activación de la vinculación se devuelve a través del `onSuccess` callback o `onError` si hay un error.
{% endtab %}

{% tab title="iOS" %}

```swift
guard let idvSession = VisaService.shared.idvSession else {
    // No hay sesión IDV.
    return
}
// 1. Llamar a activate después de que el usuario final regrese de la app
idvSession.activateBinding(withValue: nil)

VisaService.shared.completionHandler = { (session, error) in
    // 2. Comprobar si activateBinding fue exitoso.
    if error == nil {
        
    }
}
```

El resultado del proceso de activación de la vinculación se devuelve a través del `completionHandler` función callback. En los casos en que la activación de la vinculación falle, `completionHandler` se llamará y un `IDVSession` objeto junto con un `objeto de error` se pasará al usuario final para reintentar el proceso.
{% 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.payments.thalescloud.io/merchant-tokenization/es/ctf-y-daf-de-visa/implement-ctf-and-daf/create-device-binding-yellow-flow/activate-binding-with-app-to-app.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.
