Configurar y proteger webhooks

Configurar webhooks en la PSB: topics, seguridad HMAC SHA256 e IP-whitelisting.

Los webhooks son la forma principal de recibir notificaciones en tiempo real de la PSB. Con cada evento relevante (una factura recibida, un cambio de estado, una confirmación de entrega), la PSB envía una solicitud HTTP POST a su endpoint con los detalles del evento.

¿Cómo funcionan los webhooks en la PSB?

Usted registra un webhook (un "hook") en la PSB con una URL y un topic. La PSB envía entonces todos los eventos de ese topic a su URL. Cada evento contiene los datos relevantes como payload JSON.

Crear un webhook

No hay interfaz disponible: actualmente no es posible configurar un hook a través de la interfaz de usuario de la plataforma. Los hooks se configuran a través de la API o del soporte de eConnect. Una interfaz de autoservicio para hooks está en la hoja de ruta (prevista para el T4 2026).

Registre un hook a través de la API:

POST /api/v1/hook

Los principales elementos de configuración:

CampoDescripciónurlEl endpoint HTTPS al que la PSB envía los eventostopicEl tipo de evento que desea escuchar (por ej. InvoiceReceived)secretUna clave secreta para la verificación de firma HMAC

Nota: evite eliminar y recrear hooks rápidamente para el mismo partyId y topic. Debido a condiciones de carrera en el procesamiento de tareas, esto puede resultar temporalmente en ningún hook activo, lo que causa que los eventos no se entreguen. Espere brevemente después de eliminar un hook antes de crear uno nuevo, o utilice una actualización en lugar de eliminar + crear.

Topics de uso frecuente
TopicCuándoInvoiceReceivedSe ha recibido una factura de compraInvoiceSentUna factura de venta se ha enviado con éxitoInvoiceSentErrorUna factura de venta no se ha podido entregarInvoiceSentRetrySe ha iniciado un intento de reenvíoInvoiceResponseReceivedSe ha recibido una Invoice Response (mensajes de estado)MessageLevelStatusReceivedSe ha recibido un mensaje de estado MLS de la parte remitenteMessageLevelStatusSentUn mensaje de estado MLS se ha enviado con éxitoOrderReceivedSe ha recibido un pedido de compra
Message Level Status (MLS)

MLS (Message Level Status) es el sucesor del antiguo MLR y proporciona a la parte remitente información sobre la recepción y el procesamiento de un documento. MLS no está habilitado por defecto y debe configurarse por party a través de la capability reviews en la configuración SMP. Una vez habilitado, la PSB gestiona el MLS de forma automática: como Service Provider receptor, la PSB envía un mensaje MLS de vuelta al remitente tras la recepción y entrega.

Cuando usted envía documentos a través de la PSB, recibe la respuesta MLS de la parte receptora como evento webhook en el topic MessageLevelStatusReceived. El payload contiene entre otros:

CampoDescripcióndocumentIdID único del mensaje MLSrefToDocumentIdID del documento originaldetails.statusCodeEstado Peppol: AP (accepted), RE (rejected), AB (acknowledged)details.descriptionExplicación del receptor

Para recibir mensajes MLS, el hook de Peppol debe contener el campo mlsType. Los valores posibles son ALWAYS_SEND (siempre enviar MLS de vuelta) y FAILURE_ONLY (solo en caso de rechazo).

Consejo: puede recuperar el documento MLS completo a través de GET /api/v1-beta/{partyId}/generic/{documentId}/download, pero el payload del webhook generalmente contiene información suficiente.

Proteger los webhooks con HMAC

La PSB protege todas las entregas de webhooks con firmas HMAC SHA256. En cada solicitud, la PSB envía el header:

X-EConnect-Signature: sha256={handtekening}
Implementar la verificación

Para verificar la firma:

  1. Tome el payload JSON en bruto de la solicitud.
  2. Calcule el hash HMAC SHA256 con su clave secreta (la misma que especificó al crear el hook).
  3. Compare su hash calculado con el valor del header X-EConnect-Signature.
  4. Si coinciden, la solicitud es auténtica.
Prevención de replay attacks

Compruebe también el campo sentOn en el payload. Si esta marca temporal tiene más de 5 minutos de antigüedad, rechace la solicitud. Esto previene replay attacks en las que una solicitud interceptada se reproduce posteriormente.

Opciones de seguridad adicionales

Además de la verificación HMAC, la PSB ofrece capas de seguridad adicionales:

  • IP-whitelisting: limite las solicitudes entrantes a las IP de producción de la PSB (104.40.188.59 y 104.47.148.207)
  • Autenticación OAuth webhook: la PSB puede autenticarse en su endpoint con credenciales OAuth2
  • Mutual SSL: utilice certificados de cliente para autenticación TLS mutua
Orden de prioridad

Si tiene múltiples hooks configurados, la PSB determina qué hook utilizar según:

  1. Los hooks a nivel PartyId tienen prioridad sobre los hooks a nivel environment
  2. Los topics específicos tienen prioridad sobre los wildcards
  3. En caso de prioridad igual: el hook-id sirve como criterio de desempate
