> 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-qr-code-payment.md).

# Implementar pago con código QR

## Descripción general

NFC Wallet SDK solo admite pagos con código QR para tarjetas Thales white-label EMV PURE.

Antes de implementar pagos con código QR, complete **Tokenización**. Consulte [Tokenizar una tarjeta](/nfc-wallet-sdk-ios/es/implement-nfc-wallet/tokenize-a-card.md).

## Integración del SDK

### Comprueba los requisitos previos

Confirme que la tarjeta digital admite pagos con código QR usando `DigitalCard.Details.isPaymentTypeSupported()` con `PaymentType.qr`.

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

### Cree los datos de entrada del pago QR

Cree `QRPaymentSession.QRPaymentInputData`. Contiene los parámetros de la transacción utilizados para construir la carga útil del pago con código QR.

```swift
let amount   = "000000500030"  // 5000.30 EUR
let currency = "0978" // EUR
let aid      = "00000000000000000000000000000000"    // 16 bytes long
let idd      = "000000000000000000000000000000"      // 15 bytes long
let inputData = QRPaymentSession.QRPaymentInputData(amount: amount, currencyCode: currency, aid: aid, idd: idd)
```

`QRPaymentSession.QRPaymentInputData` tiene los siguientes campos:

<table><thead><tr><th width="138">Datos de entrada</th><th width="160">Formato</th><th width="169">Longitud</th><th>Descripción</th></tr></thead><tbody><tr><td><code>aid</code></td><td><p>Hexadecimal</p><p>ISO/IEC 7816-5</p></td><td>10 a 32 caracteres</td><td><p><strong>Obligatorio</strong></p><p>Use "0000000000" para permitir que el SDK use el AID principal.</p></td></tr><tr><td><code>amount</code></td><td>hexadecimal codificado en BCD</td><td>12 caracteres</td><td><p><strong>Obligatorio</strong></p><p>Importe de la transacción en formato BCD.</p><p>Un importe de 5.22 EUR tiene el valor “000000000522”.</p></td></tr><tr><td><code>currencyCode</code></td><td><p>ISO-4217</p><p>cadena numérica</p></td><td>4 caracteres</td><td><p><strong>Obligatorio</strong><br>Moneda de la transacción.</p><p>Use "0978" para EUR.</p></td></tr><tr><td><code>idd</code></td><td>Hexadecimal</td><td>30 caracteres</td><td><p><strong>Opcional</strong></p><p>Datos específicos del emisor</p></td></tr></tbody></table>

### Generar datos de pago QR

En su aplicación de billetera digital, llame a `generateQRPaymentData` para generar la carga útil que se codificará en un código QR.

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

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

<table><thead><tr><th width="220">Parámetro</th><th>Descripción</th><th data-hidden>Ejemplo</th></tr></thead><tbody><tr><td><code>statusWord</code></td><td>Palabra de estado de la transacción. <strong>9000</strong> indica éxito.<br>Consulte <a href="#handle-status-word">Manejar la palabra de estado</a></td><td><code>"000000500030"</code></td></tr><tr><td><code>cid</code></td><td>Datos de información del criptograma. Determina si se requiere un CDCVM para esta transacción.</td><td><code>"0978"</code></td></tr><tr><td><code>chipDataField</code></td><td>Campo de datos del chip calculado por NFC, incluido el criptograma.</td><td><code>"00000000000000000000000000000000"</code></td></tr><tr><td><code>condensedPaymentData</code></td><td>No aplicable</td><td></td></tr><tr><td><code>cardMainAid</code></td><td>El AID principal de la tarjeta que se usa para el pago.</td><td></td></tr><tr><td><code>cardMainAppTemplate</code></td><td>La plantilla principal de aplicación de la tarjeta que se usa para el pago.</td><td></td></tr><tr><td><code>cardAliasAid</code></td><td>El AID alternativo de la tarjeta que se usa para el pago.</td><td></td></tr><tr><td><code>cardAliasAppTemplate</code></td><td>La plantilla de aplicación alternativa de la tarjeta que se usa para el pago.</td><td></td></tr><tr><td><code>commonDataTemplate</code></td><td>La plantilla de datos comunes calculada durante el pago.</td><td></td></tr></tbody></table>

