Skip to main content
En bref : Les webhooks vous permettent de mettre en place un système de notification pour recevoir des mises à jour sur certaines requêtes effectuées vers l’API Adhere.
Adhere utilise des webhooks pour notifier votre application lorsque des événements spécifiques se produisent. Cela vous permet de construire des flux de travail automatisés et d’intégrer étroitement Adhere à votre système.

Pourquoi utiliser des Webhooks ?

Généralement, lorsque vous faites une requête vers un endpoint API, vous vous attendez à une réponse quasi immédiate. Cependant, certaines requêtes peuvent prendre du temps à traiter. Afin d’éviter une erreur de timeout, une réponse en attente est renvoyée. Puisque vos enregistrements doivent être mis à jour avec l’état final de la requête, vous devez soit :
  1. Polling (Interrogation) : Faire une requête de mise à jour à intervalles réguliers.
  2. Webhooks : Écouter les événements en utilisant une URL de webhook.
Nous recommandons l’utilisation des webhooks plutôt que le polling. Les webhooks sont plus efficaces, réduisent la charge réseau et garantissent que votre système est mis à jour immédiatement lorsqu’un événement se produit.

Configuration et intégration

Pour commencer à recevoir des notifications webhook, suivez ces étapes pour configurer votre environnement :
1

Configurer l'URL du Webhook

Fournissez l’endpoint sur votre serveur où Adhere enverra les requêtes POST. Il doit s’agir d’une URL accessible publiquement.
2

Définir une clé de hachage

Une clé secrète utilisée pour signer la charge utile (payload) du webhook. Vous devez la garder sécurisée et l’utiliser pour vérifier que les requêtes proviennent bien d’Adhere.
3

Enregistrer la configuration

Enregistrez vos paramètres dans le tableau de bord Adhere sous la section Intégrations.
Il existe deux canaux de webhook indépendants, chacun avec sa propre URL et sa propre clé secrète de signature :
  • Événements de module (surveillance des transactions, KYC) sont envoyés à l’URL définie sous Intégrations, et sont signés avec la Clé de hachage que vous y avez définie.
  • Vérification d’identité (liveness.completed, envoyé pour chaque exécution du SDK Web, Android et iOS) est envoyé à l’URL de webhook définie dans votre Configuration SDK, et est signé avec le secret webhook spécifique à cette configuration. Il est généré pour vous, pas défini par vous.
Les deux utilisent le même en-tête X-Adhere-Signature et le même schéma HMAC-SHA256 décrit ci-dessous.

Sécurité et vérification

Toutes les requêtes webhook d’Adhere incluent un en-tête X-Adhere-Signature sous la forme sha256=<signature>, où la signature est le condensé HMAC-SHA256 en hexadécimal minuscule du corps de la requête.

Vérification des signatures

Pour vous assurer qu’une requête webhook provient réellement d’Adhere, vous devez vérifier la signature avant de traiter la charge utile.
Calculez le HMAC sur les octets bruts du corps de la requête, tels qu’ils sont reçus. Adhere signe une sérialisation JSON compacte sans espace blanc entre les séparateurs ; re-sérialiser une charge utile analysée produira des octets différents et la signature ne correspondra jamais.
Pour liveness.completed, la clé de signature est le secret webhook de votre configuration SDK sans les tirets — une chaîne hexadécimale de 32 caractères, et non la forme UUID avec tirets. Les exemples ci-dessous les suppriment pour vous.

Obtenir le secret webhook de votre configuration SDK

Le secret est généré pour vous lorsque la configuration SDK est créée. Récupérez-le depuis le tableau de bord Adhere : allez dans Settings → Integrations → SDK, ouvrez le menu sur la ligne de votre config et choisissez Integration. Le secret y est affiché avec votre ID de config, avec un bouton pour le copier. Traitement comme un mot de passe. Toute personne possédant celui-ci peut forger un webhook validement signé portant de fausses résultats de vérification, stockez-le de la même façon que vous stockez toute autre credential serveur et ne l’embarquez jamais dans du code client. Le secret est généré pour vous lors de la création de la configuration SDK et est délibérément absent de la lecture de configuration ordinaire, car quiconque le possède peut forger un webhook valablement signé. Récupérez-le explicitement :
Seul l’administrateur du compte peut appeler ceci, pas un employé avec le rôle admin, ni le propriétaire d’un compte différent. Chaque appel est journalisé. Pour faire pivoter le secret, faites un POST sur la même URL. La nouvelle valeur prend effet immédiatement ; déployez-la donc avant que votre prochaine vérification ne soit terminée, sinon les signatures échoueront pendant l’intervalle.
Vérifiez toujours l’en-tête X-Adhere-Signature pour empêcher les requêtes non autorisées d’interagir avec votre serveur.

