Realizar una transacción con QR
El comercio debe tener dado de alta el pago con QR para sus tiendas antes de utilizar este flujo. Sin este alta, los métodos de pago QR no estarán disponibles.
Una vez el comercio está habilitado para pago con QR, se puede realizar una transacción siguiendo estos pasos.
Paso a paso
- Obtener los métodos de pago disponibles: Llamar a
GetPaymentMethodsUseCase().doExecute()con el monto y el tipo de operación para obtener la lista de tipos de QR disponibles (por ejemplo QR_ARG, QR_BRA). - Mostrar los tipos en la UI: Filtrar solo los métodos que contienen "QR" y presentarlos al usuario para que seleccione cuál desea generar.
- Persistir el QR: Tras la selección, invocar
persistQrenQrPaymentViewModelcon el monto, elOperationFlowy el tipo de QR elegido (no la moneda). - Mostrar el código QR: La respuesta de
persistQrtrae un bitmap en base64 (qrImageBase64). Decodificarlo y dibujarlo en pantalla. - Consultar el estado del pago: En paralelo, llamar a
checkQrStatuscon elqrIdde la respuesta para consultar el resultado. Reaccionar aAPPROVEDoREJECTED. Si el estado es otro, volver a consultarcheckQrStatushasta obtener un resultado final.
Ejemplo: Obtener métodos de pago
GetPaymentMethodsUseCase().doExecute(
amount = operationFlow.amount?.total ?: "3000",
operationType = OperationType.PAYMENT
)
.flowOn(Dispatchers.IO)
.collect { methods ->
paymentMethods = methods.filter { it.contains("QR", ignoreCase = true) }
}Ejemplo: Persistir el QR tras la selección
qrPaymentViewModel.resetQrPaymentState()
qrPaymentViewModel.persistQr(
amount = amount, // Ej: "30,00"
operationFlow = operationFlow,
type = selectedType // Tipo de QR: "QR_ARG", "QR_BRA", etc. (no la moneda)
)Ejemplo: Decodificar y mostrar el bitmap
when (val qrData = persistQrState.value) {
is Resource.Success -> {
val content = qrData.content
content?.qrImageBase64?.let { base64 ->
qrBitmap = createBitmapFromBase64(base64, 350, 350)
}
val qrId = content?.qrId ?: ""
qrPaymentViewModel.checkQrStatus(
QrStatusRequest(
merchantId = merchantId,
qrId = qrId,
operationType = "PAYMENT"
)
)
}
// ...
}Ejemplo: Reconsultar cuando el estado no es aprobado ni rechazado
qrPaymentStatus.value?.let { response ->
when (response.status) {
"APPROVED" -> { /* Pago aprobado */ }
"REJECTED" -> { /* Pago rechazado */ }
else -> {
persistQrState.value?.let { qrData ->
qrPaymentViewModel.checkQrStatus(
QrStatusRequest(
merchantId = merchantId,
qrId = qrData.content?.qrId ?: "",
operationType = "PAYMENT"
)
)
}
}
}
}Tipos de QR y etiquetas sugeridas
| Tipo | Etiqueta sugerida |
|---|---|
| QR_ARG | QR Argentina |
| QR_BRA | PIX Brasil |
| Prisma | Código QR |