Pular para o conteúdo principal
O SpherePay assina cada entrega de webhook para que você possa confirmar que ela realmente veio do SpherePay e não foi adulterada em trânsito. O SpherePay nunca envia uma entrega sem assinatura. Sempre verifique a assinatura antes de processar um payload e rejeite qualquer coisa que falhe na verificação com uma resposta não-2xx.

Cabeçalhos de entrega

Toda tentativa de entrega carrega estes cabeçalhos: Os cabeçalhos descrevem a tentativa de entrega; o corpo descreve o evento. Em um replay, Sphere-Timestamp e Sphere-Signature são gerados novamente — de forma que o mesmo caminho de código de verificação trata originais e replays — enquanto o corpo permanece idêntico byte a byte ao original.

Como a assinatura é calculada

A assinatura é um digest HMAC-SHA256, codificado em hexadecimal:
  • secret — o segredo de assinatura do endpoint (whsec_...), retornado uma única vez quando você criou o endpoint.
  • timestamp — o valor do cabeçalho Sphere-Timestamp.
  • rawBody — os bytes brutos do corpo da requisição HTTP, exatamente como transmitidos.
Para verificar: calcule o mesmo digest você mesmo e compare-o com Sphere-Signature usando uma comparação de tempo constante.
Verifique contra o corpo bruto da requisição, não contra uma versão reserializada. Fazer o parse do JSON e recodificá-lo pode reordenar chaves ou alterar espaços em branco, o que muda os bytes e quebra a verificação. A maioria dos frameworks web exige configuração explícita para expor o corpo bruto — capture-o antes de qualquer middleware de JSON ser executado.

Proteja-se contra ataques de replay

Para impedir que entregas capturadas sejam reenviadas por terceiros, rejeite entregas cujo Sphere-Timestamp tenha mais de 5 minutos. Replays manuais recebem um timestamp e uma assinatura novos, então replays legítimos sempre passam nesta verificação.

Implementações de referência

Cada snippet recebe os bytes do corpo bruto, os dois cabeçalhos e o segredo do seu endpoint, e retorna se a entrega é autêntica.

Teste seu verificador

Antes de o primeiro evento real chegar, execute sua implementação contra este vetor de teste conhecido. Todas as entradas são fixas, então um verificador correto produz exatamente a assinatura mostrada. Qualquer diferença significa que os bytes que você está assinando não são os bytes que o SpherePay assinou — quase sempre um corpo re-serializado ou um separador . ausente.
O conteúdo assinado é o timestamp, um . literal e o corpo bruto:
O Sphere-Signature esperado é:
O timestamp do vetor é um momento fixo no passado, então um verificador que aplica a verificação de tolerância de 5 minutos o rejeita como obsoleto. Verifique primeiro a etapa HMAC isoladamente e depois use a entrega de teste assinada abaixo, que assina com a hora atual, para exercitar o caminho completo.

Verificação sem código

Reproduza a assinatura a partir de um shell com OpenSSL:
Versões antigas do OpenSSL imprimem o prefixo como (stdin)= em vez de SHA2-256(stdin)=; o digest hexadecimal é o mesmo.

Envie uma entrega de teste assinada para o seu endpoint

Este script faz o papel do SpherePay. Ele assina o corpo de teste com a hora atual e o envia ao seu receptor com os mesmos cabeçalhos que o SpherePay envia. Nada é enviado para o SpherePay nem recebido dele, e nada é criado na sua conta.
  1. Inicie seu receptor localmente. O script envia a requisição para http://localhost:3000/sphere-webhook. Se o seu receptor escuta em outro endereço, altere a URL no último comando.
  2. Use o mesmo segredo no receptor e no script. Configure seu receptor com o segredo de teste do script, ou substitua SECRET no script pelo segredo whsec_ do endpoint que você está testando.
  3. Execute o script. Cole o bloco inteiro em um terminal macOS, Linux ou WSL, onde curl e openssl estejam instalados. Ele gera um timestamp novo a cada execução, então a verificação de tolerância de 5 minutos é satisfeita.
  4. Leia a resposta. A opção -i imprime a linha de status HTTP. Um receptor correto responde 2xx.
  5. Execute de novo com uma alteração. Modifique um caractere em BODY ou em SECRET e execute novamente. Um receptor correto deve responder com um status não-2xx, como 401.

Quando a verificação falha

Responda com um código de status não-2xx (por exemplo 401) e não processe o payload. A entrega é registrada como failed do lado do SpherePay, dando a você uma trilha de auditoria na API de Eventos.
Se você registrou a mesma URL receptora em múltiplas aplicações do SpherePay, o endpoint de cada aplicação tem seu próprio segredo. Use o applicationId do payload para selecionar o segredo correto — consulte Payloads de eventos. Se não puder fazer o parse do corpo antes de verificar, tente cada um dos seus segredos conhecidos.
Última modificação em 15 de outubro de 2026