Pular para o conteúdo principal

Webhook de Cobrança

A A55 envia um POST para sua webhook_url sempre que o status de uma cobrança muda. O payload do webhook contém apenas os campos essenciais — use o UUID da cobrança para buscar os detalhes completos na API.

Campos do payload

CampoTipoDescrição
charge_uuidUUIDIdentificador único da cobrança
statusstringNovo status da cobrança (veja tabela abaixo)
transaction_referencestringID enviado pelo cliente / referência da transação do adquirente
subscription_uuidUUID ou nullIdentificador da assinatura — presente apenas se a cobrança pertencer a uma assinatura
payment_link_uuidUUID ou nullIdentificador do link de pagamento — presente apenas se a cobrança foi criada via link de pagamento

Exemplo de payload

{
"charge_uuid": "fe5e2c1e-b3fb-4cc4-bb28-004da37d5804",
"status": "confirmed",
"transaction_reference": "txn-abc-123",
"subscription_uuid": null,
"payment_link_uuid": null
}

Todos os status possíveis

StatusDescrição
confirmedTransação aprovada
pendingAguardando desafio 3DS
issuedCobrança emitida, aguardando processamento (ex: SDK Apple Pay)
canceledCancelada após emissão ou desafio 3DS não concluído
paidCobrança liquidada
errorTransação com erro ou recusada
refundedEstorno concluído
refund_errorErro durante o estorno
chargeback_refundedChargeback estornado
chargeback_requestedChargeback solicitado
chargeback_reversedChargeback revertido
pre_chargeback_resolutionPré-resolução de chargeback em andamento

Buscando os detalhes completos da cobrança

O payload do webhook é intencionalmente mínimo. Após recebê-lo, chame a API com seu Bearer token para obter o objeto completo da cobrança:

curl https://api.a55.tech/api/v1/bank/wallet/charge/{charge_uuid}/ \
-H "Authorization: Bearer $ACCESS_TOKEN"

A resposta é o objeto completo da cobrança com todos os campos, incluindo local_currency, currency, installments, action_url, applepay_payload e outros.

O webhook é o gatilho, a API é a fonte da verdade

Use o webhook para saber quando algo mudou, depois chame GET /api/v1/bank/wallet/charge/{uuid}/ para obter os detalhes completos. Nunca confie apenas na URL de redirecionamento — ela pode ser adulterada.

Exemplos de handler

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)
processed = set()
ACCESS_TOKEN = "seu_bearer_token"

@app.route("/webhook", methods=["POST"])
def charge_webhook():
data = request.get_json()
charge_uuid = data.get("charge_uuid")
status = data.get("status")

# Deduplicar
if charge_uuid in processed:
return jsonify(status="duplicate"), 200
processed.add(charge_uuid)

# Buscar detalhes completos da cobrança na API
charge = requests.get(
f"https://api.a55.tech/api/v1/bank/wallet/charge/{charge_uuid}/",
headers={"Authorization": f"Bearer {ACCESS_TOKEN}"},
).json()

# Rotear por status
if status == "confirmed":
fulfil_order(charge)
elif status == "error":
notify_customer(charge)
elif status == "refunded":
credit_customer(charge)
elif status in ("chargeback_requested", "chargeback_refunded"):
flag_for_review(charge)

return jsonify(status="accepted"), 200

Boas práticas

PráticaPor quê
Retorne 200 imediatamenteEvita timeouts e entregas duplicadas
Processe em backgroundMantém o tempo de resposta abaixo de 30 s
Deduplique por charge_uuidTrata webhooks retentados com segurança
Busque os detalhes completos via APIO payload do webhook é mínimo por design
Registre os payloads brutosFacilita depuração sem reenvio