> 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/classic-push-provisioning/es/casos-de-uso/aprovisionamiento-push-para-carteras-xpay/android/aprovisionamiento-push.md).

# Aprovisionamiento push

### Paso 1: Mostrar el botón Añadir a la cartera <a href="#step-1-showing-the-add-to-wallet-button" id="step-1-showing-the-add-to-wallet-button"></a>

Su aplicación del emisor usa el SDK de Push Provisioning para comprobar si la cartera xPay de destino es compatible con el dispositivo y si ya existe un token para la tarjeta. Según el resultado, muestra u oculta el **Añadir a la cartera** botón.

Siga estas directrices de marca de la cartera para usar **Añadir a la cartera** en su aplicación del emisor:

* **Google Pay**\
  <https://developers.google.com/pay/api/android/guides/brand-guidelines>
* **Samsung Pay**\
  <https://pay.samsung.com/developers/resource/brand>
* **Huawei Pay**\
  La compatibilidad solo está disponible para esquemas nacionales.

  > <i class="fa-exclamation-circle">:exclamation-circle:</i>
  >
  > #### Advertencia <a href="#warning" id="warning"></a>
  >
  > * Huawei Pay no es compatible con las redes de pago internacionales (por ejemplo, Mastercard y Visa). Solo [nacionales](https://thalesgroup.github.io/d1sdk-docs/tpc-sdk/android/1.7.1/com/thalesgroup/tpcsdk/model/CardScheme.html#PAGOBANCOMAT) pueden ser compatibles en casos específicos. Consulte con Thales las condiciones de uso.
  > * A partir del 10 de junio de 2024, [Google Wallet](https://developers.google.com/wallet/docs/release-notes#June_04_2024) requiere Android 9 o superior.

Usando los últimos cuatro dígitos del PAN, la aplicación del emisor puede recuperar el token de una tarjeta que ya está aprovisionada en una cartera del dispositivo (Samsung Pay y Google Pay para Android).

Cada token incluye:

* El ID del token.
* Los últimos cuatro dígitos de la tarjeta digital (DPAN).
* El estado del token (estado de digitalización).

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

```java
OEMPayType type = OEMPayType.GOOGLE_PAY; // o OEMPayType.SAMSUNG_PAY
GetTokenInput input = new GetTokenInput("1234"); // últimos cuatro dígitos de la tarjeta física (FPAN)
PushProvisioning pushProvisioning = TPCManager.getInstance().getPushProvisioning(type);
pushProvisioning.getToken(input, new TPCSDKListener<Token>() {
    @Override
    public void onStart() {
    }
    @Override
    public void onSuccess(TPCResult<Token> result) {
        // El token puede recuperarse usando result.getResult().
        // result.getResult() devolverá null si la cartera OEM no tiene un token correspondiente.
        // El estado del token se usa de la siguiente manera:
        if(result.getResult()==null || TextUtils.isEmpty(result.getResult().getState())){
            // La API no devolvió un token.
            // Muestra el botón "Añadir a GPay/SPay".
        }else{
            Token token = result.getResult();
            if(type==OEMPayType.GOOGLE_PAY){
                // Para Google Pay.
                try {
                    int tokenState = Integer.parseInt(token.getState());
                    switch (tokenState){
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION:
                            // Consulte la gestión del ciclo de vida del token para la acción Activar.
                            // la tarjeta está pendiente de ID&V. 
                            break;
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_PENDING:
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_SUSPENDED:
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_ACTIVE:
                            // La tarjeta ya está añadida.
                            break;
                        case CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_UNTOKENIZED:
                            // Muestra el botón "Añadir a GPay".
                            break;
                    }
                } catch (NumberFormatException e) {
                    // Gestiona la excepción.
                }
            }else if(type==OEMPayType.SAMSUNG_PAY){
                // Para Samsung Pay.
                String tokenState = token.getState();
                switch (tokenState){
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_PROVISION:
                        // Consulte la gestión del ciclo de vida del token para la acción Activar.
                        // la tarjeta está pendiente de ID&V
                        break;
                    case CardDigitizationStatus.SAMSUNG_PAY_ACTIVE:
                    case CardDigitizationStatus.SAMSUNG_PAY_EXPIRED:
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_ENROLLED:
                    case CardDigitizationStatus.SAMSUNG_PAY_SUSPENDED:
                    case CardDigitizationStatus.SAMSUNG_PAY_PENDING_ACTIVATION:
                        // La tarjeta ya está añadida.
                        break;
                    case CardDigitizationStatus.SAMSUNG_PAY_DISPOSED:
                        // Muestra el botón "Añadir a SPay".
                        break;
                }
            }
        }
    }
    @Override
    public void onError(TPCSDKException exception) {
        // específico de Samsung Pay
        Throwable exceptionCause = exception.getCause();
        if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
            // obtener más detalles del error de Samsung Pay
            TPCSpayException spayException = (TPCSpayException) exceptionCause;
        }
    }
});
```

{% endtab %}

{% tab title="Android 1.6.0-" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setLast4PanDigits(last4DigitsOfPAN); // Solo para Samsung Pay

TPCManager.getInstance().getPushProvisioning()
	.isCardDigitized(cardInfo, new TPCSDKListener<CardDigitizationStatus>() {
    @Override
    public void onStart() {
        // Inicio 
    }

    @Override
    public void onSuccess(TPCResult<CardDigitizationStatus> result) {
        if (result != null) {
          	CardDigitizationStatus digitizedStatus = result.getResult();

            if (digitizedStatus.getOemPayType() == OEMPayType.GOOGLE_PAY) {
                int cardState = digitizedStatus.getGpayDigitizationStatus();
                String tokenReferenceId = digitizedStatus.getTokenReferenceId();

                if (cardState == CardDigitizationStatus.GOOGLE_PAY_TOKEN_STATE_NEEDS_IDENTITY_VERIFICATION)
                    // la tarjeta está pendiente de ID&V
                } else if (cardState == CardDigitizationStatus.CARD_IS_NOT_DIGITIZED) {
                    // tarjeta no añadida
                } else {
                    // tarjeta añadida
                }
            }
          
            if (digitizedStatus.getOemPayType() == OEMPayType.HUAWEI_PAY) {
                Boolean isCardDigitized = cardDigitizationStatus.getHpayDigitizationStatus();
                String hPayDeviceId = cardDigitizationStatus.getHPayDeviceId();
            }
            
          	if (digitizedStatus.getOemPayType() == OEMPayType.SAMSUNG_PAY) {
                String cardState = digitizedStatus.getSpayDigitizationStatus(); 
            }
        }
    }

    @Override
    public void onError(TPCSDKException exception) {
        Log.e("TAG", "Error en el estado de la tarjeta digitalizada");
    }
});
```

{% endtab %}
{% endtabs %}

Para Google Pay, el estado del token es el siguiente:

| Estado de Google Pay                                     | Descripción                                        |
| -------------------------------------------------------- | -------------------------------------------------- |
| GOOGLE\_PAY\_TOKEN\_STATE\_NEEDS\_IDENTITY\_VERIFICATION | La tarjeta está digitalizada y pendiente de ID\&V. |
| GOOGLE\_PAY\_TOKEN\_STATE\_PENDING                       | La tarjeta está digitalizada.                      |
| GOOGLE\_PAY\_TOKEN\_STATE\_SUSPENDED                     | La tarjeta está digitalizada.                      |
| GOOGLE\_PAY\_TOKEN\_STATE\_ACTIVE                        | La tarjeta está digitalizada.                      |
| GOOGLE\_PAY\_TOKEN\_STATE\_UNTOKENIZED                   | La tarjeta no está digitalizada.                   |
| CARD\_IS\_NOT\_DIGITIZED                                 | La tarjeta no está digitalizada.                   |

<br>

Para Samsung Pay, el estado del token es el siguiente:

| Estado de Samsung Pay             | Descripción                                        |
| --------------------------------- | -------------------------------------------------- |
| SAMSUNG\_PAY\_PENDING\_PROVISION  | La tarjeta está digitalizada y pendiente de ID\&V. |
| SAMSUNG\_PAY\_ACTIVE              | La tarjeta está digitalizada.                      |
| SAMSUNG\_PAY\_EXPIRED             | La tarjeta está digitalizada.                      |
| SAMSUNG\_PAY\_PENDING\_ENROLLED   | La tarjeta está digitalizada.                      |
| SAMSUNG\_PAY\_PENDING\_ACTIVATION | La tarjeta está digitalizada.                      |
| SAMSUNG\_PAY\_SUSPENDED           | La tarjeta está digitalizada.                      |
| SAMSUNG\_PAY\_DISPOSED            | La tarjeta no está digitalizada.                   |

> <i class="fa-exclamation-circle">:exclamation-circle:</i>
>
> #### Precaución <a href="#caution" id="caution"></a>
>
> * Para Google Pay, si la tarjeta sigue apareciendo como `NOT_DIGITIZED` después de la digitalización, compruebe que la aplicación del emisor esté configurada correctamente en el portal TSP.
> * Para Samsung Pay, algunos emisores deben registrar múltiples `NOMBRE DEL EMISOR` valores en el portal. Esto depende de la aplicación del emisor y/o de los requisitos del TSP. Asegúrese de que el `NOMBRE DEL EMISOR` valor de la API coincida con el valor registrado en el portal. La API solo devuelve coincidencias exactas.
> * El `getToken` API no es compatible con Huawei Pay. Use `isCardDigitized` para comprobar el estado de la digitalización.

### Paso 2: Aprovisionar una solicitud <a href="#step-2-provisioning-a-request" id="step-2-provisioning-a-request"></a>

En Android, el resultado correcto varía según `OEMPayType`. Para Samsung Pay, devuelve un `Card` objeto. Para Huawei Pay, devuelve un `Boolean`. Para Google Pay, el SDK 2.0.0 y posteriores devuelven un `GoogleProvisioningResult`, que contiene el ID del token cuando está disponible.

| Cartera     | Resultado correcto         |
| ----------- | -------------------------- |
| Samsung Pay | `Card`                     |
| Google Pay  | `GoogleProvisioningResult` |
| Huawei Pay  | `Boolean`                  |

{% tabs %}
{% tab title="Android 2.0.0+" %}
{% code overflow="wrap" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setAuthorizationCode(authorizationCode);
cardInfo.setLast4PanDigits("1234"); // Establece los últimos cuatro dígitos del PAN.
cardInfo.setIssuerAppId("TPC_ISSUER"); // ID de emisor de prueba.
cardInfo.setCardType("DEBIT"); // Solo para Samsung Pay
cardInfo.setProductId("PRODUCTID"); // Solo para esquemas nacionales. Recupérelo del CMS del emisor.
cardInfo.setBounceProvisioned(true); // Solo para Google Pay

UserDetails userDetails = new UserDetails();
userDetails.setAddress1("Línea de dirección 1");
userDetails.setAddress2("Línea de dirección 2");
userDetails.setAdministrativeArea("estado");
userDetails.setLocality("nombre de la ciudad");			// nombre de la ciudad o localidad
userDetails.setCountryCode("SG");					// Establece el código de país.
userDetails.setPostalCode("828126"); 			// Establece el código postal.
userDetails.setPhoneNumber("123456789"); 	// Establece el número de teléfono.
userDetails.setName("nombre");							// Establece el nombre de la persona en la dirección.
cardInfo.setUserDetails(userDetails);

// Desde TPC SDK V2.0.0
Activity activity;

PushProvisioning pushProvisioning;
try {
    pushProvisioning = TPCManager.getInstance().getPushProvisioning();
} catch (TPCSDKException e) {
    e.printStackTrace();
    return;
}

TPCSDKListener<GoogleProvisioningResult> addCardListenerGPay =
        new TPCSDKListener<GoogleProvisioningResult>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<GoogleProvisioningResult> result) {
            GoogleProvisioningResult provisioningResult = result.getResult();
            Log.i("TAG", "Aprovisionamiento push correcto con ID de token: "
                    + provisioningResult.getTokenID());
            // Opcionalmente puede comprobar lo siguiente
            if (!provisioningResult.isCardSavedToGoogle()) {
                Log.w("TAG", "Google Pay no guardó la tarjeta. Código de estado: "
                    + provisioningResult.googleCardSavedStatusCode());
            }
        }

        @Override
        public void onError(TPCSDKException exception) {
            logGoogleProvisioningDiagnostic(exception.getAdditionalData());
        }
};

private void logGoogleProvisioningDiagnostic(final Object additionalData) {
        if (additionalData instanceof GoogleProvisioningResult) {
            final GoogleProvisioningResult result = (GoogleProvisioningResult) additionalData;
            Log.w(TAG, "Diagnóstico de aprovisionamiento de Google. ID de token: " + result.getTokenID()
                    + ", cardSaved: " + result.isCardSavedToGoogle()
                    + ", cardSavedStatusCode: " + result.getGoogleCardSavedStatusCode());
        }
    }

TPCSDKListener<Card> addCardListenerSPay = new TPCSDKListener<Card>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<Card> result) {
            Card card = (Card)result.getResult();
            Log.d(TAG, "last4FPan: " + card.getLast4FPAN() +
                             "\nlast4DPan:" + card.getLast4DPAN() +
                             "\nApp2AppPayLoad: " + card.getApp2AppPayLoad() +
                             "\ntype: " + card.getType() +
                             "\nissuerName: " + card.getIssuerName() +
                             "\nid: " + card.getId() +
                             "\nstate: " + card.getState() +
                             "\nscheme: " + card.getCardScheme());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Aprovisionamiento push fallido. Error: " + exception.getMessage());
            if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_NEED_TO_UPDATE) {
                // Mostrar una interfaz de actualización de Samsung Pay
                pushProvisioning.updateSamsungPay();
            } else if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_SETUP_NOT_COMPLETED) {
                // Mostrar una interfaz de activación de Samsung Pay
                pushProvisioning.activateSamsungPay();
            } 
            Throwable exceptionCause = exception.getCause();
            if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
                // obtener más detalles del error de Samsung Pay
                TPCSpayException spayException = (TPCSpayException) exceptionCause;
            }
        }
};

TPCSDKListener<Boolean> addCardListenerHPay = new TPCSDKListener<Boolean>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<Boolean> result) {
            Log.i("TAG", "Aprovisionamiento push correcto");
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Aprovisionamiento push fallido. Error: " + exception.getMessage());
        }
};

TPCSDKListener addCardListener = null;
switch (oemPayType) {
    case GOOGLE_PAY:
        addCardListener = addCardListenerGPay;
        break;
    case SAMSUNG_PAY:
        addCardListener = addCardListenerSPay;
        break;
    case HUAWEI_PAY:
        addCardListener = addCardListenerHPay;
        break;
}


if (oemPayType == OEMPayType.GOOGLE_PAY) {
  // Desde TPC SDK V2.0.0
  pushProvisioning.addCard(activity, cardInfo, addCardListenerGPay);
} else {
  pushProvisioning.addCard(cardInfo, addCardListener);
}

// Cuando la aplicación del emisor reciba onActivityResult del SDK de Google Pay, páselo al SDK para que procese el resultado.
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    pushProvisioning.handleWalletResult(requestCode, resultCode, data);
}

// Cuando la aplicación del emisor reciba onNewIntent de Huawei Pay, pase el intent al SDK para que procese el resultado.
@Override
protected void onNewIntent(Intent intent) {
    pushProvisioning.handleWalletResult(intent);
}
```

{% endcode %}
{% endtab %}

{% tab title="Android 2.0.0-" %}
{% code overflow="wrap" %}

```java
CardInfo cardInfo = new CardInfo();
cardInfo.setScheme(scheme);
cardInfo.setEncryptedPayload(encryptedPayload);
cardInfo.setAuthorizationCode(authorizationCode);
cardInfo.setLast4PanDigits("1234"); // Establece los últimos cuatro dígitos del PAN.
cardInfo.setIssuerAppId("TPC_ISSUER"); // ID de emisor de prueba.
cardInfo.setCardType("DEBIT"); // Solo para Samsung Pay
cardInfo.setProductId("PRODUCTID"); // Solo para esquemas nacionales. Recupérelo del CMS del emisor.

UserDetails userDetails = new UserDetails();
userDetails.setAddress1("Línea de dirección 1");
userDetails.setAddress2("Línea de dirección 2");
userDetails.setAdministrativeArea("estado");
userDetails.setLocality("nombre de la ciudad");			// nombre de la ciudad o localidad
userDetails.setCountryCode("SG");					// Establece el código de país.
userDetails.setPostalCode("828126"); 			// Establece el código postal.
userDetails.setPhoneNumber("123456789"); 	// Establece el número de teléfono.
userDetails.setName("nombre");							// Establece el nombre de la persona en la dirección.
cardInfo.setUserDetails(userDetails);

// Desde TPC SDK V1.9.0
Activity activity;

PushProvisioning pushProvisioning;

PushProvisioning pushProvisioning = TPCManager.getInstance().getPushProvisioning();

TPCSDKListener<String> addCardListenerGPay = new TPCSDKListener<String>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<String> result) {
            Log.i("TAG", "Aprovisionamiento push correcto con resultado: " + result.getResult());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Aprovisionamiento push fallido. Error: " + exception.getMessage());
        }
}

TPCSDKListener<Card> addCardListenerSPay = new TPCSDKListener<Card>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<Card> result) {
            Card card = (Card)result.getResult();
            Log.d(TAG, "last4FPan: " + card.getLast4FPAN() +
                             "\nlast4DPan:" + card.getLast4DPAN() +
                             "\nApp2AppPayLoad: " + card.getApp2AppPayLoad() +
                             "\ntype: " + card.getType() +
                             "\nissuerName: " + card.getIssuerName() +
                             "\nid: " + card.getId() +
                             "\nstate: " + card.getState() +
                             "\nscheme: " + card.getCardScheme());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Aprovisionamiento push fallido. Error: " + exception.getMessage());
            if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_NEED_TO_UPDATE) {
                // Mostrar una interfaz de actualización de Samsung Pay
                pushProvisioning.updateSamsungPay();
            } else if (exception.getExceptionType() == TPCSDKExceptionType.TPC_SPAY_APP_SETUP_NOT_COMPLETED) {
                // Mostrar una interfaz de activación de Samsung Pay
                pushProvisioning.activateSamsungPay();
            } 
            Throwable exceptionCause = exception.getCause();
            if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
                // obtener más detalles del error de Samsung Pay
                TPCSpayException spayException = (TPCSpayException) exceptionCause;
            }
        }
};

TPCSDKListener<Boolean> addCardListenerHPay = new TPCSDKListener<Boolean>() {
        @Override
        public void onStart() {
            // hacer algo
        }

        @Override
        public void onSuccess(TPCResult<Boolean> result) {
            Log.i("TAG", "Aprovisionamiento push correcto");
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Aprovisionamiento push fallido. Error: " + exception.getMessage());
        }
};

TPCSDKListener addCardListener = null;
switch (oemPayType) {
    case OEMPayType.GOOGLE_PAY:
    case GOOGLE_PAY:
        addCardListener = addCardListenerGPay;
        break;
    case OEMPayType.SAMSUNG_PAY:
    case SAMSUNG_PAY:
        addCardListener = addCardListenerSPay;
        break;
    case OEMPayType.HUAWEI_PAY:
    case HUAWEI_PAY:
        addCardListener = addCardListenerHPay;
        break;
}

try {
    if (oemPayType == OEMPayType.GOOGLE_PAY) {
        // Desde TPC SDK V1.9.0
        pushProvisioning.addCard(activity, cardInfo, addCardListenerGPay);
    } else {
        pushProvisioning.addCard(cardInfo, addCardListener);
    }
} catch (TPCSDKException e) {
    e.printStackTrace();
}

// Cuando la aplicación del emisor reciba onActivityResult del SDK de Google Pay, páselo al SDK para que procese el resultado.
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    pushProvisioning.handleWalletResult(requestCode, resultCode, data);
}

// Cuando la aplicación del emisor reciba onNewIntent de Huawei Pay, pase el intent al SDK para que procese el resultado.
@Override
protected void onNewIntent(Intent intent) {
    pushProvisioning.handleWalletResult(intent);
}
```

{% endcode %}
{% 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.payments.thalescloud.io/classic-push-provisioning/es/casos-de-uso/aprovisionamiento-push-para-carteras-xpay/android/aprovisionamiento-push.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
