Saltar al contenido principal
SpherePay firma cada entrega de webhook para que puedas confirmar que genuinamente provino de SpherePay y que no fue alterada en tránsito. SpherePay nunca envía una entrega sin firmar. Siempre verifica la firma antes de procesar un payload, y rechaza cualquier cosa que falle la verificación con una respuesta no 2xx.

Encabezados de entrega

Cada intento de entrega lleva estos encabezados: Los encabezados describen el intento de entrega; el cuerpo describe el evento. En un reenvío, Sphere-Timestamp y Sphere-Signature se generan de nuevo — de modo que la misma ruta de código de verificación maneja originales y reenvíos — mientras que el cuerpo permanece idéntico byte por byte al original.

Cómo se calcula la firma

La firma es un digest HMAC-SHA256, codificado en hexadecimal:
  • secret — el secreto de firma del endpoint (whsec_...), devuelto una vez cuando creaste el endpoint.
  • timestamp — el valor del encabezado Sphere-Timestamp.
  • rawBody — los bytes crudos del cuerpo de la solicitud HTTP, exactamente como se transmitieron.
Para verificar: calcula el mismo digest tú mismo y compáralo con Sphere-Signature usando una comparación de tiempo constante.
Verifica contra el cuerpo crudo de la solicitud, no contra una versión re-serializada. Analizar el JSON y volver a codificarlo puede reordenar las claves o cambiar los espacios en blanco, lo que cambia los bytes y rompe la verificación. La mayoría de los frameworks web requieren configuración explícita para exponer el cuerpo crudo — captúralo antes de que se ejecute cualquier middleware de JSON.

Protégete contra ataques de repetición

Para evitar que entregas capturadas sean reenviadas por un tercero, rechaza las entregas cuyo Sphere-Timestamp tenga más de 5 minutos de antigüedad. Los reenvíos manuales reciben una marca de tiempo y una firma nuevas, por lo que los reenvíos legítimos siempre pasan esta verificación.

Implementaciones de referencia

Cada fragmento de código toma los bytes crudos del cuerpo, los dos encabezados y el secreto de tu endpoint, y devuelve si la entrega es auténtica.

Prueba tu verificador

Antes de que llegue el primer evento real, ejecuta tu implementación contra este vector de prueba conocido. Todas las entradas son fijas, por lo que un verificador correcto produce exactamente la firma mostrada. Cualquier diferencia significa que los bytes que estás firmando no son los bytes que firmó SpherePay — casi siempre un cuerpo re-serializado o un separador . faltante.
El contenido firmado es la marca de tiempo, un . literal y el cuerpo crudo:
El Sphere-Signature esperado es:
La marca de tiempo del vector es un momento fijo en el pasado, por lo que un verificador que aplica la verificación de tolerancia de 5 minutos lo rechaza por obsoleto. Comprueba primero el paso HMAC por sí solo y luego usa la entrega de prueba firmada de abajo, que firma con la hora actual, para ejercitar la ruta completa.

Comprobación sin código

Reproduce la firma desde una shell con OpenSSL:
Las versiones antiguas de OpenSSL imprimen el prefijo como (stdin)= en lugar de SHA2-256(stdin)=; el digest hexadecimal es el mismo.

Envía una entrega de prueba firmada a tu endpoint

Este script hace el papel de SpherePay. Firma el cuerpo de prueba con la hora actual y lo envía a tu receptor con los mismos encabezados que envía SpherePay. No se envía nada hacia ni desde SpherePay, y no se crea nada en tu cuenta.
  1. Inicia tu receptor localmente. El script envía la solicitud a http://localhost:3000/sphere-webhook. Si tu receptor escucha en otra dirección, cambia la URL en el último comando.
  2. Usa el mismo secreto en el receptor y en el script. Configura tu receptor con el secreto de prueba del script, o reemplaza SECRET en el script por el secreto whsec_ del endpoint que estás probando.
  3. Ejecuta el script. Pega el bloque completo en una terminal de macOS, Linux o WSL, donde estén instalados curl y openssl. Genera una marca de tiempo nueva en cada ejecución, por lo que la comprobación de tolerancia de 5 minutos se cumple.
  4. Lee la respuesta. La opción -i imprime la línea de estado HTTP. Un receptor correcto responde 2xx.
  5. Ejecútalo de nuevo con un cambio. Modifica un carácter en BODY o en SECRET y ejecútalo otra vez. Un receptor correcto debe responder con un estado no 2xx, como 401.

Cuando la verificación falla

Responde con un código de estado no 2xx (por ejemplo 401) y no proceses el payload. La entrega se registra como failed del lado de SpherePay, dándote un registro de auditoría en la API de Eventos.
Si registraste la misma URL receptora bajo múltiples aplicaciones de SpherePay, el endpoint de cada aplicación tiene su propio secreto. Usa el applicationId del payload para seleccionar el secreto correcto — consulta Payloads de eventos. Si no puedes analizar el cuerpo antes de verificar, prueba cada uno de tus secretos conocidos.
Última modificación el 15 de octubre de 2026