Como o webhook é enviado
Cada evento é umPOST para a URL cadastrada no webhook, com o payload em JSON no corpo (Content-Type: application/json). A Kiwify acrescenta à URL o parâmetro de query signature:
signature é acrescentado com &.
- O
tokendo webhook não é enviado na requisição, nem em header, nem na query, nem no corpo. Ele é a chave usada para assinar. - Não há outros headers de autenticação.
- Redirecionamentos não são seguidos. Responda direto na URL cadastrada.
Validar a assinatura
signature é um HMAC-SHA1, em hexadecimal minúsculo (40 caracteres), calculado sobre o corpo da requisição exatamente como chegou, usando como chave o token cadastrado no webhook (campo token em Criar webhook, ou o token no painel).
Para validar:
- Leia o corpo cru (os bytes recebidos), antes de fazer o parse do JSON.
- Calcule
HMAC-SHA1(chave = token, mensagem = corpo cru)em hexadecimal. - Compare com o
signatureda query usando comparação em tempo constante. - Se forem diferentes, recuse a requisição (por exemplo, com
401).
Se o webhook não tiver
token, a assinatura é calculada com uma chave vazia e não prova nada. Cadastre sempre um token longo e aleatório.Vetor de teste
Exemplos
Reenvio, duplicidade e replay
- Uma resposta
2xxconfirma a entrega. Qualquer outro status, um redirecionamento ou falta de resposta em até 40 segundos contam como falha. - Entregas que falham são reenviadas automaticamente algumas vezes, com intervalo crescente (de 1 até 10 minutos). Você também pode reenviar manualmente em Ver logs.
- O mesmo evento pode chegar mais de uma vez. Trate cada evento de forma idempotente, usando a combinação
order_id+webhook_event_type. - A assinatura não inclui data/hora nem um identificador único da entrega. Ela prova que o corpo veio de quem tem o token e não foi alterado, mas não protege contra replay: uma requisição capturada e reenviada continua com assinatura válida. A deduplicação acima é o que protege contra replay. Para confirmar o estado atual de uma venda, consulte
GET /sales/{id}.
Trocar o token
Altere otoken no painel ou com Editar webhook. Os envios novos passam a ser assinados com o token novo na hora. Não existe período com os dois tokens válidos, e reenvios automáticos de entregas que falharam antes da troca ainda podem chegar assinados com o token antigo. Para trocar sem perder eventos:
- Faça seu servidor aceitar a assinatura do token antigo ou do novo.
- Troque o token na Kiwify.
- Depois que os reenvios pendentes terminarem (espere pelo menos um dia), deixe de aceitar o token antigo.
Testar Webhook
Testar Webhook, no painel, segue o mesmo contrato:POST em JSON, signature na query e HMAC-SHA1 do corpo com o token preenchido no formulário. Os dados do pedido são fictícios (ids aleatórios), e webhook_event_type e order_status correspondem ao evento escolhido.
Valores de webhook_event_type
O gatilho que você ativa no webhook e o valor que chega em webhook_event_type no payload nem sempre têm o mesmo nome:
O payload de carrinho abandonado tem outro formato (dados do carrinho, com
status próprio) e não traz webhook_event_type nem order_status.
Reembolso e chargeback em assinaturas
Reembolsar ou receber um chargeback de uma cobrança de assinatura cancela a assinatura automaticamente. Não é preciso cancelar em Assinaturas. Nenhuma cobrança futura é feita. Chegam dois webhooks (cada um só se o gatilho estiver ativo):- No reembolso,
subscription_canceledtrazcustomer_access.has_access: falseeaccess_untilna data do reembolso. Veja Eventos de assinatura. - No chargeback,
customer_accessnão é zerado:access_untilcontinua no fim do período pago. Remova o acesso a partir do eventochargeback, não decustomer_access. - Se a assinatura já estava cancelada,
subscription_cancelednão é enviado de novo.
Ambiente de testes
A Kiwify não tem ambiente sandbox nem modo de teste para a API ou para os webhooks. A API emhttps://public-api.kiwify.com sempre trabalha com dados reais.
- Para testar o recebimento de webhooks, use Testar Webhook, que envia dados fictícios.
- Consultar uma venda (
GET /sales/{id}) ou reembolsá-la (Reembolsar venda) só funciona com uma venda real da sua conta.
