شرح Webhooks: الحمولات الموقعة واستراتيجيات إعادة المحاولة

Backend2026-11-10TryQuickToolBox

لماذا تفشل Webhooks وكيفية إصلاحها

لقد قمت بدمج webhook لمزود الدفع لتحديث حالات الطلبات في تطبيقك. كل شيء يعمل في الاختبار، ولكن في الإنتاج، بعض الأحداث لا تصل أبدًا، أو الأسوأ من ذلك، تتلقى تكرارات. بدون احتياطات مناسبة، يمكن أن تصبح webhooks مصدرًا لفشل صامت وثغرات أمنية.

Webhooks هي عمليات استدعاء HTTP يتم تشغيلها بواسطة الأحداث، ولكن على عكس استدعاءات API النموذجية، فهي تعتمد على الدفع وغير متزامنة. هذا يقدم تحديتين أساسيين: التحقق من الأصالة وضمان التسليم. في هذا الدليل، سنعالج كليهما باستخدام الحمولات الموقعة وإعادة المحاولات الذكية.

ما هي Webhooks؟

Webhook هو استدعاء HTTP يحدده المستخدم. عندما يحدث حدث في نظام المصدر (مثل دفعة جديدة)، يرسل طلب HTTP POST إلى عنوان URL الذي تقدمه، يحتوي على بيانات الحدث. هذا يسمح بردود فعل في الوقت الفعلي دون استقصاء.

تشمل حالات الاستخدام الشائعة إشعارات الدفع، ومحفزات CI/CD، وتكاملات الدردشة. ولكن لأن webhooks تعبر الإنترنت العام، فهي عرضة للانتحال والفقدان.

تأمين Webhooks باستخدام الحمولات الموقعة

كيف تعرف أن webhook يأتي حقًا من مزودك؟ توقيع الحمولة باستخدام سر مشترك يضمن السلامة والأصالة.

كيف تعمل توقيعات HMAC

يحسب المزود HMAC (مثل SHA-256) لجسم الطلب باستخدام مفتاح سري، ويرسل التوقيع في رأس (مثل X-Signature). يعيد خادمك حساب HMAC ويقارنه باستخدام مقارنة ثابتة الوقت لمنع هجمات التوقيت.

// مثال Node.js: التحقق من توقيع webhook
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(payload);
  const digest = hmac.digest('hex');
  return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(digest));
}

أفضل الممارسات:

تنفيذ إعادة محاولات موثوقة

حتى مع التوقيعات، يمكن أن تتسبب مشكلات الشبكة أو التوقف في فشل تسليم webhook. عادةً ما يعيد المزودون المحاولة مع تأخير أسي، ولكن يجب عليك أيضًا التعامل مع إعادة المحاولات من جانبك.

Idempotency: مفتاح إعادة المحاولة الآمنة

يمكن أن تؤدي إعادة المحاولات إلى معالجة مكررة. استخدم مفاتيح idempotency (غالبًا ما تكون مضمنة في الحمولة أو كرأس) لضمان معالجة كل حدث مرة واحدة بالضبط. قم بتخزين معرفات الأحداث المعالجة وتجاهل التكرارات.

// مثال: معالج webhook idempotent
const processedEvents = new Set();

app.post('/webhook', (req, res) => {
  const eventId = req.body.id;
  if (processedEvents.has(eventId)) {
    return res.status(200).send('Already processed');
  }
  // process event...
  processedEvents.add(eventId);
  res.status(200).send('OK');
});

استراتيجية إعادة المحاولة على جانب المتلقي

إذا فشلت المعالجة، استجب بحالة 5xx لتحفيز إعادة المحاولة من المزود. بالنسبة للأخطاء العابرة، يمكنك أيضًا تنفيذ قائمة انتظار إعادة المحاولة الخاصة بك مع تأخير.

السيناريوالاستجابةالإجراء
نجاح200 OKلا إعادة محاولة
خطأ في التحقق400 Bad Requestلا إعادة محاولة (إصلاح الحمولة)
خطأ في الخادم500 Internal Server Errorالمزود يعيد المحاولة
محدودية المعدل429 Too Many Requestsالمزود يعيد المحاولة بعد تأخير

مراقبة وتصحيح Webhooks

سجل جميع طلبات webhook الواردة مع الرؤوس والحمولات (احجب البيانات الحساسة). استخدم أداة مثل JSON Formatter لتنسيق الحمولات بشكل جميل لسهولة الفحص. قم بإعداد تنبيهات للتسليمات الفاشلة وتتبع عدد إعادة المحاولات.

الأسئلة الشائعة

ما هي حمولة webhook الموقعة؟

تتضمن الحمولة الموقعة توقيعًا تشفيريًا (عادة HMAC) يتحقق من أن الطلب جاء من مصدر موثوق ولم يتم العبث به.

كم مرة يجب أن أعيد محاولة webhook فاشل؟

يعيد معظم المزودين المحاولة 3-5 مرات مع تأخير أسي. كمتلقي، استجب برموز الحالة المناسبة ودع المزود يتعامل مع إعادة المحاولات.

هل يمكنني استخدام webhooks بدون HTTPS؟

لا - HTTPS ضروري لتشفير الحمولة ومنع هجمات man-in-the-middle. لا تقبل أبدًا webhooks عبر HTTP العادي.

هل أنت مستعد لفحص وتصحيح حمولات webhook؟ جرب JSON Formatter المجاني الخاص بنا لتنسيق والتحقق من بيانات JSON على الفور.