Pular para o conteúdo principal

Webhook de Cobrança

Quando o status de uma cobrança muda, a A55 envia um POST com um corpo JSON para a sua webhook_url.


Campos do payload

CampoTipoDescrição
charge_uuidstring (UUID)Identificador da cobrança
statusstringStatus atual: confirmed, error, refunded, chargeback_requested, chargeback_refunded
transaction_referencestringSua referência externa (se fornecida na criação)
subscription_uuidstringIdentificador da assinatura (se aplicável)
amountnumberValor da cobrança
currencystringCódigo de moeda ISO
created_atstringTimestamp de criação (ISO 8601)
updated_atstringTimestamp da última atualização (ISO 8601)

Exemplos de payload por status

{
"charge_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "confirmed",
"transaction_reference": "ord_001",
"amount": 100.50,
"currency": "BRL",
"created_at": "2026-03-20T10:00:00Z",
"updated_at": "2026-03-20T10:00:15Z"
}

Código de tratamento

import json, os
from flask import Flask, request, Response

app = Flask(__name__)

@app.route("/webhooks/a55", methods=["POST"])
def handle_charge_webhook():
raw = request.get_data()
sig = request.headers.get("X-Webhook-Signature", "")
ts = request.headers.get("X-Webhook-Timestamp", "")

if not verify_signature(raw, sig, ts, os.environ["WEBHOOK_SECRET"]):
return Response(status=401)

event = json.loads(raw)
charge_uuid = event["charge_uuid"]
status = event["status"]

if already_processed(charge_uuid, status):
return Response(status=200)

if status == "confirmed":
fulfill_order(charge_uuid)
elif status == "error":
notify_payment_failed(charge_uuid)
elif status == "refunded":
process_refund(charge_uuid)
elif status == "chargeback_requested":
flag_chargeback(charge_uuid)

mark_processed(charge_uuid, status)
return Response(status=200)

Boas práticas

PráticaPor quê
Verifique a assinatura HMAC primeiroPrevina eventos forjados
Retorne 200 imediatamenteEvite timeouts e retentativas
Processe em fila de backgroundTrabalho pesado não deve bloquear o handler HTTP
Deduplicar por charge_uuid + statusEntrega at-least-once significa que duplicatas são possíveis
Registre payloads brutosTrilha de auditoria para debugging
Nunca confie no status vindo apenas da URL de redirectSempre confirme via webhook