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. 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.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éduplicationLe 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.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.
Vous préférez récupérer les documents en masse ? Consultez le batch hook.
Voir les endpoints webhook