Solución de problemas

A continuación se indican los problemas más comunes con los webhooks y cómo resolverlos.

SíntomaCausaSoluciónLos webhooks no lleganEndpoint inaccesible (tiempo de espera 100 seg.)Se requiere HTTPS + certificado SSL válido; desactivar la protección CSRF en el endpoint del webhookWebhook rechazado como no seguroFalla la validación de X-EConnect-SignatureVerificar el cálculo HMAC SHA256: payload × secreto → cadena hexadecimal con prefijo sha256=Ataque de repetición bloqueadoEl campo sentOn tiene más de 5 minutos de antigüedadEl endpoint procesa demasiado lento o el reloj está mal ajustado"No such host is known" (error DNS)El nombre de host del endpoint del webhook ya no se puede resolver, p. ej. tras cambiar el nombre del entorno ERP o un registro DNS caducadoVerificar y restaurar el registro DNS del dominio del endpoint; después recuperar los eventos perdidos a través del endpoint de lotesHookSentError (fallo definitivo)El PSB ha intentado durante 5 días sin obtener una respuesta 2xxRevisar los registros del endpoint; monitorizar el topic HookSentError (véase más abajo); recuperar eventos perdidos a través del endpoint de lotesFacturas antiguas reentregadasLa API no devuelve 2xx en el primer reciboEl endpoint siempre debe devolver 2xx, también para el procesamiento asíncronoProcesamiento duplicado en reintentoSin verificación de idempotenciaUsar el encabezado X-EConnect-Delivery (UUID único) para deduplicación
Supervisión y recuperación de HookSentError

El PSB envía eventos webhook (p. ej. InvoiceReceived al recibir una factura electrónica) al endpoint configurado. Si ese endpoint es inaccesible — por un tiempo de espera, un error SSL o un error DNS como No such host is known — el PSB reintenta con retroceso exponencial durante 5 días (tiempo de espera 100 seg. por intento). Cada intento genera un evento HookSentRetry; tras 5 días sin respuesta 2xx, se emite HookSentError como estado final y el PSB deja de reintentar.

Consecuencia: una factura electrónica recibida no se entregará al cliente mientras el endpoint sea inaccesible, sin que el cliente lo note directamente. Acciones recomendadas:

  • Configurar monitorización: suscribir un hook (p. ej. un mail-hook) al topic HookSentError para que un fallo de entrega definitivo se señalice activamente en lugar de pasar desapercibido. Considerar también HookSentRetry para detección temprana.
  • Solucionar la causa raíz: en caso de error DNS, verificar y restaurar el registro DNS del dominio del endpoint; en caso de tiempos de espera, hacer que el endpoint responda más rápido (2xx en 100 seg., procesamiento pesado de forma asíncrona).
  • Recuperar eventos perdidos: los eventos que fallaron durante la interrupción pueden recuperarse a través del endpoint de lotes. La ventana de reintento de 5 días significa que la recuperación oportuna dentro de ese período puede todavía compensar mediante entrega regular.
Buenas prácticas
  • Utilice siempre HTTPS para su endpoint webhook
  • Implemente un procesamiento idempotente: en casos excepcionales, la PSB puede entregar un evento varias veces
  • Devuelva rápidamente un código de estado 2xx: la PSB considera cualquier respuesta que no sea 2xx como un error y reintentará el evento
  • Registre todos los eventos recibidos para depuración y auditoría
  • Utilice un sistema de cola (queue) en su lado si el procesamiento requiere tiempo; confirme primero la recepción y procese después
Preguntas frecuentes
¿Cómo verifico un webhook entrante con HMAC SHA256?

Tome el cuerpo JSON sin procesar de la solicitud, calcule el hash HMAC SHA256 con el secreto que indicó al crear el hook y compárelo con el valor del header X-EConnect-Signature (después del prefijo sha256=). Si coinciden, sabe que la solicitud proviene de la PSB y no fue modificada en tránsito.

¿Por qué debo comprobar el campo sentOn en el payload?

Verifique que sentOn no tenga más de 5 minutos de antigüedad. Si la marca de tiempo es demasiado antigua, rechace la solicitud. Esto previene ataques de repetición, donde una solicitud interceptada previamente se reenvía más tarde, incluso si la firma es técnicamente válida.

¿Cómo evito problemas con el procesamiento idempotente y los reintentos?

Implemente un procesamiento idempotente en su lado, ya que la PSB puede entregar un evento más de una vez en casos excepcionales. Además, devuelva rápidamente un código de estado HTTP 2xx: cualquier otra respuesta se considera un error y desencadena un reintento. Para un procesamiento pesado, confirme primero la recepción y luego procese a través de una cola.


¿Prefiere recuperar los documentos en masa? Consulte el batch hook.

Ver los endpoints webhook

Relacionado
Artículos relacionados