> 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/make-payment/other-payment-methods/implement-dsrp-remote-payment.md).

# Implementar el pago remoto DSRP

## Resumen

Use Mastercard Digital Secure Remote Payment (DSRP) para generar datos de pago para aceptación remota, como el comercio electrónico.

En este flujo, su **aplicación de cartera digital** genera datos de pago. Usted pasa esos datos a su sistema de comercio o pasarela de pago para su autorización.

Antes de comenzar, complete **Tokenización**. Consulte [Tokenizar una tarjeta](/nfc-wallet-sdk-android/es/implement-nfc-wallet/tokenize-a-card.md).

{% hint style="warning" %}
El SDK de NFC Wallet admite el pago remoto DSRP para **Mastercard** tarjetas digitales con el **perfil MCBP 2.x** solo.

Si necesita pago remoto DSRP para un perfil o red de pago diferente, póngase en contacto con su equipo de entrega de Thales.
{% endhint %}

## Integración del SDK

### Compruebe los requisitos previos

Confirme que la tarjeta digital admite el pago remoto DSRP usando `DigitalizedCardDetails.paymentTypeSupported()`. Esta API devuelve una lista de tipos de pago compatibles. Verifique que `PaymentType.DSRP` está presente.

```java
public boolean isDsrpSupported(DigitalizedCardDetails card) {
    final PaymentType[] supported = card.paymentTypeSupported();

    for (PaymentType p : supported) {
        if (p == PaymentType.DSRP) {
            return true;
        }
    }
    return false;
}
```

### Cree los datos de entrada de pago DSRP

Cree `PaymentInputData`. Contiene los parámetros de la transacción usados para generar la carga útil del pago remoto DSRP.

Use `PaymentInputData.PaymentInputBuilder` con:

* `withRemotePaymentParameters` para proporcionar `importe` y `currencyCode`
* `withMCRemotePaymentParameters` para proporcionar `countryCode`, `transactionType`, `cryptogramDataType`, y `unpredictableNumber`

Use los siguientes valores de ejemplo como marcadores de posición.

```java
long amount = 11900; // unidades menores. Ejemplo: 119.00
char currencyCode = 702; // SGD (numérico ISO 4217)
char countryCode = 702; // Singapur (numérico ISO 3166-1)
TransactionType transactionType = TransactionType.PURCHASE;
long unpredictableNumber = 12345;
PaymentInputData paymentInputData = new PaymentInputData.PaymentInputBuilder(PaymentType.DSRP)
                .withRemotePaymentParameters(amount, currencyCode)
                .withMCRemotePaymentParameters(countryCode, transactionType, CryptogramDataType.DE55, unpredictableNumber)
                .build();
```

`PaymentInputData` para el pago DSRP tiene los siguientes campos:

| Campo                 | Tipo            | Formato                                               | Requisito | Descripción                                                                                                          |
| --------------------- | --------------- | ----------------------------------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------- |
| `importe`             | `long`          | Numérico, unidades menores                            | Requerido | Establezca el importe de la transacción en unidades menores (sin separador decimal). Ejemplo: 119.00 USD es `11900`. |
| `currencyCode`        | `char` (entero) | numérico de 3 dígitos ISO 4217                        | Requerido | Establezca el código de moneda de la transacción. Ejemplo: USD es `840`.                                             |
| `countryCode`         | `char` (entero) | numérico de 3 dígitos ISO 3166-1                      | Requerido | Establezca el código de país del comerciante. Ejemplo: Estados Unidos es `840`.                                      |
| `transactionType`     | Enumeración     | `TransactionType.PURCHASE`                            | Requerido | Establezca el tipo de transacción financiera. Para pagos remotos DSRP, use `TransactionType.PURCHASE`.               |
| `cryptogramDataType`  | Enumeración     | `CryptogramDataType.UCAF` o `CryptogramDataType.DE55` | Requerido | Establezca el formato del criptograma devuelto por el SDK.                                                           |
| `unpredictableNumber` | `long`          | Numérico                                              | Requerido | Proporcione un número aleatorio generado por el comerciante o la pasarela de pago.                                   |

### Genere un criptograma de pago remoto

En su aplicación de billetera digital, llame a `PaymentBusinessService.generateApplicationCryptogram()` con `PaymentType.DSRP` para generar datos de pago para aceptación remota (por ejemplo, comercio electrónico).

Debe implementar un `RemotePaymentServiceListener`.

```java
final PaymentBusinessService pbs = PaymentBusinessManager.getPaymentBusinessService();
pbs.generateApplicationCryptogram(
        PaymentType.DSRP, 
        paymentInputData, 
        remotePaymentServiceListener);
```

### Implemente `RemotePaymentServiceListener`

El listener de pago remoto gestiona eventos durante la generación del criptograma DSRP.

El listener tiene tres callbacks:

* `onAuthenticationRequired`

  El SDK indica que se requiere verificación CDCVM. Consulte [Realizar verificación CDCVM](/nfc-wallet-sdk-android/es/implement-nfc-wallet/make-payment/implement-contactless-payments/5.-perform-cdcvm-verification.md).
* `onDataReadyForPayment`

  Los datos de salida del pago remoto están listos. Recupérelos usando `PaymentService.getRemotePaymentData()`.

  Desactive el servicio de pago después de recuperar los datos. Si omite la desactivación, la siguiente generación puede fallar con `REMOTE_PAYMENT_WRONG_STATE`.
* `onError`

  El SDK encontró un fallo durante la generación del pago remoto.

  Desactive el servicio de pago para restablecer el estado antes de reintentar.

El siguiente fragmento de código muestra una implementación básica del listener:

