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

Backend2026-10-27TryQuickToolBox

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

ما هي Webhooks؟

webhooks هي عمليات استدعاء HTTP محددة من قبل المستخدم يتم تشغيلها بواسطة الأحداث. عندما يحدث شيء ما في نظام المصدر (مثل طلب جديد)، فإنه يرسل طلب HTTP POST إلى عنوان URL الذي تقدمه. على عكس الاستقصاء (polling)، تدفع webhooks البيانات في الوقت الفعلي تقريبًا، مما يقلل من زمن الوصول وحمل الخادم.

ومع ذلك، تقدم webhooks تحديات: ضمان أن الطلب جاء بالفعل من المرسل المتوقع، والتعامل مع حالات الفشل بسلاسة، وتجنب المعالجة المكررة.

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

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

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

يحسب المرسل رمز مصادقة الرسائل القائم على التجزئة (HMAC) باستخدام سر مشترك ونص الطلب. يتم إرسال التوقيع في رأس (مثل X-Signature). تقوم بإعادة حساب HMAC من جانبك ومقارنته.

// Node.js example: verifying a webhook signature
const crypto = require('crypto');

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

استخدم دائمًا دالة مقارنة ثابتة الوقت مثل timingSafeEqual لمنع هجمات التوقيت.

تضمين طابع زمني

لمنع هجمات إعادة التشغيل، قم بتضمين طابع زمني في الحمولة الموقعة وارفض الطلبات الأقدم من بضع دقائق (مثل 5 دقائق). يجب أن يكون الطابع الزمني جزءًا من البيانات الموقعة.

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

يمكن أن تتسبب مشكلات الشبكة أو أخطاء الخادم المؤقتة في فشل تسليم webhook. يقوم المرسل القوي بإعادة محاولة عمليات التسليم الفاشلة باستخدام التراجع الأسي.

استراتيجية إعادة المحاولة

مثال: إعادة المحاولة مع التراجع في Python

import time
import requests
from requests.exceptions import RequestException

def send_webhook(url, payload, max_retries=5):
    for attempt in range(max_retries):
        try:
            response = requests.post(url, json=payload, timeout=5)
            if response.status_code < 500:
                return True  # success or client error (no retry)
        except RequestException:
            pass
        time.sleep(2 ** attempt)  # exponential backoff
    return False

أفضل الممارسات لمستهلكي Webhook

مقارنة: Webhooks مقابل الاستقصاء

الجانبWebhooksالاستقصاء
زمن الوصولفي الوقت الفعلي تقريبًايعتمد على الفاصل الزمني
حمل الخادممنخفض (دفع فقط)مرتفع (طلبات متكررة)
التعقيدأعلى (بحاجة إلى نقطة نهاية، أمان)أقل
الموثوقيةيتطلب إعادة المحاولةإعادة المحاولة متأصلة

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

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

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

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

الممارسة الشائعة هي 3-5 محاولات مع التراجع الأسي، ولكن هذا يعتمد على اتفاقية مستوى الخدمة (SLA) وأهمية الحدث.

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

لا، استخدم دائمًا HTTPS لحماية الحمولة والتوقيع من الاعتراض. HTTP العادي يعرض البيانات الحساسة للخطر.

عند تصحيح حمولات webhook، قد تحتاج إلى تنسيق JSON بسرعة. جرب JSON Formatter الخاص بنا لطباعة وتنسيق والتحقق من استجابات JSON.