Configuración
Webhooks
Avise seus outros sistemas no momento em que algo acontece no Recaudo: um pagamento, um cliente novo, uma conversa atribuída.
Antes de começar
Você precisa de um endereço https no seu sistema que receba requisições POST com JSON. Os webhooks ficam em Configurações › Avançado › Webhooks (página Avisos para seus sistemas).
Adicionar um endereço
Cada endereço recebe só os eventos que você escolher.
-
Abra Webhooks
Acesse Configurações, abra Avançado, escolha Webhooks e clique em Novo endereço. -
Informe para onde avisar
Em Para onde avisar cole o Endereço web (deve começar com https) e, se quiser, um nome ou nota. Deixe marcado Enviar avisos para este endereço. -
Escolha o que avisar
Em O que avisar marque os eventos que interessam ou use Selecionar todos. -
Salve e copie a chave de assinatura
Clique em Salvar endereço. Aparece Guarde sua chave de assinatura (começa comwhsec_): copie para o seu sistema. -
Envie um teste
Use Enviar teste para receber um avisotest.webhooke confirmar que seu sistema responde.
Cuidado
A chave de assinatura é exibida uma única vez. Se perder, abra o detalhe do endereço e use Trocar chave de assinatura em Dados técnicos; a anterior deixa de valer.
Eventos disponíveis
Os eventos são agrupados por módulo. Alguns exemplos:
- Pagamentos e links de pagamento:
payment.succeeded,payment.failed,payment_link.paid. - Faturas e assinaturas:
invoice.paid,subscription.canceled. - Clientes e leads:
customer.created,lead.converted. - Conversas:
conversation.assigned,conversation.message.received. - CRM, acompanhamentos e fluxos:
deal.won,follow_up.completed,flow_run.completed.
Verificar a assinatura
Cada aviso traz o cabeçalho X-Recaudo-Signature com o horário (t) e uma assinatura HMAC-SHA256 (v1) de t.corpo feita com sua chave de assinatura. Calcule você mesmo e compare antes de confiar no aviso:
X-Recaudo-Signature: t=1760000000,v1=5f2b9c...
X-Recaudo-Event-Id: 9b1d2c3e-...
X-Recaudo-Event-Type: payment.succeeded
<?php
$secret = getenv('RECAUDO_WEBHOOK_SECRET'); // whsec_...
$payload = file_get_contents('php://input');
$header = $_SERVER['HTTP_X_RECAUDO_SIGNATURE'] ?? '';
parse_str(str_replace(',', '&', $header), $parts); // t=...&v1=...
$expected = hash_hmac('sha256', $parts['t'] . '.' . $payload, $secret);
if (! hash_equals($expected, $parts['v1'] ?? '') || abs(time() - (int) $parts['t']) > 300) {
http_response_code(400);
exit;
}
$event = json_decode($payload, true);
http_response_code(200);
const crypto = require('crypto');
// Usa el cuerpo crudo (raw body), no el JSON ya interpretado
function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const expected = crypto
.createHmac('sha256', secret)
.update(`${parts.t}.${rawBody}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1 || ''));
}
A estrutura de cada evento está na referência de webhooks da API.
Revisar envios e reenviar
Seu sistema deve responder com um código 2xx. Se não responder ou falhar, o Recaudo tenta de novo até 5 vezes, com esperas cada vez maiores.
-
Abra o detalhe
Na lista de endereços clique em Ver detalhe. -
Confira Envios recentes
Cada envio aparece como Recebido, Com falha ou Pendente, com o número da tentativa, os dados enviados e a resposta do seu sistema. -
Reenvie se precisar
Depois de corrigir o problema no seu sistema, use Reenviar no envio que falhou.
Importante
Não confunda com Configurações › Avançado › Registro de webhooks: ali ficam os avisos que seus gateways de pagamento mandam para o Recaudo, não os que o Recaudo manda para você.
Dica
Use
X-Recaudo-Event-Id para ignorar avisos repetidos: por causa das novas tentativas, o mesmo evento pode chegar mais de uma vez.Próximo passo
Esta página ajudou?
Obrigado por avisar.