دليل تكامل آمن · 17 أكتوبر 2026

كيف تربط Webhooks بين بوابة الدفع ومنتجك الرقمي؟

التحويل بعد Checkout لا يثبت أن المال وصل. الربط الموثوق يبدأ بحدث موقّع من بوابة الدفع، يُحفظ مرة واحدة، ثم يحدّث صلاحية العميل بصورة ذرّية وقابلة للمراجعة.

شاهد مسار التنفيذ مبني على وثائق Paddle وStripe وLemon Squeezy الرسمية
بطاقة Stripe Docs الرسمية عن استقبال أحداث Webhook
10 قواعد تشغيلتوقيع · تكرار · ترتيب · استرجاع
القرار في 30 ثانيةWebhook هو مصدر الحقيقة

أنشئ Checkout من الخادم بسعر معروف، وضع معرف العميل والمنتج في بيانات مخصصة. عند وصول Webhook: اقرأ الجسم الخام، تحقق من التوقيع، خزّن معرف الحدث بقيد فريد، أرجع 2xx بسرعة، ثم عالج الحدث في Queue. حدّث الوصول من حالة الدفع أو الاشتراك، لا من صفحة النجاح ولا من قيمة أرسلها المتصفح.

إثبات المصدرSignature
منع التنفيذ مرتينIdempotency
المعالجة الموثوقةQueue + Audit

بطاقة سريعة

Endpoint
POST عام عبر HTTPS
المدخل الصحيح
Raw body + Signature header
مفتاح التكرار
معرف الحدث عند المزود
تاريخ التحقق
17 أكتوبر 2026
01المسار الكامل

افصل Checkout عن منح الوصول

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

خط السير المقترح
  • الخادم ينشئ جلسة بسعر ومعرف منتج معروفين
  • العميل يدفع على Checkout المستضاف أو المدمج
  • المزود يرسل Webhook إلى Endpoint عام
  • Endpoint يتحقق من التوقيع ويحفظ الحدث الخام
  • المعالج الخلفي يطابق العميل والمنتج والمبلغ والعملة
  • معاملة قاعدة بيانات واحدة تحدّث الدفع والصلاحية
  • صفحة النتيجة تستعلم من خادمك أو تستقبل نتيجة موقعة
02التحقق من المصدر

تحقق من التوقيع قبل JSON.parse

توقيع Webhook يُحسب على البايتات الأصلية. إذا حوّل Framework الجسم إلى JSON ثم أعاد ترتيبه أو غيّر المسافات، قد يفشل التحقق. احصل على Raw body أولاً، اقرأ Header الصحيح، واستخدم السر الخاص بنفس Endpoint والبيئة.

المزودHeaderالمادة الموقعةالتوصية
PaddlePaddle-Signatureالوقت + نقطتان + الجسم الخامSDK رسمي وتحقق من حد الزمن
StripeStripe-Signatureالجسم الخام وفق سر Endpointدالة SDK المخصصة
Lemon SqueezyX-SignatureHMAC-SHA256 للجسم الخاممقارنة ثابتة الزمن

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

03منع التكرار

افترض أن الحدث نفسه سيصل أكثر من مرة

Paddle توثق تسليماً «مرة واحدة على الأقل»، وStripe وLemon Squeezy يعيدان المحاولة عند الفشل. إذا كان كل وصول يضيف رصيداً أو يرسل ترخيصاً جديداً، سيتكرر التنفيذ. ضع قيداً فريداً على معرف الحدث، وسجّل نتيجة المعالجة داخل معاملة.

نمط آمن
  • INSERT للحدث مع Unique(provider, event_id)
  • إذا تعارض المفتاح، أعد 2xx ولا تنفذ الأثر ثانية
  • اجعل منح الرصيد نفسه قابلاً للتكرار بمعرف العملية
  • لا تستخدم البريد الإلكتروني كمفتاح للحدث أو العميل
  • احتفظ بعدد المحاولات والخطأ الأخير ووقت النجاح
04ترتيب الأحداث

الوصول المتأخر لا يجب أن يعيد الحالة إلى الوراء

قد يصل إلغاء قبل تحديث سابق، أو يصل نجاح الدفع بعد محاولة فاشلة. Paddle تطلب استخدام occurred_at لا وقت الاستلام لفهم الترتيب. في الأنظمة الأخرى، استخدم وقت إنشاء الحدث أو استرجع الكائن الحالي من API عندما تكون الحالة حساسة.

خزن آخر نسخة أو آخر وقت حدث مقبول لكل اشتراك. لا تجعل حدثاً أقدم يستبدل حالة أحدث. ومع ذلك، تعامل مع الاسترجاع والنزاع كأحداث مالية مستقلة تحتاج أثراً واضحاً، لا مجرد مقارنة زمنية عمياء.

نظام الحدث

احفظ أولاً ثم عالج خارج الطلب