{% hint style="info" %}
Puede usar una tarjeta digital que no sea la predeterminada para el pago con código QR pasando `digitalCardID` en `generateQRPaymentData`.
{% endhint %}

### Manejar la palabra de estado

Compruebe siempre `statusWord` antes de usar cualquier otro campo.

* `9000` indica una generación correcta de la carga útil. Puede leer los demás campos en `QRPaymentOutputData`.
* Otros valores indican un fallo. No use los demás campos en `QRPaymentOutputData`.

Consulte la tabla siguiente para obtener más detalles:

<table><thead><tr><th width="225">Valor de la palabra de estado</th><th>Descripción</th></tr></thead><tbody><tr><td>9000</td><td><p>Una transacción exitosa. Todos los campos del <code>QRPaymentOutputData</code> objeto están disponibles para obtenerlos si el <code>cid</code> valor es <code>0x8x</code>.<br>Donde:</p><ul><li>El primer dígito indica "Solicitud para procesar la transacción en línea".</li><li>El segundo dígito indica la información CVM, como No CVM Required, Local CDCVM entered, Local CDCVM required, etc. Si el CID no está en el formato 0x8x, los campos están vacíos.</li></ul></td></tr><tr><td>6989</td><td>Se requiere verificación del cliente debido a valores CIAC y no se define ningún método en Application Control.</td></tr><tr><td>6988</td><td>No se permite un importe de transacción cero.</td></tr><tr><td>6987</td><td>El importe de la transacción supera el límite definido por el emisor de la tarjeta.</td></tr><tr><td>6986</td><td>El importe de la transacción supera el límite definido por el consumidor.</td></tr><tr><td>6985</td><td>Se alcanzó el límite ATC o el AID seleccionado no hace referencia a una aplicación de pago que cumpla con esta especificación.</td></tr></tbody></table>

### Maneja los errores

Si `generateQRPaymentData` 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="274">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>unsupportedPaymentType</code></td><td>La tarjeta digital no admite pagos con código QR.</td></tr><tr><td><code>invalidQRInputData</code></td><td>Uno o más campos en <code>QRPaymentInputData</code> faltan o tienen un formato incorrecto.</td></tr><tr><td><code>qrPaymentFailed</code></td><td>No se puede generar la carga útil debido a un fallo interno.</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 generateOutputData(digitalCard: DigitalCard?) async -> QRPaymentSession.QRPaymentOutputData? {
    do {
        let paymentSession = QRPaymentSession()
        // Use su importe máximo para los pagos con código QR, si corresponde.
        let amount   = "000000000000"
        let currency = "0000"
        let aid      = "00000000000000000000000000000000"
        let idd      = "000000000000000000000000000000"
        let inputData = QRPaymentSession.QRPaymentInputData(amount: amount, currencyCode: currency, aid: aid, idd: idd)
        
        if let digitalCard = digitalCard, try await digitalCard.isDefaultCard {
            // Pago con código QR con la tarjeta predeterminada
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, userPrompt: "Autenticar")
        } else {
            // Pago con código QR con la tarjeta digital proporcionada
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, digitalCardID: digitalCard?.digitalCardID, userPrompt: "Autenticar")
        }
        
    } catch {
        // Gestionar el error
        if let error = error as? QRPaymentSession.Error {
            switch error {
            case.deviceEnvironmentUnsafe(_): break
            case .sessionInProgress: break
            case .unsupportedPaymentType(_): break
            case .invalidQRInputData(_): break
            case .qrPaymentFailed(_): break
            case .authenticationKeyInvalidated(_): break
            case .biometricNotEnrolled(_): break
            @unknown default:
                break
            }
        } else {
            //
        }
        return nil
    }
}
```

{% endcode %}

### Generar y mostrar la imagen del código QR

Su aplicación de monedero digital es responsable de generar y mostrar la imagen del código QR usando la salida devuelta por NFC Wallet SDK.

Después de recibir `QRPaymentOutputData` para un pago con código QR, su aplicación de monedero digital debe:

1. Construir la carga útil del código QR.
2. Generar la imagen del código QR.
3. Mostrar la imagen del código QR para que el usuario final la presente en el POS.

{% hint style="info" %}
iOS admite de forma nativa la generación de códigos QR (Core Image).
{% endhint %}


---

# 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-qr-code-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.
