Pular para o conteúdo principal

Webhooks — Eventos ASAAS

O Fast Delivery recebe notificacoes do ASAAS quando transferencias Pix sao processadas. Voce pode expor um endpoint proprio para receber esses eventos e reagir a eles no seu sistema.


Configuracao

URL do webhook

POST https://api-fastdelivery.obotzap.com/api/v1/webhooks/asaas

Este endpoint nao requer JWT. A autenticidade é verificada via assinatura HMAC-SHA256.

Header de autenticidade

HeaderDescricao
asaas-signatureHMAC-SHA256 do body com o ASAAS_WEBHOOK_SECRET
Seguranca

Sempre valide a assinatura antes de processar o payload. Nunca confie apenas no IP de origem.


Validando a assinatura

import hashlib
import hmac
from fastapi import Request, HTTPException

ASAAS_WEBHOOK_SECRET = "seu_webhook_secret"

async def verify_asaas_signature(request: Request) -> bytes:
body = await request.body()
signature = request.headers.get("asaas-signature", "")

expected = hmac.new(
ASAAS_WEBHOOK_SECRET.encode(),
body,
hashlib.sha256,
).hexdigest()

if not hmac.compare_digest(expected, signature):
raise HTTPException(status_code=401, detail="Assinatura invalida")

return body

Eventos

TRANSFER_DONE / TRANSFER_APPROVED

Transferencia Pix concluída com sucesso. O withdrawal.status e atualizado para completed.

{
"event": "TRANSFER_DONE",
"payment": {
"id": "tra_xxxxxxxxxxxx",
"status": "DONE",
"value": 50.00,
"description": "Saque Fast Delivery — motorista Carlos Silva",
"dateCreated": "2026-05-19",
"confirmedDate": "2026-05-19"
}
}

TRANSFER_FAILED / TRANSFER_CANCELLED

Transferencia falhou ou foi cancelada. O withdrawal.status e atualizado para failed.

{
"event": "TRANSFER_FAILED",
"payment": {
"id": "tra_xxxxxxxxxxxx",
"status": "FAILED",
"value": 50.00,
"description": "Saque Fast Delivery — motorista Carlos Silva",
"failReason": "Chave Pix invalida ou inexistente",
"dateCreated": "2026-05-19"
}
}

Resposta esperada

O endpoint deve retornar 200 OK em menos de 5 segundos. Qualquer outro status fara o ASAAS tentar reenviar.

{"received": true}
Processamento assincrono

Se o processamento for demorado, responda 200 imediatamente e enfileire o evento em background (Celery, RQ, etc.).


Tabela de eventos

EventoDescricaoAcao no sistema
TRANSFER_DONESaque concluidowithdrawal.status = completed
TRANSFER_APPROVEDSaque aprovado pelo bancoIdem (alias)
TRANSFER_FAILEDSaque falhouwithdrawal.status = failed, saldo revertido
TRANSFER_CANCELLEDSaque canceladoIdem ao FAILED