Webhooks
يوقع حساب أحداث الفواتير والعملاء ويسلمها إلى نقطتك، مع إعادة محاولات تلقائية. كل شيء يُضبط من لوحة التحكم.
تُدار Webhooks بالكامل من لوحة التحكم. لا حاجة لأي استدعاء API لتسجيل واحدة.
في لوحة التحكم، افتح الإعدادات ثم Webhooks، وأضف نقطة HTTPS الخاصة بك.
اختر الأحداث التي تريد استقبالها وانسخ سر التوقيع. ستحتاجه للتحقق من التسليمات.
أعد 2xx بسرعة من نقطتك. أي نتيجة أخرى تُعتبر فشلاً ويعاد المحاولة.
تسعة أنواع أحداث تُرسل اليوم، تغطي دورة حياة الفاتورة وتغييرات العملاء.
invoice.created | أُنشئت مسودة فاتورة |
invoice.updated | عُدلت مسودة فاتورة |
invoice.finalized | حصلت فاتورة على رقمها الرسمي |
invoice.sent | وُضعت علامة مُرسلة على فاتورة |
invoice.paid | وُضعت علامة مدفوعة على فاتورة |
invoice.voided | أُلغيت فاتورة |
customer.created | أُنشئ عميل |
customer.updated | عُدل عميل |
customer.deleted | أُرشف عميل |
التسليمات هي POST بصيغة JSON تحمل اسم الحدث ولقطة المورد ومعرف مؤسستك ووقت الإصدار:
POST https://example.ma/hisab-webhook
Content-Type: application/json
X-Webhook-Signature: v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
X-Webhook-Timestamp: 1780750800
X-Webhook-Event: invoice.paid
X-Webhook-Delivery-Id: del_3f8c2a91
User-Agent: Hisab-Webhooks/1.0
{
"event": "invoice.paid",
"data": {
"id": "inv_8f3a91",
"invoice_number": "FAC-2026-0142",
"status": "paid",
"total": "12480.00"
},
"organization_id": "org_4d11a7",
"created_at": "2026-06-05T14:00:00Z"
}event | string |
data | object |
organization_id | string |
created_at | datetime (ISO 8601) |
كل تسليم موقع بسر نقطتك: HMAC-SHA256 على الطابع الزمني ثم نقطة ثم الجسم الخام. تحقق دائماً قبل الوثوق بالحمولة.
X-Webhook-Signature: v1=HMAC_SHA256(secret, timestamp + "." + payload)import { verifyWebhookSignature } from 'hisab-sdk';
export async function POST(req: Request) {
const payload = await req.text();
const valid = verifyWebhookSignature({
payload,
signature: req.headers.get('x-webhook-signature')!,
timestamp: req.headers.get('x-webhook-timestamp')!,
secret: process.env.HISAB_WEBHOOK_SECRET!,
});
if (!valid) return new Response('Invalid signature', { status: 401 });
return new Response('ok');
}ينجح التسليم بأي استجابة 2xx خلال 30 ثانية. غير ذلك يعاد حتى 5 مرات بمهل متزايدة:
| المحاولة | المهلة |
|---|---|
| 1 | ~1 min |
| 2 | ~5 min |
| 3 | ~15 min |
| 4 | ~1 h |
| 5 | ~4 h |
تحمل المهل نحو 20% من العشوائية (jitter) فالأوقات الدقيقة تتغير. بعد الفشل الخامس يوسم التسليم فاشلاً؛ يمكنك إعادة تشغيله يدوياً من لوحة التحكم.
ارفض كل ما يفشل في التحقق. فهو لم يأتِ من حساب.
أكّد بـ 2xx قبل أي معالجة ثقيلة؛ ينتهي وقت التسليم بعد 30 ثانية.
تعيد المحاولات استخدام ترويسة X-Webhook-Delivery-Id. خزّنه وتجاوز ما عالجته سابقاً.
ادفع الحدث إلى طابور أو مهمة خلفية بدلاً من معالجته مباشرة.
خزّنه كما تخزن كلمة سر ودوّره من لوحة التحكم إذا تسرب يوماً.