Webhooks والتحقق من التوقيع
تدفع كلتا الواجهتين الأحداث إلى نقطة النهاية لديك. تحقق من كل تسليم قبل معالجته: افحص التوقيع بمقارنة ثابتة الزمن، وارفض الطوابع الزمنية القديمة، وأزل التكرار بمعرّف التسليم.
webhooks من TravelDistro
- X-TD-Webhook-Signature
- sha256=<hex>، وهو HMAC-SHA256 لـ {TIMESTAMP}.{RAW_BODY} بسر نقطة النهاية
- X-TD-Webhook-Timestamp
- ثوانٍ Unix؛ ارفض إذا كان أقدم من 300 ثانية
- X-TD-Webhook-Event
- نوع الحدث، مثل transfer.confirmed
- X-TD-Webhook-Id
- معرّف التسليم، ثابت عبر إعادة المحاولة؛ أزل التكرار به
- إعادة المحاولة
- محاولتان مع تراجع أُسّي ثم رسالة ميتة
أحداث النقل
- transfer.confirmed
- transfer.updated
- transfer.driver_assigned (تصل بيانات السائق هنا)
- transfer.driver_unassigned
- transfer.cancelled
التحقق في Node.js
import crypto from "node:crypto";
// TravelDistro webhook: X-TD-Webhook-Signature = "sha256=" + HMAC-SHA256(`${timestamp}.${rawBody}`, endpointSecret)
export function verifyTravelDistroWebhook(headers: Record<string, string>, rawBody: string, endpointSecret: string): boolean {
const timestamp = headers["x-td-webhook-timestamp"];
const signature = headers["x-td-webhook-signature"] ?? "";
if (!timestamp || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false; // stale or replayed
const expected = "sha256=" + crypto.createHmac("sha256", endpointSecret).update(`${timestamp}.${rawBody}`).digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(signature);
return a.length === b.length && crypto.timingSafeEqual(a, b); // constant-time compare
}
// Deduplicate by X-TD-Webhook-Id: the same id is reused on every retry of one delivery.Hotel API من Safaryar Holidays
- X-Webhook-Signature
- توقيع HMAC للتسليم
- الأحداث
- booking.created وbooking.cancelled وbooking.prebook_confirmed وbooking.prebook_rejected
- إعادة المحاولة
- لا توجد؛ استجب خلال 10 ثوانٍ
قائمة تحقق نقطة النهاية
- اقرأ المحتوى الخام قبل أي تحليل JSON؛ يغطي التوقيع البايتات الدقيقة.
- أعد 2xx بسرعة وعالج بشكل غير متزامن.
- خزّن معرّفات التسليم المعالجة لمدة نافذة إعادة المحاولة على الأقل.
- عامل سر نقطة النهاية كسر API: على الخادم فقط.
وكالة سفر مرخّصة؟ قدّم طلب الوصول إلى API.
احصل على وصول API