Explica cómo recibir webhooks con raw body, verificar firmas, controlar replay, persistir idempotencia y responder rápido antes del procesamiento.
Última actualización
Actualizada
Nivel
Profundización
Un webhook es una entrada pública controlada por otro sistema. Debe verificar autenticidad, tolerar reintentos y separar la recepción rápida del procesamiento durable.
Un proveedor externo envía un evento HTTP cuando ocurre algo relevante: un pago fue aprobado, un archivo terminó de procesarse o una entrega cambió de estado. El receptor no controla cuándo llega, cuántas veces se repite ni el orden exacto.
El modelo seguro es:
Texto
raw body
↓
verificar firma y timestamp
↓
validar envelope
↓
deduplicar event id
↓
persistir o encolar
↓
responder 2xx rápido
↓
procesar de forma asíncrona
Sin webhook, la aplicación tendría que consultar periódicamente al proveedor. Esto añade latencia y carga. El webhook invierte la dirección: el proveedor notifica.
El coste es abrir una ruta pública que recibe input no confiable y puede ser atacada, duplicada o entregada fuera de orden.
El parser raw debe ejecutarse antes de express.json() para esa ruta. Si el body se parsea y serializa de nuevo, espacios, orden o encoding pueden cambiar y la firma dejará de coincidir.
El inbox persiste el evento; un worker lo procesa después. 202 puede ser adecuado si el proveedor lo acepta, pero algunos proveedores exigen cualquier 2xx específico. Sigue su contrato.
Persistir antes de responder evita perder el evento entre acknowledgment y enqueue. Si insertas en DB y publicas a una cola separada, considera patrón outbox o un mecanismo transaccional equivalente.