{% code expandable="true" %}

```java
public class MyRemotePaymentPaymentServiceListener implements RemotePaymentServiceListener{
    /**********************************************************/
    /*                Listener del servicio de pago                */
    /**********************************************************/
    @Override
    public void onAuthenticationRequired(PaymentService paymentService, CHVerificationMethod chVerificationMethod, long cvmResetTimeout) {
        toggleProgress(false);
        if (chVerificationMethod == CHVerificationMethod.BIOMETRICS
                || chVerificationMethod == CHVerificationMethod.DEVICE_KEYGUARD) {
            Intent intent = new Intent(this, DeviceCVMActivity.class);
            intent.putExtra(DeviceCVMActivity.EXTRA_CVM, chVerificationMethod);
            overridePendingTransition(0, 0);
            startActivityForResult(intent, REQ_CODE_FINGERPRINT);
        } else {
            // NOTA: No se admite ninguna otra verificación
            AppLogger.e(TAG, "Método de verificación " + chVerificationMethod + " ¡no es compatible actualmente!");
            deactivatePaymentService();
        }
    }

    @Override
    public void onDataReadyForPayment(PaymentService paymentService, TransactionContext transactionContext) {
        toggleProgress(false);
        RemotePaymentOutputData remotePaymentData = paymentService.getRemotePaymentData();
        Toast.makeText(this, " Los datos de pago DSRP son " +remotePaymentData.getCryptogramData(), Toast.LENGTH_LONG).show();
        deactivatePaymentService();
    }

    @Override
    public void onError(SDKError<PaymentServiceErrorCode> sdkPaymentServiceErrorCode) {
        AppLogger.e(TAG, "No se pudieron generar los datos de pago DSRP con el código de error " + sdkPaymentServiceErrorCode.getErrorCode());
        Toast.makeText(this, "No se pudieron generar los datos de pago DSRP con el código de error " + sdkPaymentServiceErrorCode.getErrorCode(), Toast.LENGTH_SHORT).show();
        deactivatePaymentService();
    }
}
```

{% endcode %}

Pase la instancia de su listener cuando llame a `generateApplicationCryptogram(...)`.

### Obtenga los datos de pago DSRP

Obtener `RemotePaymentOutputData` cuando `RemotePaymentServiceListener.onDataReadyForPayment()` se activa.

`RemotePaymentOutputData` contiene los siguientes campos.

| Campo                  | Descripción                                                                                                                |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `cryptogramData`       | Matriz de bytes que contiene la respuesta formateada. Se trata de datos UCAF o TLV para que el comerciante complete DE-55. |
| `dpan`                 | DPAN con cualquier `F` relleno eliminado (si está presente).                                                               |
| `dpanSequenceNumber`   | Número de secuencia DPAN (PSN) de la tarjeta utilizada.                                                                    |
| `track2EquivalentData` | Datos equivalentes a la pista 2, según ISO/IEC 7813, excluyendo el sentinel de inicio, el sentinel de fin y el LRC.        |
| `PAR`                  | Referencia de cuenta de pago (PAR), si la proporciona la red de pago.                                                      |
| `dPanexpirationDate`   | Fecha de vencimiento del DPAN.                                                                                             |
| `cryptogramDataType`   | Formato de criptograma devuelto (`UCAF` o `DE55`).                                                                         |

`track2EquivalentData` incluye:

* Número de cuenta principal
* Separador de campo (hex `D`)
* Fecha de vencimiento (`YYMM`)
* Código de servicio
* Datos discrecionales (definidos por la red de pago)
* Relleno opcional con hex `F` para alinearlo a un byte completo

### Gestione los errores

Cuando `RemotePaymentServiceListener.onError(...)` se activa, el SDK proporciona un `PaymentServiceErrorCode`.

Llame siempre a `PaymentBusinessService.deactivate()` en `onError(...)` para restablecer el estado del servicio de pago antes de reintentar.

`PaymentBusinessService.generateApplicationCryptogram(...)` lanza `IllegalArgumentException` si `paymentInputData` es `null` o si el listener es `null`.

| Código de error del servicio de pago | Descripción                                                               | Acción recomendada                                                                                                               |
| ------------------------------------ | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| REMOTE\_PAYMENT\_WRONG\_STATE        | El servicio de pago ya está activado al intentar realizar un pago remoto. | Llamar a `PaymentBusinessService.deactivate()` después de cada generación. Llámelo cuando el usuario final cancele CDCVM.        |
| REMOTE\_PAYMENT\_OUTPUT\_INVALID     | Los datos de salida no se pueden analizar y no están disponibles.         | Reintente la transacción.                                                                                                        |
| REMOTE\_PAYMENT\_NOT\_SUPPORTED      | La tarjeta predeterminada no admite el pago remoto.                       | Compruebe `DigitalizedCardDetails.paymentTypeSupported()` antes del pago. Use una tarjeta digital que admita `PaymentType.DSRP`. |
| REMOTE\_PAYMENT\_INPUT\_INVALID      | Los datos de entrada existen, pero algunos campos no son válidos.         | Reconstruya `PaymentInputData` con valores válidos. Asegúrese de que todos los campos obligatorios estén establecidos.           |
| NO\_DEFAULT\_CARD                    | No hay ninguna tarjeta predeterminada.                                    | Establezca una tarjeta predeterminada antes de generar un criptograma.                                                           |
| CARD\_OUT\_OF\_PAYMENT\_KEYS         | No hay credenciales de pago disponibles.                                  | Reponga las credenciales de pago antes de reintentar.                                                                            |


---

# 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/make-payment/other-payment-methods/implement-dsrp-remote-payment.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.
