> 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-ios/es/implement-nfc-wallet/make-payments/other-payment-methods/implement-dsrp-remote-payment.md).

# Implementar pago remoto DSRP

## Descripción general

Utilice el pago remoto Mastercard DSRP para generar datos de pago para la aceptación remota (por ejemplo, comercio electrónico).

En este flujo, su aplicación de billetera digital genera los datos de pago. Luego, pasa esos datos a su sistema de comercio o pasarela de pago para su autorización.

Antes de implementar pagos remotos DSRP, complete **Tokenización**. Consulte [Tokenizar una tarjeta](/nfc-wallet-sdk-ios/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 el 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

### Comprueba los requisitos previos

Confirme que la tarjeta digital admite el pago remoto DSRP mediante `DigitalCard.Details.isPaymentTypeSupported()` con `PaymentType.dsrp`.

```swift
func checkCardSupportForDSRP(card: DigitalCard) async throws -> Bool {
    return try await card.details.isPaymentTypeSupported(.dsrp)
}
```

### Crear los datos de entrada de pago DSRP

Antes de generar datos de pago DSRP, debe proporcionar los datos de entrada en `RemotePaymentInputData`.

```swift
func buildRemoteInputData() -> RemotePaymentSession.RemotePaymentInputData  {
    let amount = "000000500030"  // 5000.30 EUR en unidades menores
    let currencyCode = "978"     // numérico ISO 4217
    let countryCode = "840"      // numérico ISO 3166-1 (ejemplo: US)
    let unpredictableNumber = "12345"
    
    return RemotePaymentSession.RemotePaymentInputData(
        amount: amount,
        currencyCode: currencyCode,
        transactionType: .purchase,
        unpredictableNumber: unpredictableNumber,
        countryCode: countryCode,
        cryptogramType: .de55
    )
}
```

`RemotePaymentSession.RemotePaymentInputData` tiene los siguientes campos:

<table><thead><tr><th width="196">Datos de entrada</th><th width="120">Tipo</th><th width="150">Formato</th><th>Descripción</th></tr></thead><tbody><tr><td><code>amount</code></td><td>Cadena</td><td>Numérico, en unidades menores</td><td><strong>Obligatorio</strong><br>Importe de la transacción en unidades menores (sin separador decimal). Por ejemplo, 119.00 USD es <code>11900</code> (luego añada ceros a la izquierda si su integración requiere longitud fija).</td></tr><tr><td><code>currencyCode</code></td><td>Cadena</td><td>Numérico ISO 4217 de 3 dígitos</td><td><strong>Obligatorio</strong><br>Código de moneda de la transacción. Por ejemplo, USD es <code>840</code>.</td></tr><tr><td><code>countryCode</code></td><td>Cadena</td><td>Numérico ISO 3166-1 de 3 dígitos</td><td><strong>Obligatorio</strong><br>Código de país del comerciante. Por ejemplo, Estados Unidos es <code>840</code>.</td></tr><tr><td><code>transactionType</code></td><td>Enum</td><td><code>.purchase</code></td><td><strong>Obligatorio</strong><br>Tipo de transacción financiera. Para pagos DSRP, use <code>.purchase</code>.</td></tr><tr><td><code>cryptogramType</code></td><td>Enum</td><td><code>.ucaf</code> o <code>.de55</code></td><td><strong>Obligatorio</strong><br>Formato de datos del criptograma devuelto por el SDK.</td></tr><tr><td><code>unpredictableNumber</code></td><td>Cadena</td><td>Numérico</td><td><strong>Obligatorio</strong><br>Número aleatorio generado por el comerciante o la pasarela de pago.</td></tr></tbody></table>

### Generar datos de pago DSRP

En su aplicación de billetera digital, llame a `RemotePaymentSession.generateRemotePayment()`.

Esta API puede generar un error. Consulte [Maneja los errores](#handle-errors).

Si tiene éxito, la API devuelve `RemotePaymentOutputData` con los siguientes campos:

<table><thead><tr><th width="217">Parámetro</th><th>Descripción</th></tr></thead><tbody><tr><td><code>cryptogramData</code></td><td>Matriz de bytes que contiene la respuesta formateada. Esto puede ser datos UCAF o TLV para que el comerciante complete DE-55.</td></tr><tr><td><code>pan</code></td><td>PAN con cualquier <code>F</code> relleno eliminado (si lo hay).</td></tr><tr><td><code>panSequenceNumber</code></td><td>Número de secuencia del PAN (PSN) de la tarjeta utilizada.</td></tr><tr><td><code>track2EquivalentData</code></td><td>Elementos de datos de la pista 2 según ISO/IEC 7813 (excluyendo el sentinel de inicio, el sentinel de fin y el LRC): PAN, separador de campo (<code>D</code>), fecha de expiración (AAMM), código de servicio, datos discrecionales y <code>F</code> relleno opcional.</td></tr><tr><td><code>par</code></td><td>Referencia de cuenta de pago (PAR), si la proporciona la red de pago.</td></tr><tr><td><code>expirationDate</code></td><td>Fecha de expiración de la tarjeta.</td></tr><tr><td><code>cryptogramDataType</code></td><td>Formato del criptograma devuelto (UCAF o DE55).</td></tr></tbody></table>

### Maneja los errores

Si `generateRemotePayment()` lanza un error, considere que el pago ha fallado. Restablezca el estado de su interfaz. Guíe al usuario final hacia la siguiente mejor acción.

<table><thead><tr><th width="260">Error</th><th>Descripción</th></tr></thead><tbody><tr><td><code>deviceEnvironmentUnsafe</code></td><td>El dispositivo no cumple los requisitos de seguridad.</td></tr><tr><td><code>sessionInProgress</code></td><td>Otra sesión de pago aún se está ejecutando.</td></tr><tr><td><code>invalidInputData</code></td><td>Uno o más campos en <code>RemotePaymentInputData</code> faltan o tienen un formato incorrecto.</td></tr><tr><td><code>noPaymentKeys</code></td><td>No hay claves de pago disponibles para la transacción.</td></tr><tr><td><code>cardNotSupported</code></td><td>La tarjeta digital no admite el pago remoto DSRP.</td></tr><tr><td><code>cardNotActive</code></td><td>La tarjeta digital no está activa.</td></tr><tr><td><code>noDefaultCard</code></td><td>No se ha configurado ninguna tarjeta predeterminada.</td></tr><tr><td><code>clientError</code></td><td>El flujo de pago remoto falló debido a un error del lado del cliente (por ejemplo, un problema de red).</td></tr><tr><td><code>authenticationKeyInvalidated</code></td><td>Se deshabilitó el código de acceso del dispositivo y el almacenamiento seguro se borró.</td></tr><tr><td><code>biometricNotEnrolled</code></td><td>La biometría no está disponible o no está registrada.</td></tr></tbody></table>

{% hint style="info" %}
Cada error puede incluir un mensaje que explique el fallo. Úselo para la solución de problemas y el diagnóstico de soporte.
{% endhint %}

{% hint style="warning" %}
NFC Wallet SDK borra automáticamente las credenciales almacenadas cuando `authenticationKeyInvalidated` ocurre (por ejemplo, después de restablecer el código de acceso o de un cambio de seguridad).

Su aplicación debe guiar al usuario final durante el proceso de re-registro.
{% endhint %}

### Ejemplo completo de implementación

Use esta muestra de código para entender cómo encajan los pasos anteriores.

{% code expandable="true" %}

```swift
func generateDSRP(digitalCard: DigitalCard?) async {
    do {
        let remotePaymentSession = RemotePaymentSession()

        let amount = "000000500030"      // 5000.30 en unidades menores, rellenado con ceros a la izquierda hasta 12
        let currencyCode = "978"         // numérico ISO 4217 (EUR)
        let countryCode = "840"          // numérico ISO 3166-1 (ejemplo de US)
        let unpredictableNumber = "12345"

        let input = RemotePaymentSession.RemotePaymentInputData(
            amount: amount,
            currencyCode: currencyCode,
            transactionType: .purchase,
            unpredictableNumber: unpredictableNumber,
            countryCode: countryCode,
            cryptogramType: .de55
        )

        if let digitalCard {
            _ = try await remotePaymentSession.generateRemotePayment(
                withDigitalCardID: digitalCard.digitalCardID,
                remotePaymentInputData: input,
                userPrompt: "Autenticar"
            )
        } else {
            // Use la tarjeta digital predeterminada.
            _ = try await remotePaymentSession.generateRemotePayment(
                withDigitalCardID: nil,
                remotePaymentInputData: input,
                userPrompt: "Autenticar"
            )
        }
    } catch {
        guard let err = error as? RemotePaymentSession.Error else {
            return
        }

        switch err {
        case .deviceEnvironmentUnsafe:
            break
        case .sessionInProgress:
            break
        case .invalidInputData:
            break
        case .authenticationKeyInvalidated:
            break
        case .biometricNotEnrolled:
            break
        default:
            break
        }
    }
}
```

{% endcode %}


---

# 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-ios/es/implement-nfc-wallet/make-payments/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.
