Skip to content

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.

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).

json
[
  {
    "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éRequisDescription
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.

http
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.

The importance of verifying webhook signatures (SNYK)

  • 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;

http
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:

  1. un webhook pour l'intégralité des schémas/tenants.
  2. un webhook par cabinet/groupement de cabinet (ce que nous appelons schema ou tenant chez MyUnisoft).
  3. 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.