Processar um Estorno ou Cancelamento
Este guia explica como iniciar um estorno ou cancelar uma transação de pagamento existente usando o aplicativo Tap on Phone. Ambas as operações exigem o ID da transação original e usam uma estrutura de Intent semelhante às compras padrão.
Entendendo Estornos vs. Cancelamentos
Embora ambas as operações devolvam fundos ao cliente, elas têm diferentes casos de uso e restrições:
- Cancelamento: Reverte uma transação. A transação deve ser válida, aprovada e não ter sido estornada ou cancelada anteriormente. O usuário logado no app deve ter acesso de administrador.
- Estorno: Devolve fundos ao cliente após a transação ser totalmente processada. A transação deve ser válida, aprovada e não ter sido estornada ou cancelada anteriormente. O usuário logado no seu aplicativo deve ter acesso de administrador para realizar um estorno.
Pré-requisitos
Antes de processar um estorno ou cancelamento, certifique-se de que você tem:
- Um aplicativo Tap on Phone inicializado.
- O
userId,userTokenemerchantIdassociados à sessão atual. - O
transactionId(do sistema Tap on Phone) do pagamento aprovado original. - Configurou seu backend para gerenciar solicitações de autorização de
refundvia Single Sign-On (SSO) (consulte Integração de Backend: Gerenciando Solicitações de SSO).
Passo 1: Registrar o Activity Result Launcher
Registre um callback de Activity Result para gerenciar o resultado do processo de estorno ou cancelamento.
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)")
}
}Passo 2: Preparar os Metadados de SSO
Como os estornos são operações sensíveis, o backend do Tap on Phone os valida contra o seu backend usando SSO. Você deve passar o seu Client ID no campo operationMetadata para que a plataforma possa rotear a solicitação de autorização corretamente.
// Format your Client ID as a JSON string
val operationMetadata = "{\"ClientID\\":\"your-client-id-here\"}"Passo 3: Construir e Iniciar o Intent
Crie um intent explícito direcionado à POSActivity no aplicativo Tap on Phone.
Você deve especificar o transactionType (seja REFUND ou CANCEL) e fornecer o identificador da transação que deseja modificar no 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)
}Passo 4: Gerenciar o Resultado
Assim que você iniciar o intent, o aplicativo Tap on Phone assume o controle. Para um estorno, pode ser solicitado ao lojista que apresente o cartão de pagamento original.
Quando a operação for concluída, o seu callback modificationResultLauncher é executado. Inspecione o campo status para verificar se o estorno ou cancelamento foi aprovado e atualize seus registros de pedidos internos de acordo.
Próximos Passos
- Aprenda como extrair e analisar os dados do recibo retornados por essas operações em Gerenciar Resultados de Transações.