نقطة نهاية webhook عندك تعمل على localhost، و lahsab لا يستطيع الوصول إليها. بدل نفق من طرف ثالث، تعكس أداة CLI اتجاه الاتصال: تتصل هي بخوادم lahsab، وتستقبل أحداث حسابك التجاري لحظة وقوعها، ثم تعيد إرسالها بطلبات POST إلى خادمك المحلي، موقعة تماما كما في الإنتاج. هكذا يمر كودك الخاص بالتحقق من التوقيع بنفس المسار، وبنفس سر التوقيع whsec_ الخاص ببيئتك.

الاستماع

  1. تصدير مفتاح Sandbox (تجده في قسم المطورين):

    export LAHSAB_API_KEY=lsk_sandbox_…
  2. تشغيل المستمع نحو نقطة النهاية المحلية:

    lahsab listen --forward-to http://localhost:3000/webhooks/lahsab
  3. إطلاق حدث، من تطبيقك، أو من لوحة التحكم، أو عبر lahsab trigger:

    lahsab trigger invoice.paid

تعرض أداة CLI كل حدث مستقبل، مع رمز استجابة نقطة النهاية وزمن الاستجابة:

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)

عند الانطلاق يعرض المستمع سر التوقيع المستعمل: وهو whsec_ الخاص ببيئة Sandbox عندك (ينشأ تلقائيا إن لم يكن موجودا). ضعه في ملف .env لخادمك المحلي، فيعمل التحقق من التوقيع دون أي تعديل بين التطوير والإنتاج.

لتصفية أنواع الأحداث المستقبلة:

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

إطلاق الأحداث

يبني الأمر lahsab trigger سيناريو كاملا في بيئة Sandbox، بما في ذلك بيانات التجربة، ويطلق الحدث المرتبط به، دون مغادرة الطرفية:

السيناريوما يحدث
payment.intent_createdينشئ intent
payment.proof_submittedintent مع وصل اصطناعي
payment.proof_validatedintent مع وصل اعتبر متوافقا، والدفعة غير مؤكدة
payment.confirmedintent مع وصل وتأكيد
payment.rejectedintent مع وصل ورفض
payment.expiredintent مع انتهاء الصلاحية
invoice.paidمنتج وتسعيرة وزبون واشتراك وفاتورة مدفوعة
billing.tickيفرض تشغيل ساعة الفوترة

خلف الكواليس

يستهلك المستمع تدفق SSE مصادقا عليه بمفتاح API، ويمكن معاينته مباشرة عبر curl:

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

ثلاثة أنواع من الرسائل: ready (التاجر والبيئة وسر التوقيع)، و event (يحمل id و type و createdAt و body، وهو نص JSON الكامل الذي يعاد توقيعه وإرساله)، و ping (لإبقاء الاتصال حيا). عند إعادة الاتصال ترسل أداة CLI آخر id مستقبل (عبر Last-Event-ID) فيعيد الخادم إرسال الأحداث الفائتة.

الأحداث موجودة بمعزل عن التسليم: فهي تصدر وتخزن حتى دون إعداد عنوان URL لنقطة النهاية. ونقطة نهاية معدة مسبقا تواصل استقبال تسليماتها كالمعتاد أثناء عمل المستمع: القناتان تعملان معا.