الاستجابة السريعة تمنع إعادة المحاولات غير الضرورية، بينما Queue تمنحك إعادة تنفيذ مراقبة إذا تعطلت قاعدة البيانات أو خدمة البريد.

بطاقة Paddle الرسمية حول طريقة عمل Webhooks
المصدر: Paddle Developer Docs
05حالات الوصول

ارسم آلة حالات قبل كتابة switch كبير

عملية لمرة واحدة قد تنتقل من Pending إلى Paid ثم Refunded أو Disputed. الاشتراك يحتاج حالات Trialing وActive وPast due وPaused وCanceled وExpired. اربط كل حالة بقرار وصول واضح، وحدد فترة السماح وسياسة الاسترجاع.

الحدث التجاريما تخزنهقرار الوصول
دفع مكتملالمعاملة والمبلغ والعملة والمنتجمنح الوصول مرة واحدة
تجديد ناجحالدورة الجديدة وتاريخ الانتهاءتمديد الصلاحية
فشل دفعالمحاولة والحالة وموعد الإعادةفترة سماح وفق السياسة
إلغاء اشتراكends_at والتغيير المجدولالوصول حتى نهاية المدفوع غالباً
استرجاع أو نزاعالمبلغ والسبب والمرجعتطبيق السياسة وتسجيل التدخل
06نموذج البيانات

افصل الحدث والدفع والاشتراك والصلاحية

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

حقول أساسية
  • provider، environment، event_id، event_type، occurred_at
  • customer_id داخلي ومعرف العميل لدى المزود
  • transaction_id، subscription_id، price_id، product_id
  • amount، currency، status، paid_at، refunded_at
  • processed_at، attempts، last_error، payload_hash
  • entitlement_key، starts_at، ends_at، revoked_at
07اختلاف المزودين

ابنِ Adapter موحداً، لا Endpoint عامّاً بلا حدود

يمكن أن تستقبل كل بوابة في مسار منفصل مثل /api/webhooks/paddle و/api/webhooks/stripe. كل Adapter يتحقق من توقيعه ويحوله إلى أحداث داخلية قليلة: PaymentPaid وSubscriptionChanged وRefundCreated. منطق الصلاحيات يستهلك الأحداث الداخلية ولا يعرف أسماء المزود.

Paddle توصي بالرد خلال خمس ثوانٍ وتوفر Simulator. Stripe توصي برد 2xx سريعاً قبل المنطق المعقد، وتوفر CLI للاختبار المحلي. Lemon Squeezy يعيد المحاولة حتى ثلاث مرات بعد المحاولة الأولى ويتيح محاكاة أحداث الاشتراك في Test mode. صمّم Queue والمراقبة وفق ضمانات المزود الفعلية.

08خطة الاختبار

اختبر الفشل المتعمد، لا المسار السعيد فقط

مصفوفة قبل Production
  • توقيع صحيح وخاطئ وجسم تم تغييره
  • الحدث نفسه مرتين وعشرين مرة بالتزامن
  • حدثان خارج الترتيب
  • قاعدة البيانات متوقفة بعد حفظ الحدث
  • Queue تفشل ثم تعيد المحاولة
  • دفع ناجح ثم استرجاع جزئي وكامل
  • اشتراك جديد وتجديد وفشل وإلغاء وانتهاء
  • Sandbox لا يستطيع تعديل جداول Production
  • إعادة إرسال الحدث من لوحة المزود

بعد الاختبار، قارن رصيد المزود بسجل معاملاتك وصلاحيات العملاء. أي فرق يجب أن يظهر في تقرير مصالحة وتنبيه، لا أن ينتظر شكوى العميل.

09بوابة الإنتاج

لا تطلق قبل اكتمال هذه النقاط

قائمة نهائية
  • HTTPS وPOST فقط مع حد لحجم الطلب
  • Raw body محفوظ مؤقتاً للتحقق من التوقيع
  • أسرار منفصلة لكل مزود وبيئة وEndpoint
  • Unique key للأحداث ومعالجة ذرّية للصلاحيات
  • استجابة 2xx سريعة ثم معالجة غير متزامنة
  • دعم الأحداث المتأخرة والمكررة
  • سجل تدقيق ومصالحة وتنبيهات للفشل
  • اختبارات Sandbox ومحاكاة وإعادة إرسال
  • صفحة نتيجة لا تثق ببارامترات المتصفح
الخطوة السابقة

اختر البوابة قبل تصميم أحداثك

قارن نموذج Merchant of Record والفوترة والرسوم والأهلية، ثم طبّق Adapter يناسب أحداث المزود المختار.

مقارنة بوابات الدفع
المصادر والمنهجية: راجعنا طريقة عمل Paddle Webhooks والتحقق من التوقيع، ووثائق Stripe Webhooks، ودليل Lemon Squeezy وتوقيع طلباته بتاريخ 17 أكتوبر 2026.
اقرأ أيضاً: اختيار نموذج التسعير وخصائص لوحة إدارة AI SaaS.