Skip to main content
Os eventos de webhook não têm um campo de erro próprio. O conteúdo de data depende do recurso e da versão do webhook:
  • Nos eventos transaction.* da versão 1.1, data tem o mesmo formato da consulta da cobrança, com o estado do momento do evento. O motivo da recusa fica dentro desse objeto.
  • Nos eventos purchase.*, data traz só o resumo da Purchase, sem os cartões e sem o motivo. Consulte a Purchase para ver o motivo.
Esta página mostra onde ler o código em cada evento e como usá-lo no seu sistema.
Um erro de validação dos dados enviados recusa a requisição antes de criar a cobrança ou a Purchase, por isso não gera webhook. Esses erros estão em Erros da API de Charges e Erros da API de Purchases.

Onde está o motivo em cada evento

Campos de erro da cobrança

No evento transaction.failed da versão 1.1, o objeto data tem o mesmo formato da resposta de GET /v1/charges/{id}, com o estado da cobrança no momento do evento. Os campos de erro são:
Para mapear os erros no seu sistema, use error.declinedCode. Os campos networkDeniedReason e networkDeniedMessage trazem o código original de cada provedor e não têm uma lista fechada: eles servem para investigar um caso com o suporte, não para regras de negócio.
transactionRequests lista as tentativas da cobrança em cada provedor, da mais recente para a mais antiga. Quando um Fluxo Inteligente tenta mais de um provedor, cada tentativa recusada traz o próprio providerError.
A reprovação do antifraude não preenche error.declinedCode. O evento depende de quando o antifraude roda e das opções do provedor antifraude. Antes do adquirente, com captureOnReproved desligado, a cobrança fica failed e gera transaction.failed. Com captureOnReproved ligado, a cobrança segue para o adquirente apesar da reprovação, e o evento depende do status final. Depois da pré-autorização, a cobrança fica canceled, pre_authorized ou authorized, conforme as opções do provedor antifraude. Em todos os casos, o resultado fica em transactionRequests[].fraudAnalysis.status. Veja Reprovação do antifraude.

Exemplo de transaction.failed

Evento gerado no Sandbox por uma cobrança com cartão de final 3 (cartão expirado), conforme Teste sua integração. O exemplo mostra apenas os campos relevantes para o erro:
Em produção, networkDeniedReason e networkDeniedMessage trazem o código e a mensagem do provedor que processou a cobrança.

Recusa de uma Purchase com múltiplos cartões

O evento purchase.failed traz só o resumo da Purchase, sem a lista de cartões e sem o motivo. Ao receber o evento, consulte a Purchase e leia payments[].declineReason do cartão recusado.
1

Receba o evento

2

Consulte a Purchase

3

Leia o declineReason do cartão recusado

Trecho da resposta com o cartão recusado:
declineReason traz só o código, sem mensagem, e pode vir ausente. Os valores possíveis estão em Erros da API de Purchases. Quando o cartão tem chargeId, consulte a cobrança em GET /v1/charges/{id} para ver os detalhes da recusa no provedor. Sem chargeId, a cobrança não chegou a ser criada e o motivo disponível é o próprio declineReason.

Como mapear os erros no seu sistema

  1. Identifique o evento de falha: transaction.failed para cobranças e purchase.failed para Purchases.
  2. Leia o código padronizado: data.error.declinedCode na cobrança ou payments[].declineReason na Purchase.
  3. Decida a ação pela tabela de declinedCode, que indica se o código é retentável e o que orientar ao comprador.
  4. Trate um código que você não conhece, ou a ausência de código, como recusa genérica (generic). A Malga pode adicionar códigos novos. Nunca conclua que o pagamento foi aprovado só porque não há error ou declineReason: use o status.
  5. Para cobranças com antifraude, leia também transactionRequests[].fraudAnalysis.status.
  6. Guarde networkDeniedReason, networkDeniedMessage e o id da cobrança ou da Purchase para abrir um chamado com o suporte, se precisar.