Realizar una transacción con QR

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

  1. 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).
  2. 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.
  3. Persistir el QR: Tras la selección, invocar persistQr en QrPaymentViewModel con el monto, el OperationFlow y el tipo de QR elegido (no la moneda).
  4. Mostrar el código QR: La respuesta de persistQr trae un bitmap en base64 (qrImageBase64). Decodificarlo y dibujarlo en pantalla.
  5. Consultar el estado del pago: En paralelo, llamar a checkQrStatus con el qrId de la respuesta para consultar el resultado. Reaccionar a APPROVED o REJECTED. Si el estado es otro, volver a consultar checkQrStatus hasta 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

TipoEtiqueta sugerida
QR_ARGQR Argentina
QR_BRAPIX Brasil
PrismaCódigo QR