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

# Android

### Paso 1: Mostrando el botón Agregar a Wallet <a href="#step-1-showing-the-add-to-wallet-button" id="step-1-showing-the-add-to-wallet-button"></a>

Su aplicación emisora utiliza el SDK de Push Provisioning para comprobar si la xPay Wallet de destino es compatible con el dispositivo y si ya existe un token para la tarjeta. Según el resultado, muestra u oculta el **Agregar a Wallet** botón.

Siga estas directrices de marca de billetera para usar **Agregar a Wallet** en su aplicación emisora:

* **Google Pay**\
  <https://developers.google.com/pay/api/android/guides/brand-guidelines>
* **Samsung Pay**\
  <https://pay.samsung.com/developers/resource/brand>
* **Huawei Pay**\
  El soporte está disponible sólo para esquemas nacionales.

  > <i class="fa-exclamation-circle">:exclamation-circle:</i>
  >
  > #### Advertencia <a href="#warning" id="warning"></a>
  >
  > * Huawei Pay no es compatible con redes de pago internacionales (por ejemplo, Mastercard y Visa). Sólo [nacionales](https://thalesgroup.github.io/d1sdk-docs/tpc-sdk/android/1.7.1/com/thalesgroup/tpcsdk/model/CardScheme.html#PAGOBANCOMAT) los esquemas 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 emisora puede recuperar el token de una tarjeta que ya está provisionada en una wallet 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 wallet OEM no tiene un token correspondiente.
        //El estado del token se usa como sigue:
        if(result.getResult()==null || TextUtils.isEmpty(result.getResult().getState())){
            //La API no devolvió un token.
            //Muestra el botón "Agregar 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:
                            //Mostrar el botón "Agregar 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 "Agregar a SPay".
                        break;
                }
            }
        }
    }
    @Override
    public void onError(TPCSDKException exception) {
        // específico para Samsung Pay
        Throwable exceptionCause = exception.getCause();
        if (exceptionCause != null && exceptionCause instanceof TPCSpayException) {
            // obtener más detalles del error para 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); // Sólo para Samsung Pay

TPCManager.getInstance().getPushProvisioning()
	.isCardDigitized(cardInfo, new TPCSDKListener<CardDigitizationStatus>() {
    @Override
    public void onStart() {
        //Al 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 digitalización de la tarjeta");
    }
});
```

{% 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, 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, 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 aún aparece como `NO_DIGITIZADA` después de la digitalización, compruebe que la aplicación emisora 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 emisora y/o de los requisitos del TSP. Asegúrese de que el `NOMBRE DEL EMISOR` valor en la API coincide con el valor registrado en el portal. La API devuelve sólo coincidencias exactas.
> * El `getToken` La API no es compatible con Huawei Pay. Use `isCardDigitized` para comprobar el estado de digitalización.

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

En Android, el resultado de éxito varía según `OEMPayType`. Para Google Pay, el SDK devuelve un ID de token. Para Samsung Pay, devuelve un `Card` objeto. Para Huawei Pay, devuelve un booleano.

> <i class="fa-info-circle">:info-circle:</i>
>
> #### Nota <a href="#note" id="note"></a>
>
> Desde TPC SDK v1.9.0, el push provisioning de Google Pay puede usar la nueva API: `addCard(Activity activity, CardInfo cardInfo, TPCSDKListener<T> listener)`.

```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"); // Sólo para Samsung Pay
cardInfo.setProductId("PRODUCTID"); // Sólo 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 pueblo
userDetails.setCountryCode("SG");					// Establecer el código de país.
userDetails.setPostalCode("828126"); 			// Establecer el código postal.
userDetails.setPhoneNumber("123456789"); 	// Establecer el número de teléfono.
userDetails.setName("nombre");							// Establecer el nombre de la persona en la dirección.
cardInfo.setUserDetails(userDetails);

//Desde TPC SDK V1.9.0
Activity activity;

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", "Push Provision exitoso con resultado : " + result.getResult());
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Push Provision falló. 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", "Push Provision falló. 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 para 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", "Push Provision exitoso");
        }

        @Override
        public void onError(TPCSDKException exception) {
            Log.e("TAG", "Push Provision falló. Error : " + exception.getMessage());
        }
};

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

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

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

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


---

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