Como funciona
Toda transação eventualmente envia um POST para apostbackUrl que você forneceu na criação. O envelope é sempre tipado:
- Cash-in (cobrança recebida) →
{ "cashin": { ... } } - Cash-out (pagamento enviado) →
{ "cashout": { ... } }
Cash-in (recebimento confirmado)
Status possíveis
| Status | Significado |
|---|---|
paid | Cliente pagou. Saldo da conta é creditado. |
refunded | Cliente fez devolução (BACEN) ou transação entrou em revisão MED. Saldo estornado. |
expired | QR Code expirou sem pagamento (após 24h, status terminal). |
MED / Bloqueio por infração BACEN
Quando uma transaçãopaid entra em revisão MED (chargeback), você recebe um webhook adicional com status=refunded e um campo extra event indicando o motivo:
value_centsreflete o valor bruto da transação (não o líquido creditado) — é o que o BACEN tira da Paysure.- A devolução é irreversível pelo seu sistema: bloqueie/estorne o saldo do cliente final imediatamente.
- Atualizações posteriores da disputa (vitória, derrota, cancelamento) não disparam novo webhook — são tratadas internamente.
Webhooks de MED só são enviados pra contas marcadas como sub-gateway (PSPs que repassam transações pra clientes finais). Se você opera direto com pagadores e não gerencia clientes finais, ignore essa seção. Pra habilitar como sub-gateway, fale com suporte@paysurebr.com.
Cash-out (pagamento enviado)
Status possíveis
| Status | Significado |
|---|---|
paid | Pagamento concluído pelo banco do destinatário. |
refunded | Não foi possível concluir. Saldo é estornado automaticamente — você não precisa fazer nada. |
Boas práticas
Responda HTTP 200 sempre
Responda HTTP 200 sempre
Qualquer status diferente de 200 faz a Paysure retentar. Mesmo se você não reconhece o evento, devolva 200 com
{"ok": true}.Use o reference_code como idempotency key
Use o reference_code como idempotency key
Webhooks podem ser entregues mais de uma vez (em caso de retry após timeout). Use
cashin.reference_code ou cashout.reference_code pra deduplicar do seu lado.Valide a origem
Valide a origem
A Paysure envia webhooks de IPs Cloudflare. Se quiser camada extra de segurança, valide o IP de origem ou implemente uma assinatura HMAC compartilhada (em breve).
Timeout
Timeout
Respondemos em até 10 segundos antes de considerar timeout e retentar. Mantenha o handler rápido — processe em background se precisar de operações pesadas.
Política de retry
Em caso de falha (HTTP != 200 ou timeout), retentamos com backoff:- 1ª tentativa: imediata
- 2ª tentativa: ~5 minutos
- 3ª tentativa: ~30 minutos
client_error e fica disponível pra retry manual via painel.
