> 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

## Resumen

El SDK de NFC Wallet admite pagos con código QR solo para tarjetas EMV PURE de marca blanca de Thales.

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

## Integración del SDK

### Comprobar 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)
}
```

### Crear los datos de entrada de pago QR

Crear `QRPaymentSession.QRPaymentInputData`. Contiene los parámetros de la transacción utilizados para construir la carga útil del pago por QR.

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

`QRPaymentSession.QRPaymentInputData` has the following fields:

<table><thead><tr><th width="138">Input data</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 primario.</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

In your digital wallet application, call `generateQRPaymentData` para generar la carga útil que se codificará en un código QR.

This API can throw an error. See [Manejar errores](#handle-errors).

On success, the API returns `QRPaymentOutputData` with the following fields:

<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>Vea <a href="#handle-status-word">Manejar palabra de estado</a></td><td><code>"000000500030"</code></td></tr><tr><td><code>cid</code></td><td>Datos de Información de Criptograma. Determina si se requiere 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 que incluye 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 utiliza para el pago.</td><td></td></tr><tr><td><code>cardMainAppTemplate</code></td><td>La Plantilla de Aplicación principal de la tarjeta que se utiliza para el pago.</td><td></td></tr><tr><td><code>cardAliasAid</code></td><td>El AID alternativo de la tarjeta que se utiliza 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 utiliza 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 no predeterminada para el pago con código QR pasando `digitalCardID` a `generateQRPaymentData`.
{% endhint %}

### Manejar palabra de estado

Siempre verifique `statusWord` antes de usar cualquier otro campo.

* `9000` indica una generación de carga útil exitosa. Puede leer los otros campos en `QRPaymentOutputData`.
* Otros valores indican un fallo. No use los otros campos en `QRPaymentOutputData`.

Consulte la tabla a continuación para 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 en el <code>QRPaymentOutputData</code> objeto están disponibles para obtener si el <code>cid</code> valor es <code>0x8x</code>.<br>Donde:</p><ul><li>El primer dígito indica "Solicitud de procesar la transacción en línea".</li><li>El segundo dígito indica la información CVM como Sin CVM requerido, CDCVM local introducido, CDCVM local requerido, 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>Verificación del cliente requerida debido a los valores CIAC y no se define ningún método en el Control de Aplicación.</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 excede el límite definido por el emisor de la tarjeta.</td></tr><tr><td>6986</td><td>El importe de la transacción excede el límite definido por el consumidor.</td></tr><tr><td>6985</td><td>Límite de ATC alcanzado o el AID seleccionado no se refiere a una aplicación de pago que cumpla esta especificación.</td></tr></tbody></table>

### Manejar errores

If `generateQRPaymentData` throws an error, treat the payment as failed. Reset your UI state. Guide the end user to the next best action.

<table><thead><tr><th width="274">Error</th><th>Descripción</th></tr></thead><tbody><tr><td><code>deviceEnvironmentUnsafe</code></td><td>The device does not meet the security requirements.</td></tr><tr><td><code>sessionInProgress</code></td><td>Another payment session is still running.</td></tr><tr><td><code>unsupportedPaymentType</code></td><td>La tarjeta digital no admite el pago con código QR.</td></tr><tr><td><code>invalidQRInputData</code></td><td>One or more fields in <code>QRPaymentInputData</code> are missing or malformed.</td></tr><tr><td><code>qrPaymentFailed</code></td><td>La carga útil no se puede generar debido a una falla interna.</td></tr><tr><td><code>authenticationKeyInvalidated</code></td><td>The device passcode was disabled and secure storage was wiped.</td></tr><tr><td><code>biometricNotEnrolled</code></td><td>Biometrics are unavailable or not enrolled.</td></tr></tbody></table>

{% hint style="info" %}
Each error can include a message that explains the failure. Use it for troubleshooting and support diagnostics.
{% endhint %}

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

Su aplicación debe guiar al usuario final a través del re-registro.
{% endhint %}

### Full implementation example

Use este ejemplo 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 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: "Authenticate")
        } else {
            // Pago con código QR con la tarjeta digital proporcionada
            return try await paymentSession.generateQRPaymentData(withQRPaymentInputData: inputData, digitalCardID: digitalCard?.digitalCardID, userPrompt: "Authenticate")
        }
        
    } catch {
        // Manejar 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 billetera digital es responsable de generar y mostrar la imagen del código QR usando la salida devuelta por el SDK de NFC Wallet.

Después de recibir `QRPaymentOutputData` para un pago con código QR, su aplicación de billetera 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 punto de venta.

{% hint style="info" %}
iOS admite la generación de códigos QR de forma nativa (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:

```
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>
```

The question should be specific, self-contained, and written in natural language.
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.