Structure de la charge utile de l’événement

Les événements de module suivent une structure JSON cohérente : La Vérification d’identité n’utilise pas cette enveloppe. Sa charge utile est plate, avec les champs de vérification au niveau supérieur.

Événements pris en charge

Surveillance des transactions

  • Module : transaction_monitoring
  • Événements :
    • suspicious_transaction : Déclenché lorsqu’une transaction est traitée et jugée suspecte.

Vérification d’identité

  • Envoyé par : chaque vérification SDK Web, Android et iOS
  • Délivré à : l’URL de webhook sur votre Configuration SDK (pas l’URL Intégrations)
  • Événements :
    • liveness.completed : déclenché une fois par vérification, après que la correspondance faciale et, pour les exécutions de documents, l’OCR soient terminés.
Cette charge utile est plate — il n’y a pas d’enveloppe success / module / data.
verification_type est data_verification ou document_verification. Pour une exécution de document, la même forme de niveau supérieur s’applique, avec un bloc document (champs OCR plus une correspondance faciale document-à-selfie) à la place de customer_profile :
document transporte également place_of_birth, place_of_issue, address, district, division, location, sub_location, serial_number, et barcode_numbernull sauf si le type de document spécifique porte ce champ. face_match.reason est rempli avec une explication conviviale lorsque verified est false ou que la correspondance a été ignorée.
face_match.decision ("MATCH", "NO_MATCH", ou "REJECTED") est ce dont verified est réellement dérivé — lisez decision plutôt que de comparer confidence_percentage par rapport à un seuil qui vous est propre, car notre seuil de correspondance interne ne fait pas partie de cette charge utile et peut changer avec le temps. "REJECTED" signifie que la détection de vivacité/anti-spoofing a échoué avant qu’une comparaison ne soit effectuée, donc confidence_percentage peut être absent ou 0 à côté de verified: false pour une raison sans rapport avec la ressemblance faciale.
status: "passed" signifie que la vérification est allée jusqu’au bout — pas que la personne correspondait. Une inadéquation faciale, un score de confiance faible ou un document expiré rapportera toujours status: "passed", le résultat réel étant enregistré dans biometrics.face_match.verified (et document.is_expired pour la vérification de document). status: "failed" est réservé aux cas où la vérification elle-même n’a pas pu s’exécuter : erreur de service, pas de selfie capturé, ou rejet de base de données gouvernementale. Ne conditionnez jamais l’accès sur le seul status — vérifiez toujours face_match.verified.
verification_id correspond au entryId renvoyé par le rappel de fin du SDK.

Tester localement

Avant de déployer en production, nous recommandons de tester votre implémentation webhook localement.
  1. Utilisez ngrok : Utilisez ngrok pour créer un tunnel sécurisé vers votre serveur local.
  2. Configurer l’URL Webhook : Mettez à jour votre tableau de bord Adhere avec l’URL ngrok (ex: https://votre-sous-domaine.ngrok-free.app/webhooks).
  3. Inspecter les requêtes : Utilisez le tableau de bord ngrok ou Webhook.site pour inspecter les charges utiles et les en-têtes envoyés par Adhere.

Meilleures pratiques

  • Accuser réception immédiatement : Votre serveur doit renvoyer une réponse 200 OK aussi rapidement que possible. Le traitement lourd doit être géré de manière asynchrone à l’aide d’une file d’attente de tâches.
  • Gérer les réessais : Adhere réessaiera les livraisons de webhook échouées (réponses non-2xx) jusqu’à 3 fois, avec un back-off exponentiel plafonné à 10 minutes.
  • Utiliser l’idempotence : Assurez-vous que votre système peut gérer plusieurs fois le même webhook en toute sécurité. Il n’y a pas d’ID de livraison séparé — dédupliquez sur l’identifiant de ressource dans la charge utile (verification_id pour liveness.completed, data.id pour les événements de module).
Si votre serveur ne renvoie pas de réponse 2xx, Adhere considérera la livraison comme ayant échoué et tentera de réessayer.