> 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-green-flow.md).

# Crear vinculación del dispositivo (flujo verde)

Use el emparejamiento de dispositivo del Marco de Token en la Nube de Visa (CTF) **flujo verde** cuando el emisor aprueba el emparejamiento del dispositivo **sin** autenticación de elevación de privilegios.

{% hint style="info" %}
En Producción, el emparejamiento del dispositivo a menudo requiere autenticación de elevación de privilegios. Esa ruta es el **flujo amarillo**.
{% endhint %}

Prerrequisitos:

* La tarjeta de pago ya está tokenizada.
* Usted tiene un `vProvisionedTokenId`.
* El usuario final puede autenticarse en el dispositivo (PIN, código de acceso, huella dactilar, Face ID, etc.).

## Flujo

<figure><img src="/files/0d9423f6ccad2bd67bee59ae2b99aa126eadc627" alt=""><figcaption><p>Flujo verde de emparejamiento de dispositivo.</p></figcaption></figure>

<table><thead><tr><th width="100">Paso</th><th>Descripción</th></tr></thead><tbody><tr><td>1</td><td>Inicie el flujo de emparejamiento de dispositivo desde la aplicación del comerciante usando el SDK de Thales.</td></tr><tr><td>2</td><td>El SDK de Thales genera un ID de dispositivo y un par de claves CTF, luego almacena el par de claves CTF de forma segura en el dispositivo.</td></tr><tr><td>3</td><td>El SDK de Thales inicia la autenticación del usuario final en el dispositivo.</td></tr><tr><td>4</td><td>El SDK de Thales genera y firma la carga útil definida por Visa.</td></tr><tr><td>5</td><td>El SDK de Thales envía la carga útil firmada y la clave pública CTF al backend de Thales.</td></tr><tr><td>6</td><td>El backend de Thales convierte la clave pública en un certificado usando una CA de Visa.</td></tr><tr><td>7</td><td>El backend de Thales registra el dispositivo y solicita el emparejamiento del dispositivo a VTS.</td></tr><tr><td>8</td><td>VTS verifica la decisión del emisor.</td></tr><tr><td>9</td><td>El emisor aprueba el emparejamiento del dispositivo sin autenticación de elevación de privilegios.</td></tr><tr><td>10</td><td>VTS reenvía el resultado al backend de Thales.</td></tr><tr><td>11</td><td>Se informa al SDK de Thales y vincula localmente el identificador del token al dispositivo.</td></tr><tr><td>12</td><td>El backend de Thales notifica al backend del comerciante/PSP con los detalles del emparejamiento.</td></tr></tbody></table>

## Integración del SDK

### Crear un emparejamiento

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

```java
String vProvisionedTokenId;
String correlationId;

visaCTFHelper.createBinding(vProvisionTokenId, 
                            correlationId, 
                            new TokenBindingListener() {

        ......
        
        @Override
        public void onDeviceAuthentication(DeviceAuthentication deviceAuthentication) {
            // Realizar autenticación del usuario
         }

        @Override
        public void onSuccess() { }

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

{% endtab %}

{% tab title="iOS" %}

```swift
let vProvisionedTokenID: String = ""
let correlationID: String = ""
// 1. Iniciar create binding
visaCTFHelper.createBinding(forVProvisionedTokenID: vProvisionedTokenID,
                            correlationID: correlationID,
    deviceAuthenticationHandler: { auth in
        // 2. faceID
        let customMessage = "" // Pase el mensaje personalizado. p. ej.: "Autenticarse con Face ID"
        auth.startAuthentication(withMessage: customMessage)
    }, idvSessionHandler: { session in
        // Iniciar sesión idv (aplicable solo para flujo amarillo)
        
    }, completionHandler: { session, error in
        // 3. emparejamiento exitoso
        if error == nil {
            
        }
        // Manejar el error o reintentar la sesión idv cuando hay una falla (no aplicable para flujo verde)
    })
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
`createBinding` es asincrónico. Se recomienda llamar a `runOnUiThread(Runnable)` en la devolución de llamada de la función en casos donde la aplicación tenga que actualizar cualquier UI.
{% endhint %}

### Autenticar al usuario final

Crear un emparejamiento de dispositivo requiere la presencia del usuario final. Implemente el `deviceAuhenticationHandler` callback desde `createBinding`.

Use este callback para presentar cualquier interfaz personalizada (por ejemplo, solicitudes de permiso de Face ID). Inicie la autenticación llamando a `startAuthentication`. También puede pasar un mensaje personalizado para mostrar durante la autenticación.

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

```java
@Override
public void onDeviceAuthentication(DeviceAuthentication deviceAuthentication) {
    FragmentActivity fragmentActivity;
    CharSequence title;
    CharSequence subTitle;
    CharSequence description;
    CharSequence negativeButtonText;

    // Iniciar la autenticación del usuario
    deviceAuthentication.startAuthentication(fragmentActivity, 
                                             title, 
                                             subTitle, 
                                             description, 
                                             negativeButtonText);
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
let deviceAuhenticationHandler: ((DeviceAuthentication) -> Void) = {(auth) in
    // Iniciar la autenticación del usuario
    let customMessage = "" // Pase el mensaje personalizado. p. ej.: "Autenticarse con Face ID"
    auth.startAuthentication(withMessage: customMessage)
}
```

{% endtab %}
{% endtabs %}

#### Manejar resultados

Los resultados se devuelven a través de la `onSuccess` o `onError` callback.

En caso de error, registre e inspeccione el código de error y el mensaje de la excepción.

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

```java
@Override
public void onError(TMGClientException exception) {
    // Comprobar el error
    int errorCode = exception.getErrorCode();
    int errorMessage = exception.getMessage();
}
```

{% endtab %}

{% tab title="iOS" %}

```swift
let vProvisionedTokenID: String = ""
let correlationID: String = ""
// 1. Iniciar create binding
visaCTFHelper.createBinding(forVProvisionedTokenID: vProvisionedTokenID,
                            correlationID: correlationID,
    deviceAuthenticationHandler: { auth in
        // 2. cancelar la autenticación del dispositivo
        auth.cancel()
    }, idvSessionHandler: { session in
        // Iniciar sesión idv (aplicable solo para flujo amarillo)
        
    }, completionHandler: { session, error in
        if error == nil {
            
        }
        // 3. Manejar el error de cancelación
    })
```

{% 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-green-flow.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.
