Procesar un reembolso o cancelación
Esta guía explica cómo iniciar un reembolso o cancelar una transacción de pago existente utilizando la app Tap on Phone. Ambas operaciones requieren el ID de la transacción original y utilizan una estructura de Intent similar a las compras estándar.
Entender los reembolsos vs. cancelaciones
Aunque ambas operaciones devuelven fondos al cliente, tienen diferentes casos de uso y restricciones:
- Cancelación: Revierte una transacción. La transacción debe ser válida (excluidas las preautorizaciones), estar aprobada y no estar ya reembolsada o cancelada. El usuario que ha iniciado sesión en la app debe tener acceso de administrador.
- Reembolso: Devuelve los fondos al cliente una vez que la transacción se ha procesado por completo. La transacción debe ser válida (excluidas las preautorizaciones), estar aprobada y no estar ya reembolsada o cancelada. El usuario que ha iniciado sesión en la app debe tener acceso de administrador para realizar un reembolso.
Prerrequisitos
Antes de procesar un reembolso o cancelación, asegúrate de que tienes:
- Una app Tap on Phone inicializada.
- El
userId,userTokenymerchantIdasociados a la sesión actual. - El
transactionId(del sistema Tap on Phone) del pago original aprobado. - Haber configurado tu backend para gestionar las solicitudes de autorización de
REFUNDmediante Single Sign-On (SSO) (consulta Integración Backend: Gestión de Solicitudes de SSO).
Paso 1: Registrar el Activity Result Launcher
Registra un callback de Activity Result para gestionar el resultado del proceso de reembolso o cancelación.
val modificationResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val data = result.data
if (result.resultCode == Activity.RESULT_OK && data != null) {
val status = data.getStringExtra("status") ?: "None"
if (status == "APPROVED") {
println("Transaction successfully modified (Refunded/Canceled).")
// Extract receipt data for the refund/cancellation
} else {
val declineCause = data.getStringExtra("declineCause") ?: "Unknown"
println("Modification declined: $declineCause")
}
} else if (result.resultCode == Activity.RESULT_CANCELED) {
val errorCode = data?.getStringExtra("errorCode") ?: "None"
val errorMessage = data?.getStringExtra("errorMessage") ?: "User Canceled"
println("Operation failed or was canceled: $errorMessage ($errorCode)")
}
}Paso 2: Preparar los metadatos de SSO
Dado que los reembolsos son operaciones sensibles, el backend de Tap on Phone las valida frente a tu backend utilizando SSO. Debes pasar tu Client ID en el campo operationMetadata para que la plataforma pueda enrutar correctamente la solicitud de autorización.
// Format your Client ID as a JSON string
val operationMetadata = "{\"ClientID\\":\"your-client-id-here\"}"Paso 3: Construir e iniciar el Intent
Crea un intent explícito dirigido a la POSActivity en la app Tap on Phone.
Debes especificar el transactionType (ya sea REFUND o CANCEL) y proporcionar el identificador de la transacción que deseas modificar en el campo originalTransaction.
private fun performRefundOrCancel(originalTransactionId: Int, isRefund: Boolean) {
val intent = Intent().apply {
setClassName(
"com.dejamobile.cbp.sps.app",
"com.dejamobile.cbp.sps.app.POSActivity"
)
// Session Identifiers
putExtra("userId", userId)
putExtra("userToken", userToken)
putExtra("merchantId", merchantId)
// Specify the type: "REFUND" or "CANCEL"
val type = if (isRefund) "REFUND" else "CANCEL"
putExtra("transactionType", type)
// Pass the ID of the transaction to modify
putExtra("originalTransaction", originalTransactionId)
// Required for SSO authorization
putExtra("operationMetadata", operationMetadata)
}
// Launch the intent
modificationResultLauncher.launch(intent)
}Paso 4: Gestionar el resultado
Una vez que inicies el intent, la app Tap on Phone toma el control. Para un reembolso, se le puede solicitar al comercio que presente la tarjeta de pago original.
Cuando la operación finalice, se ejecuta tu callback modificationResultLauncher. Inspecciona el campo status para verificar que el reembolso o cancelación ha sido aprobada, y actualiza tus registros de pedidos internos en consecuencia.
Próximos pasos
- Aprende a extraer y analizar los datos del recibo devueltos por estas operaciones en Gestión de Resultados de Transacciones.