Skip to main content
Cuando tu función recibe webhooks de un servicio externo, cualquiera que conozca la URL puede enviarle datos falsos. La verificación de firma confirma que el evento viene realmente del servicio. ctx.verify* hace esa verificación en una línea: lee la cabecera de firma, resuelve el secret desde tus secrets y lanza un error si no coincide.

Stripe

index.ts
Configura el secret una sola vez:
El event que recibe tu handler ya es el cuerpo validado con Zod. La plataforma consumió el cuerpo del request para validarlo, así que llamar a request.json() dentro del handler lanza un error — usa el primer parámetro.

Proveedores soportados

Stripe además rechaza eventos con más de 5 minutos de antigüedad, lo que impide que alguien reenvíe un evento antiguo capturado.

Otros servicios

Para Twilio, GitHub, Slack o cualquier servicio con firma HMAC-SHA256, usa ctx.verifyHmac. La cabecera es obligatoria porque no hay un valor por defecto:

Rotar secrets

Durante una rotación, acepta el secret viejo y el nuevo a la vez separándolos por coma:
Cuando confirmes que el proveedor ya usa el nuevo, vuelve a dejar uno solo.

Manejar el fallo

Los verificadores lanzan WebhookVerificationError con un código que indica qué pasó:
Si no capturas el error, la función responde con error y el proveedor reintentará el webhook. Para Stripe y Shopify eso suele ser lo correcto solo cuando el fallo es temporal; ante una firma inválida es mejor responder 401 y no reintentar.

Funciones públicas

Los webhooks necesitan config.public: true para que el servicio externo pueda llamarlos sin credenciales de Jelou. Esa es justamente la razón por la que la verificación de firma es obligatoria: es el único control de acceso que queda.
Ver funciones públicas.

Testing

En los tests, createMockContext() deja cada verificador lanzando missing_secret. Para probar el resto del handler, desactiva la verificación:
Ver la guía de testing.

Funciones públicas

Recibir peticiones sin credenciales de Jelou.

Secrets

Guardar los secrets de cada proveedor.

Ejecuciones diferidas

Agendar un seguimiento al recibir el webhook.

Receptor de webhooks

Ejemplo completo listo para copiar.