بوابة الخصائص في تطبيقك الخاص بناءً على عملية شراء. توفر أذونات الراية المميزة قدرة بوليانية فوراً عند الدفع وتلغيها تلقائيًا عند الإلغاء.
يحول إذن الراية المميزة Dodo Payments إلى متجر راية مميزة يعى بالفواتير. أرفق راية مثل advanced_reports بمنتج، وكل عميل مدفوع يحصل على منحة يمكن لتطبيقك التحقق منها عبر API أو الاحتفاظ بالتزامن مع webhooks. لا منصة خارجية، لا OAuth، لا خطوة تسليم - المنحة نفسها هي القدرة.
لا يغادر أي شيء Dodo Payments — المنحة هي ما يتم تسليمه:
عند إتمام عملية الشراء، يتم إنشاء المنحة وتنتقل مباشرةً إلى Delivered. ولا توجد مرحلة Pending، ولا يتطلب الأمر أي إجراء من العميل، ولا توجد طريقة لفشل التسليم.
تحتوي المنحة على حمولة feature مكتوبة النوع: { "feature_type": "boolean", "feature_id": "advanced_reports" }. يقرأ تطبيقك feature_id لتحديد ما يجب إلغاء قفله.
يؤدي الإلغاء أو استرداد المبلغ أو الإلغاء اليدوي إلى نقل المنحة إلى Revoked، ويرى تطبيقك اختفاء العلامة.
تشمل الاستخدامات الشائعة البوابة المستندة إلى الخطط (Pro يفتح التحليلات)، القدرات الإضافية (ترقية “API access”)، وبرامج الوصول المبكر المباعة كمشتريات مرة واحدة.
feature_id هو معرف يختاره التاجر، وليس فريداً عبر الأذونات. يمكن أن يمنح اثنان من الأذونات نفس feature_id — على سبيل المثال، خطة Pro الشهرية وخطة Pro السنوية كلاهما يمنح advanced_reports.
في لوحة التحكم Dodo Payments، اذهب إلى الأذونات وانقر على + لبدء إذن جديد، ثم اختر الرايات المميزة.
2
Name the flag
أعط الراية اسم عرض للوحة التحكم الخاصة بك، ومعرف ميزة ستتحقق منه تطبيقك (تقترح لوحة التحكم واحدًا من الاسم)، ووصف حتى يعرف فريقك ماذا يتحكم.
Creating a feature flag. The Feature ID is what your application checks; Meta Data attaches limits alongside the flag.
3
Optionally add metadata
تبديل البيانات الوصفية لإرفاق تكوين المفاتيح والقيم — الحدود، أسماء المستويات، الحصص — التي يتم تسليمها إلى تطبيقك جنبًا إلى جنب مع الراية. انظر إرفاق الحدود بالبيانات الوصفية.
4
Confirm
انقر تأكيد. تظهر الراية في قائمة الأذونات الخاصة بك، جاهزة للإرفاق بالمنتجات.
The created feature flag. The right pane tracks every customer grant issued from it.
تجيب الراية البوليانية “هل لدى هذا العميل الميزة؟”. تجيب البيانات الوصفية “مع أي تكوين؟”. تقبل البيانات الوصفية للأذونات القيم النصية والعددية والرقمية والبولينيانية، وكل منحة تأخذ لقطة مجمدة من بيانات الإذن عند إنشائها.ذاك السلوك اللقطة هو ما يجعل البيانات الوصفية آمنة للاستخدام بالنسبة لحدود الخطط:
تحرير البيانات الوصفية للإذن لاحقًا يؤثر فقط على المنح المستقبلية. يحتفظ العملاء بالحدود التي اشتروا تحتها.
يتم إرجاع اللقطة على كل منحة كحقلها metadata، لذا يتيح لك اتصال API واحد الحصول على الراية وتكوينها.
على سبيل المثال، يتيح advanced_reports بتكوين { "tier": "pro", "monthly_report_limit": 100 } لتطبيقك فتح لوحة العدادات وتنفيذ حصة 100 تقرير بدون بحث ثانٍ. إذا قمت لاحقًا بزيادة الحد إلى 250، فإن العملاء الحاليين يبقون عند 100 حتى يحصلوا على منحة جديدة (على سبيل المثال، بعد تغيير الخطة).
استخدم البيانات الوصفية للحدود والتكوين؛ استخدم feature_id فقط للهوية. ترميز الحدود في المعرف (advanced_reports_100) يجبر على راية جديدة لكل تغيير في الحدود ويعطل تحقق تطبيقك.
سرد منح الرايات المميزة المسلمة للعميل وبناء مجموعة الميزات الممكنة. يعيد نقطة النهاية صفًا واحدًا لكل منحة عبر جميع الأذونات، يمكن تصفيتها بواسطة integration_type وstatus.
const features = new Map<string, Record<string, unknown>>();for await (const grant of client.customers.listEntitlementGrants('cus_abc123', { integration_type: 'feature_flag', status: 'Delivered',})) { if (grant.feature) { features.set(grant.feature.feature_id, grant.metadata ?? {}); }}if (features.has('advanced_reports')) { const limit = features.get('advanced_reports')?.monthly_report_limit; // unlock the dashboard, enforce the limit}
page = client.customers.list_entitlement_grants( customer_id="cus_abc123", integration_type="feature_flag", status="Delivered",)features = { grant.feature.feature_id: grant.metadata for grant in page.items if grant.feature}if "advanced_reports" in features: limit = features["advanced_reports"].get("monthly_report_limit")
page, _ := client.Customers.ListEntitlementGrants( ctx, "cus_abc123", dodopayments.CustomerListEntitlementGrantsParams{ IntegrationType: dodopayments.F("feature_flag"), Status: dodopayments.F("Delivered"), },)features := map[string]bool{}for _, grant := range page.Items { if grant.Feature.FeatureID != "" { features[grant.Feature.FeatureID] = true }}
يتم تعبئة حمولة feature فقط على منح feature_flag؛ إنها null لكل نوع تكامل آخر. انظر إلى مرجع API قائمة منح العملاء للحصول على شكل الاستجابة الكامل.
التحقق من API في كل طلب يضيف تأخيرًا إلى مسار التطبيقات الحر. قم بتخزين مجموعة الميزات لكل عميل مع فترة صلاحية قصيرة الأمد (دقائق، وليست ساعات)، وقم بإبطال التخزين المؤقت من معالج الويب هوك الخاص بك عند تغيير حالة منحة - ذلك المزيج يحافظ على سرعة التحقق ويجعل الإلغاءات شبه فورية.
تتبع منح الراية المميزة دورة الحياة القياسية للمنح مع تبسيط واحد: لا توجد خطوة تسليم، لذا لا تجلس المنح في pending ولا تنتقل إلى failed.تتبع منح علامات الميزات دورة حياة المنحة القياسية مع تبسيط واحد: لا توجد خطوة تسليم، لذلك لا تبقى المنح مطلقًا في Pending ولا تنتقل إلى Failed.
المشغّل
التأثير
نجاح عملية دفع لمرة واحدة / تفعيل الاشتراك
تم إنشاء المنحة مع تعيين status: delivered و delivered_at.
وضع الاشتراك قيد التعليق أو إلغاؤه أو انتهاؤه
تم إلغاء المنحة مع revocation_reason المطابق.
استرداد مبلغ لعملية دفع لمرة واحدة
تم إلغاء المنحة مع revocation_reason: refund.
استعادة الاشتراك (على سبيل المثال، نجاح عملية التحصيل المتأخر)
تتم استعادة المنحة المُلغاة إلى Delivered — مع بقاء معرّف المنحة id نفسه ومسح حقول الإلغاء.
إلغاء يدوي عبر API
تم إلغاء المنحة مع revocation_reason: manual. لا تتم استعادتها تلقائيًا عند التجديد.
أنشئ الراية.feature_id: advanced_reports مع البيانات الوصفية { "tier": "pro", "monthly_report_limit": 100 }.
قم بإرفاقها بمنتج الاشتراك في خطة Pro الخاصة بك.
اشتراك العميل. ينشئ Dodo Payments منحة delivered ويطلق entitlement_grant.created؛ يقوم معالج الويب هوك الخاص بك بتمكين advanced_reports للعميل بحد 100.
تطبيقك يبوّب الميزة. عند تحميل لوحة العدادات، تحقق من مجموعة الميزات المخبأة (أو اتصل بـ listEntitlementGrants) وعرض علامة التبويب للتقارير فقط عند توفر advanced_reports.
قام العميل بالإلغاء. يقوم Dodo Payments بإلغاء المنحة ويطلق entitlement_grant.revoked؛ يقوم معالجك بتعطيل الميزة. إذا تعافى العميل لاحقًا عبر عملية dunning، entitlement_grant.delivered تستعيدها - لا حاجة لتغيير التعليمات البرمجية.
أنشئ العلامة.feature_id: advanced_reports مع البيانات الوصفية { "tier": "pro", "monthly_report_limit": 100 }.
أرفقها بمنتج اشتراك Pro Plan.
يشترك أحد العملاء. تنشئ Dodo Payments منحة Delivered وتطلق entitlement_grant.created؛ ويمكّن معالج webhook لديك advanced_reports للعميل بحد أقصى قدره 100.
يتحكم تطبيقك في الوصول إلى الميزة. عند تحميل لوحة المعلومات، تحقّق من مجموعة الميزات المخزّنة مؤقتًا (أو استدعِ listEntitlementGrants) واعرض علامة تبويب التقارير فقط عندما تكون advanced_reports موجودة.
يلغي العميل اشتراكه. تلغي Dodo Payments المنحة وتطلق entitlement_grant.revoked؛ ويعطّل معالجك الميزة. وإذا استعاد العميل اشتراكه لاحقًا عبر عملية التحصيل المتأخر، فإن entitlement_grant.delivered يستعيدها — ولا حاجة إلى إجراء تغييرات على التعليمات البرمجية.
استخدم معرفات السمات الثابتة، الsnake_case. تتحقق تطبيقك من هذه السلاسل؛ تغيير الاسم يعد تغييرًا كسرًا على كلا الجانبين.
علم واحد لكل قدرة. فضل advanced_reports + api_access كأذونات اثنين على راية واحدة pro_bundle — تظل المخالفة وخليط الخطط نظيفة.
ادفع الحالة من خلال خدمات الويب، وتحقق من خلال API. تجعل الخدمات المعطاة قاعدة بياناتك محدثة؛ قائمة النقاط تكون مصدر الحقيقة لأعمال التوفيق والأخطاء في التخزين المؤقت.
تعامل مع revoked على أنها فورية. يعني العلم الذي تم إلغاؤه أن العميل لم يعد يدفع مقابل الميزة. اعتمد على الطلب التالي، وليس الجلسة التالية.
ضع الحدود في البيانات الوصفية، وليس في الكود. يؤدي تغيير الحصة بعد ذلك فقط إلى تحرير الإذن - يلتقط العملاء الجدد تلقائيًا بينما تحتفظ المنح الحالية بلقطة الشراء الخاصة بهم.
استخدم معرّفات ميزات ثابتة بنمط snake_case. يتحقق كود تطبيقك من هذه السلاسل؛ وإعادة تسمية إحداها تُعد تغييرًا يؤدي إلى كسر التوافق من كلا الجانبين.
علامة واحدة لكل قدرة. فضّل advanced_reports + api_access كاستحقاقين بدلًا من pro_bundle واحد — إذ يظل الإلغاء ومزيج الخطط منظّمين.
اعتمد على حالة webhooks، وتحقق باستخدام API. تحافظ webhooks على تحديث قاعدة بياناتك؛ وتُعد نقطة نهاية القائمة مصدر الحقيقة لمهام التسوية وحالات فقدان ذاكرة التخزين المؤقت.
تعامل مع Revoked على أنه فوري. تعني العلامة المُلغاة أن العميل لم يعد يدفع مقابل الميزة. طبّق التحكم في الوصول عند الطلب التالي، لا عند الجلسة التالية.
ضع الحدود في البيانات الوصفية، وليس في الكود. لا يتطلب تغيير الحصة بعد ذلك سوى تعديل الاستحقاق — إذ يحصل العملاء الجدد عليها تلقائيًا، بينما تحتفظ المنح الحالية بلقطة المشتريات الخاصة بها.