منح الاستحقاق
الحمولة المرسلة إلى نقطة نهاية الويب هوك الخاصة بك عند إنشاء أو تسليم أو فشل أو إلغاء منحة الاستحقاق.
أحداث منح الاستحقاق عبر webhook
يتم إطلاق هذه الأحداث كلما تغيرت حالة منحة استحقاق العميل، على سبيل المثال عند إنشاء مفتاح ترخيص، أو تعيين دور Discord، أو توفير رابط تنزيل، أو سحب الوصول. اشترك في هذه الأحداث للحفاظ على توافق تطبيقك مع ما يمكن لكل عميل الوصول إليه.| الحدث | الوصف |
|---|---|
entitlement_grant.created | تم إنشاء صف منح جديد. الحالة هي delivered مباشرة لمفاتيح الترخيص المفعلة تلقائيًا، و pending لمفاتيح الترخيص المفعلة يدويًا وكل تكامل آخر. |
entitlement_grant.delivered | ينتقل المنح إلى الحالة المُسلمة. الآن يمكن للعميل الوصول إلى المنصة المستحقة أو الملف أو مفتاح الترخيص. |
entitlement_grant.failed | فشلت عملية التسليم ولن تُعاد المحاولة. قم بفحص error_code و error_message. |
entitlement_grant.revoked | تم سحب الوصول. قم بفحص revocation_reason لفهم السبب. |
EntitlementGrantResponse الموثقة في المخطط أدناه.
محفزات الأحداث
entitlement_grant.created
تم إدخال صف المنحة للتو. يكون للمنحة دائمًاid ثابت من هذه النقطة فصاعدًا، حتى لو تغيرت حالتها. استخدم هذا الحدث لتسجيل أن الإنجاز قيد التقدم.
بالنسبة لمفاتيح الترخيص المفعلة تلقائيًا يتم إدراج الصف مباشرة مع تعبئة status: "delivered" و delivered_at، لذا يتبع حدث created واحد ذلك بدون تغييرات حالة أخرى ما لم يتم إلغاء المنح لاحقًا.
بالنسبة لمفاتيح الترخيص المفعلة يدويًا (الاستحقاقات مع fulfillment_mode: manual) يصل الصف مع status: "pending" وبدون كائن license_key — لا يوجد مفتاح بعد. هذا الحدث هو إشارة لك بأن هناك مفتاحًا ينتظر التفعيل؛ قم بتوفيره عبر POST /grants/{grant_id}/license-key، الذي بعده يطلق entitlement_grant.delivered. راجع التفعيل اليدوي.
بالنسبة لكل تكامل آخر يصل الصف مع status: "pending". يحدث حدث delivered أو failed بعد اكتمال التسليم:
- تشمل التكاملات القائمة على OAuth (Discord, GitHub, Notion)
oauth_urlيجب على العميل زيارته لإكمال الموافقة. يبقى المنحpendingحتى يقوم العميل بالترخيص. - التكاملات المباشرة مع المنصة (Telegram, Framer, Digital Files) تكون في
pendingلفترة وجيزة فقط أثناء تشغيل المكالمة المنصة، ثم تنتقل إلىdelivered.
entitlement_grant.delivered
انتقل المنح منpending إلى delivered. العميل لديه الآن الوصول كما هو موصوف في الاستحقاق. استخدم هذا الحدث لفتح ميزات تعتمد عليها في نظمتك الخاصة، على سبيل المثال لتوفير مساحة عمل أو إرسال بريد ترحيبي مخصص أو وضع علامة “متحقق”.
يسجل حقل delivered_at في الحمولة عندما اكتمل التسليم. بالنسبة للمنح التي وصلت delivered عند الإنشاء، ستحصل على created وdelivered أحداث واحدة تلو الأخرى.
entitlement_grant.failed
تمت محاولة التسليم وفشلت مع خطأ غير ممكن إعادة المحاولة. يوضح الحقلerror_code وerror_message الفشل. تشمل الأسباب الشائعة إلغاء رمز OAuth، أو رفض إذن منصة، أو هدف مفقود (مثل، تم حذف خادم Discord).
entitlement_grant.revoked
تم سحب الوصول على مستوى المنصة: تم إزالة دور Discord، تم إزالة المتعاون في GitHub، تم تعطيل مفتاح الترخيص، لم يعد يتم إصدار روابط تحميل الملفات. يسجل حقلrevocation_reason المُحرك.
revocation_reason | المُحرك |
|---|---|
subscription_cancelled | تم إلغاء اشتراك العميل (حدث subscription.cancelled). |
subscription_on_hold | الاشتراك في وضع الإيقاف المؤقت بسبب فشل التجديد (subscription.on_hold). يمكن استرداده: تنجح محاولة إعادة التجديد بإعادة منح جديدة. |
subscription_expired | وصل الاشتراك إلى نهاية فترة صلاحيته (subscription.expired). |
plan_changed | تغيرت الخطة؛ تم إلغاء المنح القديمة قبل إصدار المنح الجديدة (subscription.plan_changed). |
refund | تمت معالجة استرداد للدفعة الأصلية لمرة واحدة (refund.succeeded). |
manual | قام التاجر بإلغاء المنح عبر API أو لوحة التحكم. لا يتم إعادة منح الإلغاءات اليدوية تلقائيًا عند تجديد الاشتراك. |
license_key_disabled | تم تعطيل مفتاح الترخيص وراء منح مفتاح الترخيص. يتم إعادة تنشيط المنح تلقائيًا إذا أُعيد تمكين المفتاح. |
platform_external | انحرف جانب المنصة للتكامل عن المزامنة (على سبيل المثال، تم إزالة دور Discord يدويًا، فقدت تطبيق GitHub حق الوصول إلى المستودع، أو اكتشفت عملية المراجعة هدفًا مفقودًا). لا يتم إعادة منح الإلغاءات تلقائيًا عند تجديد الاشتراك حتى يتم حل المشكلة الأساسية في المنصة. |
أنواع الحمولة
الحقلdata يكون دائمًا كائن EntitlementGrantResponse. تحمل الحمولة حقل integration_type (على سبيل المثال license_key, digital_files, discord) حتى تتمكن من التعرف على نوع المنح مباشرة. نوعان من التكاملات يرفقان كائنات إضافية متداخلة:
license_keyيتم تضمينه عندما يكونintegration_typeهوlicense_keyوقد تم إصدار مفتاح. يحتوى على المفتاح المُولد والانتهاء والاستخدام النشط. بالنسبة لمنح مفعّل يدويًا ما زال فيpending، هذا الكائن هوnullحتى تقوم بتفعيل المنح.digital_product_deliveryيتم تضمينه عندما يكونintegration_typeهوdigital_files. يحتوى على روابط تحميل موقعة مسبقاً، وinstructionsاختياري، وexternal_urlاختياري.
null؛ يتم التقاط الإعدادات ذات الصلة في الاستحقاق نفسه، وليس في المنح.
عينات الحمولة
مفتاح الترخيص المسُلم (entitlement_grant.delivered)
مفتاح الترخيص قيد التفعيل اليدوي (entitlement_grant.created)
يتم إطلاقه عندما يشتري العميل منتجًا يستحق مفتاح ترخيص يستخدم fulfillment_mode: manual. يبقى المنح في pending بدون كائن license_key بعد — يتوجب على التاجر توفير المفتاح.
الملفات الرقمية المسلمة (entitlement_grant.delivered)
تم إنشاء دور Discord وعالق (entitlement_grant.created)
منح مُلغى بسبب إلغاء اشتراك (entitlement_grant.revoked)
فشلت عملية التسليم (entitlement_grant.failed)
نصائح للتكامل
- انتظر
entitlement_grant.deliveredقبل فتح الميزات التابعة. يخبرك حدثpayment.succeededبأن المال تم مسحه؛ لا يخبرك أن العميل حصل على المستودع في GitHub أو دور Discord بعد. يعتبر حدثdeliveredمصدر الحقيقة للتفعيل. - قم بتعيين
revocation_reasonعلى تدفقات الاحتفاظ. يشير إلغاءsubscription_on_holdعادةً إلى فشل بطاقة العميل وأن التجديد التالي سيتعين عليه إعادة منح الوصول. يعتبر إلغاءmanualأوsubscription_cancelledمقصودًا. تعامل معها بشكل مختلف في رسائل العملاء. - استخدم منح
idكمفتاح عدم التكرار. ينبعث عن المنح الواحد حدثcreatedواحد وحدث نهائي واحد على الأكثر (deliveredأوfailed)، وحوالي حدث واحدrevoked. يمكن أن تكرر إعادة التسليم من نظام الويب هوك الأحداث؛ يتم الاستبعاد من خلال منحidبالإضافة إلىtype. - اقرأ
integration_typeللتعرف على نوع المنح. تحمل الحمولةintegration_typeمباشرة (مثلlicense_key،digital_files،discord). يتم تعبئة الكائنات المتداخلةlicense_keyوdigital_product_deliveryبمجرد تسليم منحها الخاصة؛ يبقى منح مفتاح الترخيص المفعّل يدويًاpendingبداخلهintegration_type: "license_key"وكائنnulllicense_keyحتى تقوم بتفعيله. - بالنسبة للمنح المستندة إلى OAuth، أظهر
oauth_urlللعميل. الحدثentitlement_grant.createdلتدفقات مشترك Discord، GitHub، أو Notion يتضمنoauth_urlوoauth_expires_at. أرسلها عبر البريد الإلكتروني للعميل أو اعرضها في تطبيقك لإزالة عوائق التسليم.
Detailed view of a single entitlement grant: who it's for, its lifecycle state, and any integration-specific delivery payload.
Brand id this grant belongs to.
Identifier of the business that owns the grant.
Timestamp when the grant was created.
Identifier of the customer the grant was issued to.
Identifier of the entitlement this grant was issued from.
Unique identifier of the grant.
The integration type of the grant's entitlement (e.g. license_key).
discord, telegram, github, figma, framer, notion, digital_files, license_key Arbitrary key-value metadata recorded on the grant.
Lifecycle status of the grant.
Pending, Delivered, Failed, Revoked Timestamp when the grant was last modified.
Timestamp when the grant transitioned to delivered, when applicable.
Digital-product-delivery payload, present when the entitlement
integration is digital_files.
Machine-readable code reported when delivery failed, when applicable.
Human-readable message reported when delivery failed, when applicable.
License-key delivery payload, present when the entitlement integration
is license_key.
Timestamp when oauth_url stops being valid, when applicable.
Customer-facing OAuth URL for OAuth-style integrations. Populated
during the customer-portal accept flow; null until the customer
completes that step, and on grants for non-OAuth integrations.
Identifier of the payment that triggered this grant, when applicable.
Reason recorded when the grant was revoked, when applicable.
Timestamp when the grant transitioned to revoked, when applicable.
Identifier of the subscription that triggered this grant, when applicable.