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 (
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:
-
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.
-
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 en transacciones con QR Code
- Implementar la impresión personalizada de comprobantes con el parámetro
automationSlip - Explorar los pagos en un solo paso para experiencias de pago más rápidas