Tableau de bord ↗ العربية

Votre endpoint webhook tourne sur localhost, lahsab ne peut pas l’atteindre. Plutôt qu’un tunnel tiers, le CLI inverse le sens de la connexion : il se connecte à lahsab, reçoit les events de votre marchand en temps réel, et les re-POST sur votre serveur local, signés exactement comme en production. Votre code de vérification de signature est exercé à l’identique, avec le même secret whsec_ que celui de votre environnement.

Écouter

  1. Exporter la clé sandbox (visible dans Développeurs) :

    export LAHSAB_API_KEY=lsk_sandbox_…
  2. Lancer l’écouteur vers votre endpoint local :

    lahsab listen --forward-to http://localhost:3000/webhooks/lahsab
  3. Déclencher un event, depuis votre intégration, le dashboard, ou lahsab trigger :

    lahsab trigger invoice.paid

Le CLI affiche chaque event reçu, le code de réponse de votre endpoint et la latence :

lahsab listen
  API      http://localhost:3100
  Forward  http://localhost:3000/webhooks/lahsab

17:42:03 Connecté : Ma Boutique (sandbox)
17:42:03 Signature avec le secret whsec_4f2…
17:42:03 En attente d'events… (Ctrl+C pour quitter)
17:42:19 invoice.paid [a1b2c3…] → 200 (34 ms)

Au démarrage, l’écouteur affiche le secret de signature utilisé : c’est le whsec_ de votre environnement sandbox (créé automatiquement s’il n’existait pas encore). Mettez-le dans le .env de votre serveur local : la vérification de signature fonctionne alors sans aucune adaptation entre le développement et la production.

Filtrer les types reçus :

lahsab listen \
  --forward-to http://localhost:3000/webhooks/lahsab \
  --events invoice.paid,payment.confirmed

Déclencher des events

lahsab trigger fabrique un scénario complet côté sandbox, fixtures comprises, et déclenche l’event associé, sans quitter le terminal :

ScénarioCe qui se passe
payment.intent_createdCrée un intent
payment.proof_submittedIntent + preuve synthétique
payment.proof_validatedIntent + preuve jugée cohérente, paiement non confirmé
payment.confirmedIntent + preuve + confirmation
payment.rejectedIntent + preuve + rejet
payment.expiredIntent + expiration
invoice.paidProduit + tarif + client + abonnement + facture payée
billing.tickForce une exécution de l’horloge de facturation

Sous le capot

L’écouteur consomme un flux SSE authentifié par clé API, observable au curl :

curl -N http://localhost:3100/webhooks/listen \
  -H "x-api-key: lsk_sandbox_CLE" \
  -H "accept: text/event-stream"

Trois types de messages : ready (marchand, environnement, secret de signature), event (id, type, createdAt et body, le corps JSON exact qui est re-signé et forwardé), ping (keep-alive). À la reconnexion, le CLI transmet le dernier id reçu (Last-Event-ID) et le serveur rejoue les events manqués.

Les events existent indépendamment de la livraison : ils sont émis et persistés même sans URL d’endpoint configurée. Un endpoint configuré continue de recevoir ses livraisons normalement pendant qu’un écouteur tourne : les deux voies coexistent.