Guide Webhooks â
CAUTION
Les webhooks ne sont pas disponibles pour les clients MyUnisoft possédant l'offre API cabinet. Cependant, cette restriction ne concerne pas nos partenaires bénéficiant d'un accÚs de niveau cabinet.
Introduction â
Lâobjectif de ce guide est de simplifier la mise en place de nouveaux webhooks pour les partenaires.
- Why & How We came up with Webhooks? (Article technique)
Quâest-ce quâun webhook ? â
Un webhook est une simple requĂȘte HTTP POST contenant le strict minimum dâinformations, envoyĂ©e suite Ă la propagation dâun ou plusieurs âĂ©vĂšnementâ au sein de MyUnisoft.
Le webhook peut ĂȘtre configurĂ© pour ĂȘtre associĂ© Ă un ou plusieurs dossiers de production (accountingFolderId) ou Ă l'intĂ©gralitĂ© du tenant (schĂ©ma), de maniĂšre Ă ne rĂ©agir quâaux Ă©vĂšnements se produisant dans ces dossiers spĂ©cifiques.
En résumé, le webhook contient les informations des différents évÚnements propagés auxquels vous avez souscrit.
PrĂ©-requis â
Préalablement à la mise en place du webhook par nos services, il est nécessaire de :
- Obtenir des accÚs à notre API avec la clé secrÚte
X-Third-Party
. - DĂ©finir avec les Ă©quipes techniques MyUnisoft la liste des Ă©vĂšnements auxquels vous souhaitez souscrire.
- Mettre en place un point dâAPI (ou route) que MyUnisoft utilisera pour informer de la propagation des Ă©vĂšnements prĂ©dĂ©finis.
Ici, vous trouverez un exemple d'API basé sur le framework Fastify de Node.js.
NOTE
Il est possible d'utiliser nos API webhooks pour vous abonner directement aux évÚnements. Cela permet à un développeur d'utiliser des outils comme ngrok pour tester les webhooks localement.
Exemple de rĂ©ponse â
Notre service enverra un JSON similaire Ă celui ci-dessous. Noter qu'une requĂȘte HTTP peut contenir plusieurs webhooks (Ă©vĂšnements).
[
{
"name": "connector",
"operation": "CREATE",
"scope": {
"schemaId": 1,
"firmId": 1,
"firmSIRET": "83966500700010",
"accountingFolderId": 409,
"accountingFolderRef": "MYU01",
"accountingFolderSIRET": "84014327500039"
},
"data": {
"id": 1,
"code": "JFAC"
},
"webhookId": "83c22567-fd2f-4a50-abbb-48aedefdcfa5",
"createdAt": 1678457043533
}
]
Vous ne recevrez que les évÚnements et opérations que vous aurez demandé.
IMPORTANT
Les interfaces des âwebhooksâ et âĂ©vĂšnementsâ disponibles sont spĂ©cifiĂ©s en Typescript ou en JSON-Schema.
Anatomie d'un Ă©vĂšnement MyUnisoft â
Scope (champ d'action) â
Chaque âĂ©vĂšnementsâ est constituĂ© dâun âscopeâ (comme dĂ©fini ci-dessous) permettant dâidentifier lâorigine de lâĂ©vĂšnement et donc de faire le lien avec vos donnĂ©es.
Nom de la clé | Requis | Description |
---|---|---|
schemaId | â | Un schĂ©ma est un cabinet ou un groupement de cabinet (Il faut lâimaginer comme une abstraction permettant dâisoler nos clients entre eux). |
firmId | â | Le terme de firm (ou encore cabinet) reprĂ©sente un client signĂ© sur le plan commercial et technique. |
firmSIRET | â | SIRET ou SIREN du cabinet liĂ© au dossier |
accountingFolderId | â | Le terme accountingFolder (ou encore dossier) reprĂ©sente une entreprise cliente dâun cabinet. |
accountingFolderRef | â | RĂ©fĂ©rence interne du dossier |
accountingFolderSIRET | â | SIRET ou SIREN de l'entreprise (dossier) |
persPhysiqueId | â | Le terme persPhysique reprĂ©sente un utilisateur rattachĂ© au schĂ©ma. |
à noter qu'il est possible de récupérer le schemaId
d'une clé JWT avec la route key/info?mode=extended. Vous pouvez donc potentiellement persister l'ID en question pour simplifier l'identification du webhook reçu.
NOTE
Dans MyUnisoft, un dossier de production bien configuré possédera toujours un numéro SIREN/SIRET. Cependant, lors de sa création, cette information n'est pas obligatoire.
Operation â
Chaque évÚnement se distingue par l'opération qui lui est attribuée. Voici les types d'opérations possibles:
- CREATE
- UPDATE
- DELETE
- VOID
IMPORTANT
La documentation des évÚnements vous précise les opérations disponibles pour chaque évÚnement.
Data â
Chaque évÚnement possÚde son propre contrat d'interface, avec des données relativement minimales permettant l'identification et la récupération des ressources via nos APIs.
API â
Les routes pour créer, supprimer et mettre à jour des souscriptions aux webhooks sont disponibles dans notre collection Postman (dossier racine Webhook
), accessible via la navigation en haut Ă droite.
POST /api/v1/webhook HTTP/1.1
Host: api.myunisoft.fr
Content-Length: 119
{
"postUrl": "https://xxx.eu.ngrok.io/api/v1/webhooks",
"onEvents": ["document"]
}
Vous pouvez souscrire à un ou plusieurs évÚnements à la fois. Cependant, il n'est pas possible de souscrire à une opération précise ; le filtrage relÚve de votre responsabilité.
Comment dĂ©clencher mon Ă©vĂšnement ? â
Ici vous retrouverez les différents workflows au sein de l'interface MyUnisoft afin d'activer lesdits évÚnements.
DĂ©tails dâimplementation â
Validation de la requĂȘte â
WARNING
Pour des mesures de sĂ©curitĂ©, il est impĂ©ratif de valider les en-tĂȘtes HTTP date et signature avant de traiter les requĂȘtes qui font suites aux webhooks. Si lâune des deux en-tĂȘtes ne peut ĂȘtre validĂ©, alors la requĂȘte doit ĂȘtre rejetĂ©e.
Lâen-tĂȘte est un hash utilisant lâalgorithme de chiffrement SHA256. Il est gĂ©nĂ©rĂ© Ă partir du de la requĂȘte joint Ă lâen-tĂȘte HTTP date, signĂ© avec votre clĂ© secrĂšte
X-Third-Party
.La date reprĂ©sente le moment de lâenvoi par MyUnisoft. Pour valider cette en-tĂȘte, il est essentiel que cette date ne soit pas trop ancienne, afin d'Ă©viter les âReplay attacksâ (rĂ©pĂ©titions de requĂȘtes).
Explication pour une implĂ©mentation â
Lors de la rĂ©ception de la requĂȘte HTTP vous aurez les deux en-tĂȘtes suivants disponibles;
POST {{postUrl}} HTTP/1.1
date: 1677163797597
signature: 5c25dcda347d2a278f1fea783c56b18d702d2bcf68b6161fac28dfb33de5751d
Il vous suffira donc de gĂ©nĂ©rer un HASH avec lâalgorithme SHA256 en utilisant:
- La valeur de lâen-tĂȘte HTTP date
- VÎtre clé secrÚte X-Third-Party (fournit par MyUnisoft).
localSignature := crypto.hmac(
xThirdPartySecret,
JSON.Stringify(body) + date,
âSHA256â // ALGORITHM
);
La signature gĂ©nĂ©rĂ©e doit ĂȘtre Ă©quivalente Ă la signature fournie par MyUnisoft. Si la signature ne correspond pas il est nĂ©cessaire de rejeter la requĂȘte HTTP.
Niveau d'abstraction d'un webhook â
Vous pouvez créer et gérer des webhooks à plusieurs niveaux d'abstractions:
- un webhook pour l'intégralité des schémas/tenants.
- un webhook par cabinet/groupement de cabinet (ce que nous appelons schema ou tenant chez MyUnisoft).
- un webhook par dossier de production (entreprise).
Quelle différence technique entre ses différents niveaux demanderez-vous!
Webhook global â
Le défi technique du choix entre un ou deux réside dans l'identification d'un client (entreprise) avec le minimum de persistance au sein de votre infrastructure. Cela permet une implémentation sans gestion du cycle de vie des souscriptions de webhooks, ce qui simplifie grandement votre implémentation et sa maintenance.
Le scope d'un Ă©vĂšnement contiendra des informations telles que accountingFolderSIRET
et accountingFolderRef
pour vous aider à identifier l'entreprise concernée.
NOTE
Nous travaillons encore Ă l'ajout d'informations et outils pour simplifier l'identification (tout feedback est donc la bienvenue).
Webhook unitaire â
La difficulté du choix trois réside dans la gestion de la persistance et du cycle de vie des souscriptions. Bien que trÚs flexible et permettant une identification efficace, ce modÚle sera de loin le plus coûteux à développer et à maintenir.