Segurança, testes e novas tentativas
Como proteger o link do webhook de entrada, o endereço de saída e a requisição externa, como testar sem sistema pronto, tratar repetições e achar os erros.
Cada forma de troca de dados tem um ponto que precisa de cuidado: o link do webhook de entrada, o endereço que recebe o webhook de saída, o endpoint da requisição externa e a chave da API. Esta página reúne o que fazer em cada caso, como testar antes de ter o sistema pronto, como tratar o mesmo evento chegando duas vezes e onde ver os erros.
O que proteger
| Recurso | O que dá acesso | O que fazer |
|---|---|---|
| Webhook de entrada | O link copiado em Obter Link | Guardar fora do código e longe do navegador. Se vazar, trocar. |
| Webhook de saída | O endereço em Notificar este URL | Usar https:// e um caminho difícil de adivinhar. |
| Requisição externa | O endereço em Request URL | Mandar um segredo seu num cabeçalho e conferir no servidor. |
| API | A chave de API da conta | Guardar em variável de ambiente e chamar só do servidor. Veja Autenticação com a chave de API. |
O link do webhook de entrada é um segredo
O link não pede chave: quem tem o link cria contatos com qualquer telefone ou e-mail e inicia o fluxo do webhook. Se o fluxo manda mensagens, o link nas mãos erradas faz a sua conta mandar mensagens para quem não pediu.
- Não ponha o link no HTML nem no JavaScript do site: quem abre a página vê o código. Mande os dados do formulário para o seu servidor, e o servidor manda para a NexTags. Veja o exemplo em Exemplos: Hotmart, Kiwify, Shopify e formulários.
- Guarde o link numa variável de ambiente, como
NEXTAGS_WEBHOOK_URL, e não em repositórios, prints ou chamados abertos. - A tela do webhook de entrada não tem campo para conferir a assinatura ou o token de quem envia, como o cabeçalho
X-HOTMART-HOTTOKda Hotmart ou o parâmetrosignatureda Kiwify. Quem precisa dessa conferência recebe o webhook num servidor próprio, confere a assinatura e repassa os dados para a NexTags.
Se o link vazar
O menu do webhook de entrada tem só Obter Link, Renomear e Excluir: não há um botão para gerar outro link para o mesmo webhook. Para trocar:
- Em Ferramentas › Webhooks de entrada, clique em Adicionar Novo e crie outro webhook. Ele vem com um link novo.
- Refaça a configuração: Sample JSON, os caminhos, os campos e o fluxo.
- Troque o link no sistema que envia os dados e faça um envio de teste.
- No webhook antigo, desligue o interruptor Ativo e depois clique em Excluir.
Webhook de saída
- O endereço em Notificar este URL precisa começar com
https://. Comhttp://, a tela mostra "The URL must start with https". Sem nada no começo, o app completa comhttps://ao salvar. - O formato do aviso (método, corpo, cabeçalhos e se há assinatura) não aparece na tela. Antes de escrever o código, aponte o webhook para um endereço de teste e veja o que chega (veja Como testar).
- Use no endereço um caminho difícil de adivinhar, como
https://seusistema.exemplo.com.br/webhooks/nextags/c8f2e1d94b7a, e recuse no seu servidor os outros caminhos. - Trate o aviso como um sinal. Se a decisão depende de dados confiáveis, como liberar um acesso, consulte o contato pela API antes de agir. Veja Consultar contato.
Requisição externa
- Crie na aba Cabeçalhos um cabeçalho com um segredo seu, como
X-Segredo, e confira o valor no servidor. Sem o segredo certo, responda401. Para não espalhar o segredo pelos fluxos, guarde num campo do bot: veja Campos do bot. - A NexTags manda o cabeçalho
X-USER-ID, com o ID do contato, em toda requisição. Use para saber de que contato é a chamada, mas não como prova de origem: qualquer um consegue mandar esse cabeçalho. A prova é o seu segredo. - Use um endereço
https://, para o segredo e os dados do contato não viajarem abertos. - O campo do sistema
{{page_api_key}}traz a chave de API da conta. Mande essa chave só para a API da NexTags ou para sistemas seus, nunca para sistemas de terceiros. Veja Campos do sistema.
A conferência do segredo, com comparação em tempo constante:
import { timingSafeEqual } from 'node:crypto';
// true quando o cabeçalho X-Segredo tem o valor da variável NEXTAGS_SEGREDO
export function segredoConfere(req) {
const esperado = Buffer.from(process.env.NEXTAGS_SEGREDO ?? '');
const recebido = Buffer.from(String(req.headers['x-segredo'] ?? ''));
return esperado.length > 0 && esperado.length === recebido.length && timingSafeEqual(esperado, recebido);
}
import hmac
import os
def segredo_confere(cabecalhos):
"""True quando o cabeçalho X-Segredo tem o valor da variável NEXTAGS_SEGREDO."""
esperado = os.environ.get("NEXTAGS_SEGREDO", "").encode()
recebido = cabecalhos.get("X-Segredo", "").encode()
return bool(esperado) and hmac.compare_digest(esperado, recebido)
<?php
// true quando o cabeçalho X-Segredo tem o valor da variável NEXTAGS_SEGREDO
function segredoConfere(): bool
{
$esperado = (string) getenv('NEXTAGS_SEGREDO');
$recebido = $_SERVER['HTTP_X_SEGREDO'] ?? '';
return $esperado !== '' && hash_equals($esperado, $recebido);
}
O servidor completo está em Requisição externa: o fluxo chama o seu sistema.
Responda rápido e trate repetições
| Situação | O que fazer |
|---|---|
| O seu servidor demora para responder | Responda logo e deixe o trabalho pesado para depois, numa fila. O contato espera a resposta para seguir no fluxo, e o tempo limite da requisição externa não está publicado. |
| O mesmo evento chega duas vezes no seu sistema | Guarde um identificador de cada evento processado e ignore o que já viu. Não está documentado se a NexTags manda de novo um aviso que falhou: deixe o código pronto para receber o mesmo aviso mais de uma vez. |
| A plataforma manda o mesmo pedido duas vezes para o webhook de entrada | O contato não se repete (ele é achado pelo telefone ou pelo e-mail), mas o fluxo pode rodar de novo. No fluxo, aplique uma etiqueta, como "Boas-vindas enviadas", e confira com uma condição antes de mandar a mensagem. Veja Etapa Condição. |
| A outra plataforma desativa o webhook depois de erros | A Hotmart desativa a configuração e a Shopify apaga o webhook quando o endereço responde com erro; a Kiwify tenta de novo algumas vezes. Confira se o webhook de entrada está Ativo antes de reativar ou recriar do lado de lá. |
Como testar sem um sistema pronto
| O que você quer ver | Como testar |
|---|---|
| O que a NexTags manda no webhook de saída ou na requisição externa | Aponte para o Test URL de um nó Webhook do n8n e clique em Listen for test event: o n8n mostra o que chegou. O Test URL só recebe enquanto espera o teste; depois, use o Production URL, com o workflow publicado. Outro serviço que mostra as requisições recebidas também serve. |
| A requisição externa, do envio à resposta | O Testar Agora da ação mostra o Código do estado, o Corpo da resposta, os Cabeçalhos da resposta, os Cabeçalhos da solicitação e o Corpo da solicitação. |
| O conteúdo dinâmico, sem servidor | A ferramenta Devolver o JSON enviado (eco) devolve o JSON que recebe; o contrato da API diz que ela serve para gerar mensagens dinâmicas. Na requisição, use POST para https://app.nextagsai.com.br/api/tools/echo, o cabeçalho X-ACCESS-TOKEN com a chave e, no Corpo em JSON, o conteúdo dinâmico que você quer testar. Confira no teste se as mensagens chegam. |
| O webhook de entrada | Envie um JSON de teste com o cURL, como em Webhook de entrada, e confira o Result: de cada caminho depois de Load sample JSON. |
| O seu servidor, sem a NexTags | Simule a chamada com o cURL, com os cabeçalhos X-Segredo e X-USER-ID, como em Requisição externa. |
Documentação do nó Webhook do n8n: Webhook node.
Onde ver os erros
| Onde | O que mostra |
|---|---|
| Fluxos › aba Registro de Erros | As falhas da conta, com Tipo, Descrição, Contato e Data. A lupa pesquisa na lista. Veja Registro de Erros: ler e resolver. |
| Testar Agora, na requisição externa | O código e o corpo da resposta, e o que a NexTags mandou. |
Os campos http_status_code e http_response_body | O código e a resposta de cada chamada de verdade, guardados no contato pelo Mapeamento de resposta. |
| O editor do webhook de entrada | O Result: de cada caminho, sobre o Sample JSON. |
| O histórico da plataforma que envia | Os envios feitos para o link do webhook de entrada, como o Histórico da Hotmart e o Ver logs da Kiwify. |
Os erros comuns de requisição externa e de webhooks, com o que fazer, estão em Erros de requisição externa, webhook e planilha.
Relacionados
Este conteúdo ajudou?
Obrigado! Sua resposta ajuda a melhorar a central.