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.
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.
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) y formará parte de Control (Platform 2.0): los usuarios podrán entonces crear, modificar y eliminar hooks por sí mismos. Hasta entonces, no está previsto ningún artículo paso a paso para la configuración manual de hooks a través de la API.
Registre un hook a través de la API:
POST /api/v1/hook
Los principales elementos de configuración:
InvoiceReceived)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.
¿Desea agregar un topic adicional (por ejemplo, InvoiceReceived) a un hook existente? Actualice la configuración webhook existente a través de la API /hook habitual para que el topic deseado esté incluido en el array topics:
{
"topics": ["InvoiceReceived"]
}
Actualice el hook existente en lugar de eliminarlo y volver a crearlo. Eliminar y volver a crear introduce una race condition donde los eventos pueden no entregarse temporalmente (véase la advertencia anterior).
No es autoservicio para clientes no técnicos. Agregar un topic a un hook existente es una operación técnica: la persona que la realiza debe saber dónde debe apuntar el webhook (la URL del endpoint) y comprender qué es un webhook. Un cliente no técnico generalmente no puede hacerlo de forma independiente. Involve a someone with technical knowledge (IT del cliente o soporte de eConnect).
InvoiceReceivedInvoiceSentInvoiceSentErrorInvoiceSentRetryInvoiceResponseReceivedMessageLevelStatusReceivedMessageLevelStatusSentOrderReceivedMLS (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. Como Service Provider receptor, sigue un webhook independiente con el topic MessageLevelStatusSent en cuanto la PSB envía en su nombre un MLS al SP remitente. Utilice este topic para supervisar si sus propias respuestas MLS emitidas se entregan correctamente.
MessageLevelStatusSent no es una confirmación de una factura enviada. Este topic se refiere a un MLS que la PSB envía como respuesta a un documento recibido (usted, como SP receptor, devuelve la notificación de estado al remitente original), no a una factura electrónica que usted mismo haya enviado. Ante muchas notificaciones MessageLevelStatusSent junto con pocas facturas enviadas: compruebe si el hook escucha el wildcard *sent en lugar de específicamente InvoiceSent (véase Topics wildcard).
El payload contiene entre otros:
documentIdrefToDocumentIddetails.statusCodeAP (accepted), RE (rejected), AB (acknowledged)details.descriptionPara 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.
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}
Para verificar la firma:
X-EConnect-Signature.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.
Además de la verificación HMAC, la PSB ofrece capas de seguridad adicionales:
104.40.188.59 y 104.47.148.207)Si tiene múltiples hooks configurados, la PSB determina qué hook utilizar según:
&& adicional gana a un filtro más corto sin esa cláusula. Esto evita la entrega duplicada sin obligar a que los filtros sean mutuamente excluyentes.Además de los topics específicos, también puede usar patrones wildcard para capturar varios tipos de eventos con un solo hook.
Send*Send*sent / *SentSent: InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedInvoiceReceived, OrderReceived, InvoiceResponseReceived, etc.)Invoice*Send* no es lo mismo que *sent. Send* coincide con topics que comienzan por Send; ese patrón no aparece entre los topics estándar de la PSB. Para capturar todos los eventos "sent" (InvoiceSent, MessageLevelStatusSent, HookSent, etc.), use *sent. InvoiceSentRetry e InvoiceSentError no terminan en Sent y por tanto no quedan cubiertos por el sufijo *sent.
A continuación se indican los problemas más comunes con los webhooks y cómo resolverlos.
sha256=sentOn tiene más de 5 minutos de antigüedadHookSentError (véase más abajo); recuperar eventos perdidos a través del endpoint de lotesX-EConnect-Delivery (UUID único) para deduplicaciónInvoiceReceived), pero no hay ningún hook registrado en ese topic (nunca configurado, o eliminado mientras tanto)InvoiceReceived en los topics? Sin un hook en ese topic no aparece HookSentError, por lo que la ausencia de errores no prueba que el hook esté activoMessageLevelStatusSent con pocas facturas enviadasmailto:) o webhook HTTP escucha el wildcard *sent en lugar de InvoiceSentInvoiceSent (mismo cambio en el mail-hook y en el webhook HTTP); véase Topics wildcardInvoiceReceived)El PSB puede recibir una factura de compra sin reenviarla a la parte receptora. El topic InvoiceReceived significa que el PSB ha recibido la factura; sin un hook en ese topic, no se envía nada a un endpoint.
HookSentError solo existe si hay un hook configurado que falla al entregar.Corrija un hook faltante actualizando el hook existente en lugar de eliminarlo y volver a crearlo.
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:
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.Primera línea: interrupción del lado del cliente vs. problema técnico (aceptación y producción)
HookSentError, un HTTP 404 repetido o "endpoint fuera de servicio"/"entorno de aceptación apagado" también puede deberse a que el cliente apaga temporalmente el endpoint de aceptación o producción (desarrollo, mantenimiento). Esto no es una incidencia de la plataforma eConnect.
HookSentError, endpoint fuera de servicio o HTTP 404 en el endpoint webhook configurado por el cliente. A menudo visible como el texto exacto Response status code does not indicate success: 404 (Not Found) (normalmente una HttpRequestException de .NET en la solicitud saliente del hook). Este es un 404 del propio endpoint del cliente (apagado o ruta incorrecta), no el error Peppol PartyId not found al enviar (404 de SMP), ni un 404 de recurso REST del manejo de errores de la API.HookSentError anterior (DNS/SSL/tiempo de espera, registros, monitorización, recuperación por lotes).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.
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.
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.
HookSentError aparece después de que el PSB haya intentado durante 5 días sin respuesta 2xx. Un HTTP 404 repetido o el mensaje de que el endpoint está fuera de servicio suele deberse a que el cliente apaga temporalmente el endpoint de aceptación o producción (desarrollo, mantenimiento); esto no es una incidencia de la plataforma eConnect. Confirme primero si la interrupción es intencionada y temporal; si es así, no se necesita ninguna acción adicional hasta que el endpoint vuelva a ser accesible. Los eventos perdidos pueden recuperarse a través del endpoint de lotes dentro de la ventana de reintento de 5 días.
Este es el comportamiento esperado si el mail-hook (mailto:) o el webhook HTTP escucha el wildcard *sent en lugar de específicamente InvoiceSent. MessageLevelStatusSent no es una confirmación de una factura enviada por usted mismo, sino de un MLS que la PSB envía como respuesta a un documento recibido, y queda bajo el patrón *sent junto con InvoiceSent, OrderSent y HookSent. Si solo desea notificaciones al enviar facturas, cambie la configuración del topic a InvoiceSent. InvoiceSentRetry e InvoiceSentError no terminan en Sent y por tanto no quedan cubiertos por *sent.
¿Prefiere recuperar los documentos en masa? Consulte el batch hook.
Ver los endpoints webhook