# Pago con QR Code

En esta guía aprendes a iniciar y procesar pagos con QR Code mediante la integración App2App de Getnet en terminales Android. El pago con QR Code es una opción sin contacto que el cliente completa desde su billetera móvil.

## Antes de comenzar

Antes de comenzar, asegúrate de tener:

* **Polling completado**: haz una [llamada de Polling](/es/app2app/first-steps-a2a/create-polling-guide) (`getnet://payment/v1/polling`) para verificar que la Getnet Payment App está bien conectada y lista para recibir comandos.
* **Aplicación de Getnet instalada** en el terminal.

> **Limitaciones de parámetros**: funciones como propinas (`tip`), cuotas (`installments`) e IDs de plan (`planId`) no son compatibles con el flujo QR. La Payment App las ignora si las envías.

## Paso 1: Configura y envía el Intent de pago

Para procesar un pago con QR Code, configura el Intent con los parámetros obligatorios y define `paymentMethod` con el valor `"2"`, que corresponde a QR Code.

Esta tabla describe los parámetros que debes incluir en la solicitud de pago:

| Parámetro | Tipo | Obligatorio | Descripción |
| :--- | :--- | :--- | :--- |
| `amount` | String | Sí | Monto de la transacción (con dos decimales implícitos; por ejemplo, "10000" = \$100.00) |
| `receiptCode` | String | Sí | ID impreso en el comprobante para el seguimiento del comercio. |
| `callerId` | String | No | Identificador único para correlacionar la solicitud con la respuesta |
| `paymentMethod` | String | Sí | Define `"2"` para activar el flujo de pago con QR Code |
| `skipReceipt` | String | No | Define `"true"` para omitir la pantalla del comprobante del cliente después de la aprobación |
| `allowPrintCurrentTransaction` | String | No | Define `"true"` para que Getnet imprima el comprobante (predeterminado); `"false"` para recibir los datos del comprobante sin procesar |

Esta es la implementación completa:

```
private val REQUEST_CODE = 1001  

override fun onCreate(savedInstanceState: Bundle?) {      
    super.onCreate(savedInstanceState)
    
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://payment/v1/payment"))
    intent.putExtra("amount", "10000")           // $100.00
    intent.putExtra("receiptCode", "000123")
    intent.putExtra("callerId", "qr_payment_001")
    intent.putExtra("paymentMethod", "2")        // 2 = QR Code
    
    startActivityForResult(intent, REQUEST_CODE)
}
```

## Paso 2: Sigue el flujo de la interfaz del terminal

Cuando envías el intent, la Getnet Payment App toma el control de la interfaz. Debes tener en cuenta los siguientes tiempos de espera:

1. **Visualización del QR (pantalla A)**: el terminal muestra el QR Code durante 180 segundos. Si nadie lo escanea en ese plazo, la transacción expira.

2. **Procesamiento (pantalla B)**: después del escaneo, la app espera hasta 60 segundos a que la billetera externa autorice el pago.

## Paso 3: Extrae la respuesta

El terminal Getnet devuelve el resultado de la transacción mediante `onActivityResult`.

Este es un ejemplo de respuesta de un pago con QR Code exitoso:

```
{
  "result": "0",
  "resultDetails": "APPROVED",
  "amount": "10000",
  "nsu": "57003",
  "callerId": "qr_payment_001",
  "authorizationCode": "004433",
  "gmtDateTime": "0115164500",
  "paymentType": "QRCODE"
}
```

**Parámetros de respuesta**

La respuesta incluye los siguientes campos con información importante de la transacción:

| Campo | Descripción |
| :--- | :--- |
| result | Código de estado de la transacción: `"0"` (éxito), `"1"` (rechazada), `"2"` (cancelada), `"3"` (error), `"4"` (desconocido) |
| resultDetails | Mensaje detallado sobre el resultado de la transacción (por ejemplo, "APPROVED", "TIMEOUT") |
| paymentType | Medio de pago usado. En pagos con QR Code, el valor es `"QRCODE"` |
| nsu | Código de autorización de la transacción de Getnet (NSU). Guárdalo para la conciliación y las devoluciones |
| authorizationCode | Código de autorización entregado por el procesador de pagos |
| amount | Monto final procesado de la transacción |
| gmtDateTime | Fecha y hora GMT en que se procesó la transacción (formato: MMDDhhmmss) |
| callerId | Devuelve el identificador único enviado en la solicitud original |

Así extraes estos campos en tu código:

```
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val extras = data?.extras
        
        val result = extras?.getString("result")                // "0" = Success
        val resultDetails = extras?.getString("resultDetails")  // e.g., "APPROVED"
        val nsu = extras?.getString("nsu")                      // Getnet Reference
        val authCode = extras?.getString("authorizationCode")   // Authorization Code
        val paymentType = extras?.getString("paymentType")      // Will be "QRCODE"
    }
}
```

## Siguientes pasos

Ahora que implementaste pagos con QR Code, puedes:

- Aprender a procesar [devoluciones y cancelaciones](/es/app2app/core-concept-a2a/refund-and-cancellation) en transacciones con QR Code
- Implementar la [impresión personalizada de comprobantes](/es/app2app/core-concept-a2a/printing-responsibility) con el parámetro `automationSlip`
- Explorar los [pagos en un solo paso](/es/app2app/payment-guides-a2a/create-single-step-payment) para experiencias de pago más rápidas