Docs/Guias/Webhooks
DashboardGitHub

Webhooks

A Dyvit recebe notificações em tempo real de três fontes: WhatsApp (mensagens de devedores), Mercado Pago (confirmações de pagamento Pix) e Stripe (eventos de billing). Cada webhook possui verificação de assinatura e trilha de auditoria.

ℹ️

Esses webhooks são endpoints internos da Dyvit, chamados diretamente pelos provedores (Meta, Mercado Pago, Stripe). Você não precisa configurá-los na sua integração. Esta página documenta o funcionamento para fins de transparência e troubleshooting.


WhatsApp (Meta Cloud API)

#

Quando um devedor responde via WhatsApp, a Meta envia a mensagem para o endpoint da Dyvit. O agente de IA processa a mensagem e responde automaticamente.

POST/api/whatsapp/webhook

Verificação de assinatura

A Meta assina cada payload com HMAC-SHA256 usando o webhook secret configurado. A Dyvit valida o header x-hub-signature-256 antes de processar qualquer mensagem.

Payload de exemplo (mensagem de texto)

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
      "changes": [
        {
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "display_phone_number": "5511999999999",
              "phone_number_id": "PHONE_NUMBER_ID"
            },
            "contacts": [
              {
                "profile": { "name": "Maria Silva" },
                "wa_id": "5511987654321"
              }
            ],
            "messages": [
              {
                "from": "5511987654321",
                "id": "wamid.HBgNNTUxMTk4NzY1NDMyMRUCABIY...",
                "timestamp": "1711036800",
                "type": "text",
                "text": {
                  "body": "Oi, quero negociar minha dívida"
                }
              }
            ]
          },
          "field": "messages"
        }
      ]
    }
  ]
}

Tipos de mensagem suportados

TipoProcessamento
textEnviado diretamente ao agente de IA para resposta
audio / voiceTranscrito via Whisper e processado como texto
Outros (imagem, vídeo, documento)Ignorados com log de debug

Verificação do webhook (challenge)

A Meta exige um endpoint GET para verificar a propriedade do webhook durante a configuração:

GET/api/whatsapp/webhook

A Meta envia os query params hub.mode, hub.verify_token e hub.challenge. A Dyvit valida o verify_token e retorna o challenge como resposta.


Mercado Pago / Pix

#

Quando um devedor paga via Pix, o Mercado Pago envia uma notificação instantânea (IPN) para a Dyvit. Este é o webhook que dispara todo o fluxo de confirmação de pagamento.

POST/api/payments/webhook

Payload de exemplo

{
  "action": "payment.updated",
  "data": {
    "id": "82347691205"
  }
}

O campo data.id é o ID do pagamento no Mercado Pago. A Dyvit busca os detalhes completos via API do Mercado Pago para confirmar status e valor antes de marcar como pago.

Ações processadas

AçãoProcessamento
payment.updatedBusca detalhes do pagamento e processa
payment.createdBusca detalhes do pagamento e processa
Outras açõesIgnoradas (retorna 200 sem processamento)

Idempotência

Cada webhook é deduplicado pela combinação (source, externalId, action). Se o Mercado Pago reenviar a mesma notificação, a Dyvit ignora o duplicado e retorna 200.


Fluxo pós-pagamento

#

Quando o webhook do Mercado Pago confirma um pagamento aprovado, a Dyvit executa automaticamente seis etapas:

1.Webhook validado: assinatura HMAC verificada, evento registrado na tabela WebhookEvent.
2.Payment atualizado para PAID: o registro de pagamento no banco é marcado como pago com data e hora.
3.Debt atualizada para PAID: a dívida associada ao pagamento é marcada como quitada.
4.Confirmação via WhatsApp: o agente envia mensagem automática ao devedor confirmando o recebimento do pagamento.
5.Termo de Quitação gerado: documento de quitação (CDC Art. 42) é criado com protocolo único e armazenado no servidor.
6.Email via Resend: o Termo de Quitação é enviado por email ao devedor (quando email disponível) via cobranca@dyvit.ai.
ℹ️

As etapas 4, 5 e 6 são executadas em modo best-effort. Se o envio do WhatsApp ou do email falhar, o pagamento permanece confirmado. Nenhuma falha nas notificações reverte o status do pagamento.


Stripe (Billing)

#

Eventos de billing (assinatura criada, pagamento de plano, cancelamento) são recebidos via webhook do Stripe.

POST/api/billing/webhook

O Stripe envia o payload completo do evento. A Dyvit verifica a assinatura via stripe-signature header usando constructEvent do SDK do Stripe.

Idempotência

Assim como o Mercado Pago, cada evento do Stripe é deduplicado por (source, externalId, action) na tabela WebhookEvent.


Segurança dos webhooks

#

Cada provedor usa um mecanismo diferente de verificação. A tabela abaixo resume como a Dyvit valida cada um:

ProvedorMétodo de verificaçãoHeaderAlgoritmo
WhatsApp (Meta)HMAC do payload completox-hub-signature-256HMAC-SHA256
Mercado PagoHMAC do manifest (id + request-id + timestamp)x-signature + x-request-idHMAC-SHA256
StripeAssinatura do SDK (constructEvent)stripe-signatureHMAC-SHA256 (via Stripe SDK)

Detalhes de verificação por provedor

WhatsApp: a Dyvit calcula sha256=HMAC(secret, rawBody) e compara com o header x-hub-signature-256 usando timingSafeEqual para prevenir timing attacks.

Mercado Pago: o Mercado Pago envia o header x-signature no formato ts=...,v1=.... A Dyvit reconstrói o manifest id:{dataId};request-id:{xRequestId};ts:{ts}; e compara o HMAC com v1 usando timingSafeEqual.

Stripe: a Dyvit usa stripe.webhooks.constructEvent(rawBody, signature, webhookSecret) do SDK oficial, que lida com verificação e parsing internamente.

🚨

Nunca exponha os webhook secrets. Os secrets WHATSAPP_WEBHOOK_SECRET, MERCADOPAGO_WEBHOOK_SECRET e STRIPE_WEBHOOK_SECRET devem ser armazenados exclusivamente em variáveis de ambiente no servidor. Nunca os inclua em código frontend, repositórios públicos ou logs.


Trilha de auditoria

#

Todos os webhooks (WhatsApp, Mercado Pago e Stripe) são registrados na tabela WebhookEvent com os seguintes campos:

CampoDescrição
sourceProvedor: WHATSAPP, MERCADOPAGO ou STRIPE
externalIdID do evento no provedor
actionAção recebida (ex: payment.updated, invoice.paid)
statusRECEIVED, PROCESSED, FAILED ou IGNORED
payloadPayload completo recebido (JSON serializado)
errorMessageMensagem de erro, se aplicável
processedAtTimestamp de quando o processamento foi concluído

Essa tabela permite rastrear cada webhook recebido, identificar falhas e reprocessar eventos quando necessário.


Respostas e retries

#
ProvedorResposta esperadaComportamento de retry
WhatsAppHTTP 200 em até 5 segundosMeta reenvia se não receber 200
Mercado PagoHTTP 200Mercado Pago reenvia até receber 200
StripeHTTP 200Stripe reenvia com backoff exponencial por até 3 dias
⚠️

A Dyvit processa o webhook de forma assíncrona e retorna 200 imediatamente. Isso evita timeouts e garante que os provedores não reenviem notificações desnecessariamente.