Configurer les webhooks dans la PSB : topics, sécurisation HMAC SHA256 et IP-whitelisting.
Les webhooks sont le moyen principal de recevoir des notifications en temps réel de la PSB. Lors de chaque événement pertinent (une facture reçue, un changement de statut, une confirmation de livraison), la PSB envoie une requête HTTP POST vers votre endpoint avec les détails de l'événement.
Vous enregistrez un webhook (un "hook") dans la PSB avec une URL et un topic. La PSB envoie ensuite tous les événements de ce topic vers votre URL. Chaque événement contient les données pertinentes sous forme de payload JSON.
Pas d'interface disponible : il n'est actuellement pas possible de configurer un hook via l'interface utilisateur de la plateforme. Les hooks sont configurés via l'API ou via le support eConnect. Une interface self-service pour les hooks est prévue dans la feuille de route (planifiée pour le T4 2026) et fera partie de Control (Platform 2.0) : les utilisateurs pourront alors créer, modifier et supprimer des hooks eux-mêmes. D'ici là, aucun article pas-à-pas pour la configuration manuelle des hooks via l'API n'est prévu.
Enregistrez un hook via l'API :
POST /api/v1/hook
Les principaux éléments de configuration :
InvoiceReceived)Attention : évitez de supprimer et recréer rapidement des hooks pour le même partyId et le même topic. En raison de race conditions dans le traitement des tâches, il peut arriver que temporairement aucun hook actif n'existe, ce qui empêche la livraison des événements. Attendez un instant après la suppression d'un hook avant d'en créer un nouveau, ou utilisez une mise à jour au lieu de supprimer puis recréer.
Vous souhaitez ajouter un topic supplémentaire (par ex. InvoiceReceived) à un hook existant ? Mettez à jour la configuration webhook existante via l'API /hook habituelle afin que le topic souhaité figure dans le tableau topics :
{
"topics": ["InvoiceReceived"]
}
Mettez à jour le hook existant plutôt que de le supprimer et de le recréer. Supprimer et recréer introduit une race condition où les événements peuvent ne pas être livrés temporairement (voir l'avertissement ci-dessus).
Pas en libre-service pour les clients non techniques. L'ajout d'un topic à un hook existant est une opération technique : la personne qui l'effectue doit savoir où le webhook doit pointer (l'URL de l'endpoint) et comprendre ce qu'est un webhook. Un client non technique ne peut généralement pas le faire de manière autonome. Faites appel à quelqu'un ayant des connaissances techniques (l'IT du client ou le support eConnect).
InvoiceReceivedInvoiceSentInvoiceSentErrorInvoiceSentRetryInvoiceResponseReceivedMessageLevelStatusReceivedMessageLevelStatusSentOrderReceivedLe MLS (Message Level Status) est le successeur de l'ancien MLR et fournit à la partie expéditrice un retour sur la réception et le traitement d'un document. Le MLS n'est pas activé par défaut et doit être configuré par party via la capability reviews dans la configuration SMP. Une fois le MLS activé, la PSB le gère automatiquement : en tant que Service Provider récepteur, la PSB renvoie un message MLS à l'expéditeur après réception et livraison.
Lorsque vous envoyez vous-même des documents via la PSB, vous recevez le retour MLS de la partie réceptrice sous forme d'événement webhook sur le topic MessageLevelStatusReceived. En tant que Service Provider récepteur, un webhook distinct avec le topic MessageLevelStatusSent suit dès que la PSB envoie en votre nom un MLS au SP expéditeur. Utilisez ce topic pour vérifier que vos propres réponses MLS sortantes sont bien livrées.
MessageLevelStatusSent n'est pas une confirmation de facture envoyée. Ce topic concerne un MLS que la PSB envoie en réponse à un document reçu (vous, en tant que SP récepteur, renvoyez la notification de statut à l'expéditeur d'origine), pas une facture électronique que vous avez envoyée vous-même. En cas de nombreuses notifications MessageLevelStatusSent avec peu de factures envoyées : vérifiez si le hook écoute le wildcard *sent au lieu de spécifiquement InvoiceSent (voir Topics wildcard).
Le payload contient entre autres :
documentIdrefToDocumentIddetails.statusCodeAP (accepted), RE (rejected), AB (acknowledged)details.descriptionPour recevoir des messages MLS, le hook Peppol doit contenir le champ mlsType. Les valeurs possibles sont ALWAYS_SEND (toujours renvoyer un MLS) et FAILURE_ONLY (uniquement en cas de rejet).
Conseil : vous pouvez récupérer le document MLS complet via
GET /api/v1-beta/{partyId}/generic/{documentId}/download, mais le payload du webhook contient généralement suffisamment d'informations.
La PSB sécurise toutes les livraisons de webhooks avec des signatures HMAC SHA256. À chaque requête, la PSB envoie le header :
X-EConnect-Signature: sha256={handtekening}
Pour vérifier la signature :
X-EConnect-Signature.Vérifiez également le champ sentOn dans le payload. Si ce timestamp est antérieur de plus de 5 minutes, rejetez la requête. Cela prévient les replay attacks où une requête interceptée est rejouée ultérieurement.
En plus de la vérification HMAC, la PSB propose des couches de sécurité supplémentaires :
104.40.188.59 et 104.47.148.207)Si vous avez configuré plusieurs hooks, la PSB détermine quel hook utiliser selon :
&& supplémentaire gagne sur un filtre plus court sans cette clause. Cela évite une double livraison sans obliger les filtres à s'exclure mutuellement.En plus des topics spécifiques, vous pouvez utiliser des motifs wildcard pour capturer plusieurs types d'événements avec un seul hook.
Send*Send*sent / *SentSent : InvoiceSent, InvoiceResponseSent, OrderSent, MessageLevelStatusSent, HookSent*ReceivedInvoiceReceived, OrderReceived, InvoiceResponseReceived, etc.)Invoice*Send* n'est pas identique à *sent. Send* correspond aux topics commençant par Send ; ce motif n'existe pas parmi les topics PSB standards. Pour capturer tous les événements « sent » (InvoiceSent, MessageLevelStatusSent, HookSent, etc.), utilisez *sent. InvoiceSentRetry et InvoiceSentError ne se terminent pas par Sent et ne sont donc pas couverts par le suffixe *sent.
Voici les problèmes courants avec les webhooks et comment les résoudre.
sha256=sentOn est plus ancien que 5 minutesHookSentError (voir ci-dessous) ; récupérer les événements manqués via le endpoint batchX-EConnect-Delivery (UUID unique) pour la déduplicationInvoiceReceived), mais aucun hook n'est enregistré sur ce topic (jamais configuré, ou supprimé entre-temps)InvoiceReceived figure-t-il dans les topics ? Sans hook sur ce topic, aucun HookSentError n'apparaît, donc l'absence de message d'erreur ne prouve pas que le hook est actifMessageLevelStatusSent malgré peu de factures envoyéesmailto:) ou webhook HTTP écoute le wildcard *sent au lieu de InvoiceSentInvoiceSent (même modification sur le mail-hook et sur le webhook HTTP) ; voir Topics wildcardInvoiceReceived)Le PSB peut recevoir une facture d'achat sans la transmettre à la partie destinataire. Le topic InvoiceReceived signifie que le PSB a reçu la facture ; sans hook sur ce topic, rien n'est envoyé à un endpoint.
HookSentError n'existe que si un hook est configuré et échoue à livrer.Corrigez un hook manquant en mettant à jour le hook existant plutôt qu'en le supprimant et le recréant.
Le PSB envoie des événements webhook (p. ex. InvoiceReceived lors de la réception d'une facture électronique) à l'endpoint configuré. Si cet endpoint est inaccessible - en raison d'un délai d'attente, d'une erreur SSL ou d'une erreur DNS comme No such host is known - le PSB réessaie avec un recul exponentiel pendant 5 jours (délai 100 sec. par tentative). Chaque tentative génère un événement HookSentRetry ; après 5 jours sans réponse 2xx, HookSentError est émis comme statut final et le PSB cesse de réessayer.
Conséquence : une facture électronique reçue ne sera pas livrée au client tant que l'endpoint est inaccessible, sans que le client s'en aperçoive directement. Actions recommandées :
HookSentError afin qu'un échec de livraison définitif soit signalé activement plutôt que de passer inaperçu. Envisager également HookSentRetry pour une détection précoce.Première ligne : interruption côté client vs. problème technique (acceptation et production)
HookSentError, un HTTP 404 répété ou « endpoint hors ligne »/« environnement d'acceptation désactivé » peut aussi provenir du fait que le client désactive temporairement l'endpoint d'acceptation ou de production (développement, maintenance). Ce n'est pas un incident de la plateforme eConnect.
HookSentError, endpoint hors ligne ou HTTP 404 sur l'endpoint webhook configuré par le client. Souvent visible sous la forme exacte Response status code does not indicate success: 404 (Not Found) (généralement une HttpRequestException .NET lors de la requête hook sortante). Il s'agit d'un 404 provenant de l'endpoint du client lui-même (hors ligne ou chemin incorrect), pas de l'erreur Peppol PartyId not found lors de l'envoi (404 SMP), ni d'un 404 de ressource REST issu de la gestion des erreurs de l'API.HookSentError ci-dessus (DNS/SSL/délai, journaux, surveillance, récupération batch).Prenez le corps JSON brut de la requête, calculez le hash HMAC SHA256 avec le secret que vous avez indiqué lors de la création du hook et comparez-le avec la valeur dans le header X-EConnect-Signature (après le préfixe sha256=). Si les valeurs correspondent, vous savez que la requête provient de la PSB et n'a pas été modifiée en transit.
Vérifiez que sentOn n'a pas plus de 5 minutes. Si l'horodatage est trop ancien, refusez la requête. Cela empêche les attaques par rejeu, où une requête interceptée est soumise à nouveau ultérieurement, même si la signature est techniquement valide.
Implémentez un traitement idempotent de votre côté, car la PSB peut dans de rares cas livrer un événement plusieurs fois. Retournez également rapidement un statut HTTP 2xx : toute autre réponse est considérée comme une erreur et déclenche un nouvel essai. Pour un traitement lourd, confirmez d'abord la réception, puis traitez via une file d'attente.
HookSentError survient après que le PSB a tenté pendant 5 jours sans réponse 2xx. Un HTTP 404 répété ou le message indiquant que l'endpoint est hors ligne provient souvent du fait que le client désactive temporairement l'endpoint d'acceptation ou de production (développement, maintenance) — ce n'est pas un incident de la plateforme eConnect. Confirmer d'abord si l'interruption est intentionnelle et temporaire ; si oui, aucune action supplémentaire n'est nécessaire jusqu'à ce que l'endpoint soit de nouveau accessible. Les événements manqués peuvent toujours être récupérés via le endpoint batch dans la fenêtre de 5 jours.
C'est un comportement attendu si le mail-hook (mailto:) ou le webhook HTTP écoute le wildcard *sent au lieu de spécifiquement InvoiceSent. MessageLevelStatusSent n'est pas une confirmation d'une facture envoyée par vous-même, mais d'un MLS que la PSB envoie en réponse à un document reçu, et il relève du motif *sent avec InvoiceSent, OrderSent et HookSent. Si vous ne voulez des notifications qu'à l'envoi de factures, modifiez la configuration du topic vers InvoiceSent. InvoiceSentRetry et InvoiceSentError ne se terminent pas par Sent et ne sont donc pas couverts par *sent.
Vous préférez récupérer les documents en masse ? Consultez le batch hook.
Voir les endpoints webhook