لمحة عن الاشتراكات

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

إذا لم تضبط المنتجات المتوفّرة عند الاشتراك لتطبيقك، يمكنك الاطّلاع على إنشاء المنتجات وضبطها.

نظرة عامة على الاشتراكات

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

يمكن أن تكون لديك اشتراكات متعددة في التطبيق نفسه، إما لتمثيل مجموعات مختلفة من المزايا، أو فئات مختلفة لمجموعة واحدة من المزايا ("الفضي" و "الذهبي" على سبيل المثال).

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

للحصول على نظرة عامة تفصيلية حول المنتجات المتوفّرة عند الاشتراك والخطط الأساسية والعروض الترويجية، يمكنك الاطّلاع على المستندات الواردة في مركز مساعدة Play Console.

دمج خطط الدفع المُسبق

لا يتم تجديد خطط الدفع المُسبق تلقائيًا عند انتهاء صلاحيتها. لتمديد استحقاق الاشتراك بدون انقطاع، على المستخدم إضافة خطة مُسبَقة الدفع للاشتراك نفسه.

بالنسبة إلى عمليات الإضافة، أطلق تدفق الفوترة كما تفعل مع عملية الشراء الأصلية. وليس عليك الإشارة إلى أنّ عملية الشراء هي إضافة رصيد.

تستخدم عمليات إضافة الرصيد لخطة الدفع المُسبَق دائمًا وضع الاستبدال "CHARGE_FULL_PRICE"، ولن تحتاج إلى ضبط هذا الوضع صراحةً. يتم تحصيل رسوم من المستخدم على الفور مقابل مدة زمنية كاملة للفوترة، ويتم تمديد استحقاقه إلى المدة المحدَّدة في عملية إضافة الرصيد.

بعد إضافة رصيد، يتم تعديل الحقول التالية في عنصر نتيجة Purchase لتعكس آخر عملية شراء تمت إضافتها إلى الرصيد:

  • معرف الطلب
  • وقت الشراء
  • التوقيع
  • الرمز المميز للشراء
  • مواضيع تمت الموافقة عليها

تحتوي حقول Purchase التالية دائمًا على البيانات نفسها الواردة في عملية الشراء الأصلية:

  • اسم الحزمة
  • حالة الشراء
  • المنتجات
  • تجديد تلقائي

إقرار الشراء المدفوع مسبقًا

كما هو الحال مع الاشتراكات التي يتم تجديدها تلقائيًا، عليك الإقرار بخطط الدفع المُسبَق بعد الشراء. يجب الإقرار بكل من عملية الشراء الأولية وأية إضافات. لمزيد من المعلومات، يمكنك الاطّلاع على معالجة عمليات الشراء.

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

يجب الإقرار بخطط الدفع المُسبَق التي تبلغ مدتها أسبوعًا واحدًا أو أكثر خلال ثلاثة أيام.

يجب الإقرار بخطط الدفع المُسبَق التي تكون مدتها أقل من أسبوع واحد خلال نصف مدة الخطة. على سبيل المثال، لدى المطورين 1.5 يوم للإقرار بخطة الدفع المسبق لمدة ثلاثة أيام.

استخدام روابط لصفحات معيّنة في التطبيق للسماح للمستخدمين بإدارة الاشتراك

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

يمكنك تضمين رابط لصفحة معيّنة من تطبيقك يؤدي إلى مركز اشتراكات Google Play للاشتراكات غير المنتهية الصلاحية، والذي يمكنك تحديده باستخدام الحقل subscriptionState في مورد الاشتراكات. بناءً على ذلك، تتوفّر عدة طرق يمكنك من خلالها إنشاء رابط لصفحة معيّنة في مركز الاشتراكات في "متجر Play".

استخدِم عنوان URL التالي لتوجيه المستخدمين إلى الصفحة التي تعرض جميع اشتراكاتهم، كما هو موضَّح في الشكلَين 1 و2:

https://play.google.com/store/account/subscriptions
تعرض شاشة اشتراكات "متجر Play" حالة جميع اشتراكات المستخدم التي تم تحصيل فواتيرها من Google Play.
الشكل 1. تعرض شاشة اشتراكات "متجر Play" حالة جميع اشتراكات المستخدم التي تم تحصيل فواتيرها من Google Play.


انقر على أحد الاشتراكات للاطّلاع على تفاصيل إضافية.
الشكل 2. انقر على أحد الاشتراكات للاطّلاع على تفاصيل إضافية.

قد يكون هذا الرابط لصفحة في التطبيق مفيدًا لمساعدة المستخدم على استعادة اشتراك تم إلغاؤه من مركز اشتراكات "متجر Play".

للربط مباشرةً بصفحة إدارة اشتراك غير منتهي الصلاحية، عليك الإشارة إلى اسم الحزمة وproductId المرتبطين بالاشتراك الذي تم شراؤه. لتحديد productId لاشتراك حالي آليًا، يمكنك طلب البحث في خلفية تطبيقك أو الاتصال بـ BillingClient.queryPurchasesAsync() للحصول على قائمة بالاشتراكات المرتبطة بمستخدم معيّن. ويحتوي كل اشتراك على productId المقابل كجزء من معلومات حالة الاشتراك. يحتوي كل عنصر SubscriptionPurchaseLineItem مرتبط بعملية شراء اشتراك على القيمة productId المرتبطة بالاشتراك الذي اشتراه المستخدم في ذلك العنصر.

استخدِم عنوان URL التالي لتوجيه المستخدمين إلى شاشة محدَّدة لإدارة الاشتراك، مع استبدال "your-sub-product-id" و "your-app-package" باسم productId واسم حزمة التطبيق على التوالي:

https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package

يستطيع المستخدم بعد ذلك إدارة طرق الدفع والحصول على ميزات، بما في ذلك الإلغاء وإعادة الاشتراك والإيقاف المؤقت.

السماح للمستخدمين بترقية اشتراكاتهم أو الاشتراك في خطة أقلّ كلفة أو تغييرها

يمكنك تزويد المشتركين الحاليين بخيارات متعددة لتغيير خطة اشتراكهم لتلبية احتياجاتهم بشكل أفضل:

  • إذا كنت تبيع فئات اشتراك متعددة، مثل الاشتراكات "الأساسية" و"المميّزة"، يمكنك السماح للمستخدمين بتبديل الفئات من خلال شراء خطة أساسية أو عرض مختلف للاشتراك.
  • يمكنك السماح للمستخدمين بتغيير المدة الزمنية الحالية للفوترة، مثل التبديل من خطة شهرية إلى خطة سنوية.
  • يمكنك أيضًا السماح للمستخدمين بالتبديل بين خطط التجديد التلقائي وخطط الدفع المُسبَق.

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

يوضِّح الشكل 3 مثالاً على تطبيق بثلاث خطط مختلفة:

يشمل هذا التطبيق ثلاثة مستويات اشتراك.
الشكل 3. يشمل هذا التطبيق ثلاثة مستويات اشتراك.

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

عندما يقرّر المستخدمون ترقية اشتراكهم أو الاشتراك في خطة أقلّ كلفة أو تغييره، يمكنك تحديد وضع الاستبدال الذي يحدِّد كيفية تطبيق القيمة التناسبية للمدة الزمنية الحالية للفوترة المدفوعة، ووقت حدوث أي تغيير في الاستحقاق.

أوضاع الاستبدال

يسرد الجدول التالي أوضاع الاستبدال المتاحة وأمثلة على الاستخدام.

وضع الاستبدال

الوصف

مثال للاستخدام

WITH_TIME_PRORATION

تتم ترقية الاشتراك أو الاشتراك في خطة أقلّ كلفة على الفور. يتم تعديل أي وقت متبقٍّ استنادًا إلى فرق السعر، وتتم إضافته إلى الاشتراك الجديد من خلال تأجيل تاريخ الفوترة التالي. وهذا هو الخيار التلقائي.

يمكنك الترقية إلى فئة أعلى سعرًا، بدون أي دفعات إضافية فورية.

CHARGE_PRORATED_PRICE

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

ملاحظة: لا يتوفّر هذا الخيار إلا لترقية الاشتراك، حيث يزيد السعر لكل وحدة زمنية.

يمكنك الترقية إلى فئة أعلى سعرًا بدون تغيير تاريخ الفوترة.

CHARGE_FULL_PRICE

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

ملاحظة: إذا كان الاشتراك الجديد يتضمّن فترة تجريبية مجانية أو عرضًا تمهيديًا، يتم تحصيل رسوم من المستخدم بقيمة 0 $أو سعر العرض التمهيدي، أيهما ينطبق، في وقت الترقية أو الاشتراك في خطة أقلّ كلفة.

الترقية من مدة فوترة أقصر إلى مدة أطول

WITHOUT_PRORATION

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

يمكنك الترقية إلى فئة اشتراك أعلى مع الاحتفاظ بأي فترة مجانية متبقية.

DEFERRED

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

الرجوع إلى مستوى أقل تكلفة

لمعرفة المزيد حول التطبيقات المختلفة لترقية المبيعات والاستعادة في عروض الترقية أو الرجوع إلى إصدار سابق، اقرأ دليل العروض الترويجية والعروض الترويجية.

ضبط وضع الاستبدال لإجراء عملية شراء

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

إعادة الاشتراك أو تبديل الخطط ضمن الاشتراك نفسه

يمكنك تحديد وضع بديل تلقائي في Google Play Console. يتيح لك هذا الإعداد اختيار الوقت المناسب لتحصيل الرسوم من المشتركين الحاليين في حال شراء خطة أساسية أو عرض مختلف للاشتراك نفسه، أو في حال إعادة الاشتراك بعد إلغاء الاشتراك. الخيارات المتاحة هي تحصيل الرسوم على الفور، أي ما يعادل CHARGE_FULL_PRICE، وتحصيل الرسوم في تاريخ الفوترة التالي، أي ما يعادل WITHOUT_PRORATION. هذه هي أوضاع الاستبدال الوحيدة المناسبة عند تبديل الخطط الأساسية ضمن الاشتراك نفسه.

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

تبديل الخطط بين الاشتراكات أو إلغاء وضع الاستبدال التلقائي

إذا كان المستخدم يغيّر منتجات الاشتراك، أو شراء اشتراك مختلف، أو إذا كنت تريد إلغاء وضع الاستبدال التلقائي لأي سبب، يمكنك تحديد معدل التقسيم التناسبي في وقت التشغيل كجزء من معلَمات مسار الشراء.

لتوفير SubscriptionUpdateParams بشكل صحيح كجزء من إعدادات مسار الشراء في وقت التشغيل، يجب مراعاة القيود التالية:

  • عند الترقية أو الرجوع إلى إصدار سابق أو الانتقال إلى خطة الاشتراك نفسه إلى خطة مُسبَقة الدفع من إمّا خطة مُسبَقة الدفع أو خطة تجديد تلقائي، يكون وضع التوزيع التناسبي الوحيد المسموح به هو CHARGE_FULL_PRICE. وإذا حددت أي وضع تناسبي آخر، فستفشل عملية الشراء وسيظهر خطأ للمستخدم.
  • عند تبديل الخطط ضمن الاشتراك نفسه إلى خطة تجديد تلقائي من إمّا خطة مُسبَقة الدفع أو خطة تجديد تلقائي، تكون طرق التقسيم التناسبية الصالحة هي CHARGE_FULL_PRICE وWITHOUT_PRORATION. وإذا حددت أي وضع تناسبي آخر، فستفشل عملية الشراء وسيظهر خطأ للمستخدم.

أمثلة وسلوكيات الاستبدال

لفهم كيفية عمل كل وضع من أوضاع التوزيع، ضع في اعتبارك السيناريو التالي:

لدى "ساموايز" اشتراك شهري في المحتوى المتوفر على الإنترنت من تطبيق country Gardener. ولديه اشتراك شهري في النسخة Tier 1 من المحتوى الذي يتوفّر نصّي فقط. يكلفه هذا الاشتراك $2 شهريًا، ويتجدّد في اليوم الأول من الشهر.

في 15 نيسان (أبريل)، اختار Samwise الترقية إلى الإصدار السنوي من اشتراك المستوى 2، الذي يتضمّن تحديثات الفيديوهات وتبلغ تكلفته 36 دولار أمريكي في السنة.

عند ترقية الاشتراك، يختار المطوّر وضع تقسيم بالتناسب. توضح القائمة التالية كيفية تأثير كل وضع من أوضاع التوزيع في اشتراك Samwise:

WITH_TIME_PRORATION

ينتهي اشتراك Samsung في Tier 1 على الفور. بما أنّه دفع مقابل شهر كامل (من 1 إلى 30 نيسان (أبريل)) ولكن تمّت ترقيته في منتصف فترة الاشتراك، ستتم إضافة نصف اشتراك الشهر (1 دولار أمريكي) إلى اشتراكه الجديد. ومع ذلك، ونظرًا لأنّ تكلفة الاشتراك الجديد 36 دولارًا أمريكيًا سنويًا، يتم دفع رصيد بقيمة 1 دولار أمريكي فقط مقابل 10 أيام (16 و25 نيسان (أبريل))، ولذلك في 26 نيسان (أبريل)، تم تحصيل 36 دولارًا أمريكيًا منه مقابل اشتراك جديد و36 دولارًا أخرى في 26 نيسان (أبريل) من كل عام يليه.

ينبغي أن تتصل بالتطبيق PurchasesUpdatedListener فور نجاح عملية الشراء، ويمكنك استرداد عملية الشراء الجديدة كجزء من مكالمة queryPurchasesAsync(). تتلقّى الخلفية على الفور "إشعارًا بشأن SUBSCRIPTION_PURCHASED من المطوِّر في الوقت الفعلي".

CHARGE_PRORATED_PRICE

ويمكن استخدام هذا الوضع لأنّ سعر الاشتراك في المستوى 2 لكل وحدة زمنية (36 دولار أمريكي في السنة = 3 دولار أمريكي في الشهر) أكبر من سعر اشتراك المستوى 1 لكل وحدة زمنية (دولاران أمريكيان في الشهر). ينتهي اشتراك Samsung في Tier 1 على الفور. وبما أنّه دفع مقابل شهر كامل ولكنّه استخدم نصف المدة فقط، ستتم اقتطاع نصف قيمة اشتراك الشهر (1 دولار أمريكي) من اشتراكه الجديد. ولكن بما أنّ تكلفة الاشتراك الجديد تبلغ 36 دولار أمريكي في السنة، تبلغ تكلفة الأيام الـ 15 المتبقية 1.50 دولار أمريكي، لذلك يتم تحصيل فرق 0.50 دولار أمريكي مقابل اشتراكه الجديد. في 1 أيار (مايو)، تم تحصيل مبلغ 36 دولار أمريكي من "ساموايس" مقابل فئة الاشتراك الجديدة، و36 دولار أمريكي أخرى في الأول من أيار (مايو) من كل عام يليه.

يجب أن تستدعي تطبيقك PurchasesUpdatedListener فور نجاح عملية الشراء، ويمكنك استرداد عملية الشراء الجديدة كجزء من مكالمة queryPurchasesAsync(). تتلقّى الخلفية على الفور "إشعارًا بشأن SUBSCRIPTION_PURCHASED من المطوِّر في الوقت الفعلي".

WITHOUT_PRORATION

تمت ترقية اشتراك Samsung في Tier 1 فورًا إلى Tier 2 بدون أيّ رسوم إضافية، وفي 1 أيار (مايو) تم تحصيل 36 دولار أمريكي منه مقابل مستوى الاشتراك الجديد و36 دولار آخر في 1 أيار (مايو) من كل عام.

يجب أن تستدعي تطبيقك PurchasesUpdatedListener فور نجاح عملية الشراء، ويمكنك استرداد عملية الشراء الجديدة كجزء من مكالمة queryPurchasesAsync(). تتلقّى الخلفية على الفور "إشعارًا بشأن SUBSCRIPTION_PURCHASED من المطوِّر في الوقت الفعلي".

DEFERRED

يستمر اشتراك Tier 1 في Samwise إلى أن تنتهي صلاحيته في 30 نيسان (أبريل). في 1 أيار (مايو)، سيتم تفعيل اشتراك Tier 2، وتم تحصيل مبلغ 36 دولار أمريكي من Samwise عن مستوى اشتراكه الجديد.

يجب أن تستدعي تطبيقك PurchasesUpdatedListener فور نجاح عملية الشراء، ويمكنك استرداد عملية الشراء الجديدة كجزء من مكالمة queryPurchasesAsync(). تتلقّى الخلفية على الفور "إشعارًا بشأن SUBSCRIPTION_PURCHASED من المطوِّر في الوقت الفعلي". يجب معالجة عملية الشراء بالطريقة نفسها التي تتم بها معالجة أي عملية شراء جديدة أخرى في تلك المرحلة. وعلى وجه الخصوص، تأكّد من موافقتك على عملية الشراء الجديدة. يُرجى العلم بأنّه تتم تعبئة startTime للاشتراك الجديد في وقت بدء سريان عملية الاستبدال، ويحدث ذلك عند انتهاء صلاحية الاشتراك القديم. بعد ذلك، سيصلك SUBSCRIPTION_RENEWED حقل RTDN لخطة الاشتراك الجديدة. يمكنك الاطّلاع على مزيد من المعلومات عن سلوك ReplacementMode.DEFERRED في معالجة الاستبدال المؤجَّل.

CHARGE_FULL_PRICE

ينتهي اشتراك Samsung في Tier 1 على الفور. سيبدأ اشتراكه في المستوى 2 اليوم ويتم تحصيل 36 دولارًا منه. وبما أنّه دفع مقابل شهر كامل ولكنّه استخدم نصف المدة فقط، ستتم إضافة نصف قيمة اشتراك الشهر (1 دولار أمريكي) إلى اشتراكه الجديد. بما أنّ تكلفة الاشتراك الجديد تبلغ 36 دولار أمريكي في السنة، سيحصل على فترة 36/1 من العام تُضاف إلى فترة اشتراكه (أي 10 أيام تقريبًا). وبالتالي، ستكون الرسوم القادمة في Samwise هي سنة واحدة و10 أيام بدءًا من اليوم مقابل 36 دولارًا أمريكيًا. بعد ذلك، يتم تحصيل 36 دولارًا منه كل سنة بعد ذلك.

عند اختيار وضع التناسب، تأكد من مراجعة اقتراحات الاستبدال لدينا.

تنفيذ تغييرات الاشتراك داخل التطبيق

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

Kotlin

val offerToken = productDetails
        .getSubscriptionOfferDetails(selectedOfferIndex)
        .getOfferToken()

val billingParams = BillingFlowParams.newBuilder().setProductDetailsParamsList(
       listOf(
           BillingFlowParams.ProductDetailsParams.newBuilder()
               .setProductDetails(productDetails)
               .setOfferToken(offerToken)
               .build()
       )
       ).setSubscriptionUpdateParams(
           BillingFlowParams.SubscriptionUpdateParams.newBuilder()
               .setOldPurchaseToken("old_purchase_token")
               .setSubscriptionReplacementMode(
                 BillingFlowParams.ReplacementMode.CHARGE_FULL_PRICE
               )
               .build()
       ).build()

billingClient.launchBillingFlow(
    activity,
    billingParams
   )
// ...

Java

String offerToken = productDetails
    .getSubscriptionOfferDetails(selectedOfferIndex)
    .getOfferToken();

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(
        ImmuableList.of(
            ProductDetailsParams.newBuilder()
                // fetched via queryProductDetailsAsync
                .setProductDetails(productDetails)
                // offerToken can be found in
                // ProductDetails=>SubscriptionOfferDetails
                .setOfferToken(offerToken)
                .build()))
    .setSubscriptionUpdateParams(
        SubscriptionUpdateParams.newBuilder()
            // purchaseToken can be found in Purchase#getPurchaseToken
            .setOldPurchaseToken("old_purchase_token")
            .setSubscriptionReplacementMode(ReplacementMode.CHARGE_FULL_PRICE)
            .build())
    .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);
// ...

اقتراحات الاستبدال

يعرض الجدول التالي سيناريوهات توزيع تناسبي مختلفة إلى جانب ما نوصي به لكل سيناريو:

السيناريو وضع الاستبدال المقترَح النتيجة
الترقية إلى مستوى أعلى سعرًا CHARGE_PRORATED_PRICE يحصل المستخدم على إذن الوصول فورًا مع الاحتفاظ بالمدة الزمنية نفسها للفوترة.
الرجوع إلى فئة أقل تكلفة DEFERRED سبق أن دفع المستخدم مقابل الفئة الأكثر تكلفة، لذلك يحتفظ بإمكانية الوصول إليه حتى تاريخ الفوترة التالي.
الترقية أثناء استخدام فترة تجريبية مجانية والحفاظ على الفترة التجريبية WITHOUT_PRORATION يحتفظ المستخدم بإمكانية الوصول إلى الفترة التجريبية المجانية، ولكن ستتم الترقية إلى مستوى أعلى خلال الفترة المتبقية من الفترة التجريبية.
الترقية أثناء فترة تجريبية مجانية - إنهاء إمكانية الوصول إلى الفترة التجريبية المجانية CHARGE_PRORATED_PRICE يمكن للمستخدم الوصول إلى الفئة الجديدة فورًا، ولكنه لم يعُد لديه فترة تجريبية مجانية.

التعامل مع عمليات شراء تغيير الاشتراك

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

ويماثل السلوك داخل التطبيق أي عملية شراء جديدة. يتلقى تطبيقك نتيجة عملية الشراء الجديدة في PurchasesUpdatedListener، وعملية الشراء الجديدة متاحة في queryPurchasesAsync.

تعرض واجهة برمجة التطبيقات Google Play Developer API linkedPurchaseToken في مورد الاشتراكات عند استبدال عملية شراء بأخرى حالية. احرص على إلغاء صلاحية الرمز المميّز المقدَّم في linkedPurchaseToken لضمان عدم استخدام الرمز المميز القديم للوصول إلى خدماتك. راجِع عمليات الترقية والرجوع إلى إصدار سابق وعمليات إعادة الاشتراك للحصول على معلومات عن التعامل مع عمليات الترقية والرجوع إلى إصدار سابق من عمليات الشراء.

عند استلام الرمز المميّز الجديد للشراء، اتّبِع عملية التحقق نفسها التي تتم من خلال إثبات ملكية رمز مميّز جديد للشراء. تأكَّد من الإقرار بعمليات الشراء هذه من خلال BillingClient.acknowledgePurchase() من Google Play Billing Library أو Purchases.subscriptions:acknowledge من Google Play Developer API.

التعامل مع الاستبدال المؤجَّل

يتيح لك وضع الاستبدال المؤجَّل السماح للمستخدم بالاستفادة من الاستحقاق المتبقي في خطته القديمة قبل البدء في الخطة الجديدة.

عند استخدام ReplacementMode.DEFERRED لعملية شراء جديدة، تعرض queryPurchasesAsync() رمز شراء جديدًا بعد مسار الشراء الذي يظل مرتبطًا بالمنتج القديم حتى يتم تنفيذ عملية الاستبدال المؤجَّلة في تاريخ التجديد التالي، والذي يتم بعده إرجاع المنتج الجديد.

في السابق، كان بإمكانك تحقيق تجربة المستخدم هذه من خلال الإصدار ProrationMode.DEFERRED المتوقّف نهائيًا، ولكن تم إيقاف "ProrationMode.DEFERRED" نهائيًا من خلال الإصدار 6 من "مكتبة الفوترة في Play". انظر الجدول التالي لفهم مواضع اختلاف السلوك:

الوقت

ProrationMode.DEFERRED (متوقف نهائيًا)

ReplacementMode.DEFERRED

مباشرةً بعد نجاح تدفق الشراء (التطبيق)

يتم استدعاء PurchasesUpdatedListener بعد الشراء مع معرفة ما إذا كانت الترقية أو الرجوع إلى إصدار سابق قد تمت بنجاح.

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

ولم يظهر الرمز المميّز الجديد للشراء، لذا لا يمكن معالجته في هذه المرحلة.

يتم استدعاء PurchasesUpdatedListener بعد الشراء مع معرفة ما إذا كانت الترقية أو الرجوع إلى إصدار سابق قد تمت بنجاح.

تعرِض queryPurchasesAsync() عملية الشراء باستخدام الرمز المميّز للشراء الجديد على الفور والاستحقاق الأصلي المرتبط به.

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

مباشرةً بعد نجاح مسار الشراء (الخلفية)

لا يتم إرسال SUBSCRIPTION_PURCHASED RTDN بعد مسار الشراء. لم يتم التعرّف على عملية الشراء الجديدة في الخلفية حتى الآن.

يتم إرسال SUBSCRIPTION_PURCHASED RTDN باستخدام معرّف product_id القديم مباشرةً بعد مسار الشراء للرمز المميّز الجديد للشراء.

يؤدي استدعاء طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز الجديد للشراء إلى عرض عملية شراء تتضمّن وقت startTime يشير إلى وقت الشراء الذي يتضمّن عنصرَين:

  • أحد التطبيقات التي تمثّل الاستحقاق القديم وله قيمة "expiryTime" في المستقبل. لن يتم تجديد الاستحقاق القديم ويحتوي على عنصر DeferredItemReplacement يتضمّن منتج الاستحقاق الجديد. يشير ذلك إلى استبدال الاستحقاق القديم في انتظار المراجعة عند انتهاء صلاحيته.
  • تمثّل هذه السمة الاستحقاق الذي تم شراؤه حديثًا. لم يتم ضبط أي قيمة لـ "expiryTime".

تم إرسال SUBSCRIPTION_EXPIRED لرمز الشراء القديم. عند طلب طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز للشراء القديم، تظهر الرسالة على أنّه منتهي الصلاحية (يتم نقل استحقاق الخطة القديمة إلى عملية الشراء الجديدة خلال الفترة المتبقية).

عند الاستبدال - التجديد الأول بعد مسار الشراء (التطبيق)

تعرِض queryPurchasesAsync() عنصر شراء جديدًا يتضمّن رمز الشراء الجديد وإذن الوصول.

يظهر الآن رمز الشراء الجديد، لذا يجب معالجته.

تعرِض queryPurchasesAsync() عملية الشراء باستخدام الرمز المميّز للشراء الجديد على الفور والاستحقاق الجديد المرتبط به.

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

عند الاستبدال - التجديد الأول بعد تدفق الشراء (الخلفية)

يمكن الآن معالجة عملية الشراء الجديدة والإقرار بها عند إرسال أول SUBSCRIPTION_RENEWED RTDN.

يمكن استخدام linkedPurchaseToken في مورد الاشتراك لتحديد المستخدم الذي يجب تحديثه في خلفية الاشتراك، إن أمكن، باستخدام الاستحقاق الجديد.

تمت معالجة عملية الشراء الجديدة والإقرار بها عند إرسال SUBSCRIPTION_PURCHASED RTDN لرمز الشراء الجديد وتسجيله باسم "startTime".

باستخدام استبدال Mode.DEFERRED، تتبع عمليات التجديد الأولى السلوك العادي لأي عملية تجديد أخرى ولن تحتاج إلى تنفيذ منطق خاص لعمليات الاستبدال عند حدوث هذا الحدث.

عند استدعاء طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز الجديد للشراء، يتم عرض عملية شراء تتضمّن عنصرَين:

  • تمثّل هذه السمة الاستحقاق القديم، مع تحديد "انتهاء الصلاحية" في الماضي بدون قيمة محدّدة للسمة DeferredItemReplacement.
  • تمثّل هذه السمة الاستحقاق الجديد، مع قيمة "expiryTime" في المستقبل، مع تفعيل العلامة auto_renewing_enabled.

يجب استخدام القيم البديلة من الآن فصاعدًا بدلاً من ميزة ProrationMode.DEFERRED التي تم إيقافها نهائيًا، لأنّها تقدّم السلوك نفسه في ما يتعلق بالتغييرات على الأذونات، إلا أنّها توفّر طريقة لإدارة عملية الشراء تكون أكثر اتساقًا مع سلوكيات عمليات الشراء الجديدة الأخرى.

إدارة العملاء

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

بعد أن يلغي المستخدم اشتراكه، يمكنك محاولة استعادته إما في تطبيقك أو من خلال "متجر Play". يصف الجدول التالي سيناريوهات مختلفة للاشتراكات إلى جانب إجراءات استعادة الاشتراكات ومتطلبات التطبيق ذات الصلة.

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

التطبيقات التي لا تتضمّن الإصدار 2.0 من Billing Library أو إصدارًا أحدث: لا

التطبيقات التي تتضمّن الإصدار 2.0 من Billing Library أو إصدارًا أحدث: نعم. ويمكن للمطوِّرين إيقاف هذه الميزة في Play Console.

الحالات التي يتم فيها تحصيل الرسوم من المستخدم

في حال استخدام رمز التخزين التعريفي نفسه: نهاية المدة الزمنية الحالية للفوترة.

في حال استخدام رمز تخزين تعريفي مختلف: يعتمد هذا الخيار على وضع التناسب.

نهاية المدة الزمنية الحالية للفوترة فورًا فورًا
مطلوب التنفيذ توفير واجهة مستخدم لإعادة الاشتراك في تطبيقك

اكتشاف التغيير في حالة الاشتراك

رابط لموضع معيّن في "متجر Play"

توفير واجهة مستخدم لإعادة الاشتراك في تطبيقك التعامل مع عمليات الشراء خارج التطبيق

قبل انتهاء صلاحية الاشتراك - داخل التطبيق

بالنسبة إلى الاشتراكات التي تم إلغاؤها ولكن لم تنتهِ صلاحيتها بعد، يمكنك السماح للمشتركين باستعادة اشتراكاتهم داخل تطبيقك من خلال تطبيق خطوات شراء المنتجات داخل التطبيق نفسها على المشتركين الجُدد. تأكَّد من أنّ واجهة المستخدم تعكس أنّ المستخدم لديه اشتراك حالي على سبيل المثال، قد يكون من الأفضل عرض تاريخ انتهاء الصلاحية الحالي للمستخدم والسعر المتكرّر مع زر إعادة التفعيل.

في معظم الأحيان، ستحتاج إلى تقديم نفس السعر ورمز التخزين التعريفي الذي سبق أن اشتركوا فيه للمستخدم، كما يلي:

  • يمكنك بدء عملية شراء اشتراك جديد باستخدام رمز التخزين التعريفي نفسه.
  • يحلّ الاشتراك الجديد محلّ الاشتراك القديم ويتم تجديده في تاريخ انتهاء الصلاحية نفسه. يتم في الحال وضع علامة على الاشتراك القديم على أنه منتهي الصلاحية.
  • على سبيل المثال، لدى Achilles اشتراك في Example Music App، ومن المفترض أن تنتهي صلاحية الاشتراك في 1 آب (أغسطس). وفي 10 تموز (يوليو)، يعيد الاشتراك الاشتراك لمدة شهر واحد بالسعر نفسه شهريًا. يتم تقسيم الاشتراك الجديد بالتناسب مع الرصيد المتبقي ويسري على الفور ويتم تجديده في 1 آب (أغسطس).

إذا كنت ترغب في تقديم سعر مختلف - على سبيل المثال إصدار تجريبي مجاني جديد أو خصم استعادة الربح - فيمكنك بدلاً من ذلك تقديم رمز تخزين تعريفي مختلف للمستخدم:

  • يمكنك بدء الترقية أو الرجوع إلى إصدار سابق باستخدام رمز التخزين التعريفي المختلف باستخدام وضع الاستبدال WITHOUT_PRORATION.
  • يحلّ الاشتراك الجديد محلّ الاشتراك القديم ويتم تجديده في تاريخ انتهاء الصلاحية نفسه. يتم تحصيل سعر رمز التخزين التعريفي الجديد من المستخدم، بما في ذلك أي أسعار تمهيدية، في تاريخ انتهاء الصلاحية الأصلي. إذا تم إنشاء الاشتراك القديم باستخدام رقم تعريف حساب يتضمّن تشويشًا، يجب تمرير المعرّف نفسه إلى "BillingFlowParams" لإجراء عمليات الترقية والرجوع إلى الإصدارات السابقة.
  • على سبيل المثال، لدى Achilles اشتراك في Example Music App، ومن المفترض أن تنتهي صلاحية الاشتراك في 1 آب (أغسطس). في 10 يوليو، أعاد الاشتراك في اشتراك سنوي بسعر تمهيدي. يصبح الاشتراك الجديد نشطًا على الفور ويتم تحصيل السعر التمهيدي من المستخدم في 1 آب (أغسطس).
  • إذا قررت تضمين فترة تجريبية مجانية أو سعر تمهيدي في رمز التخزين التعريفي للعميل، تأكّد من أنّ المستخدم مؤهل من خلال إزالة العلامة من المربّع السماح بفترة تجريبية مجانية واحدة لكل تطبيق في Google Play Console، مما يحصر إمكانية حصول المستخدم على فترة تجريبية مجانية واحدة لكل تطبيق.

عندما تتلقّى الرمز المميّز للشراء، يمكنك معالجة عملية الشراء تمامًا كما تفعل مع الاشتراك الجديد. بالإضافة إلى ذلك، تعرض واجهة برمجة تطبيقات مطوّر برامج Google Play linkedPurchaseToken في مورد الاشتراك. احرص على إلغاء صلاحية الرمز المميّز المقدَّم في linkedPurchaseToken لضمان عدم استخدام الرمز المميّز القديم للوصول إلى خدماتك.

قبل انتهاء صلاحية الاشتراك - في "متجر Play"

أثناء إلغاء الاشتراك ولكنه لا يزال نشطًا، يمكن للمستخدمين استعادة الاشتراك في مركز اشتراكات Google Play من خلال النقر على إعادة الاشتراك (المعروف سابقًا باسم استعادة). بهذه الطريقة، يحافظ على نفس الاشتراك ورمز الشراء

قسم "الاشتراكات" في تطبيق "متجر Google Play" يعرض
            اشتراكًا تم إلغاؤه مع زر إعادة الاشتراك
الشكل 8. قسم الحساب > الاشتراكات في تطبيق "متجر Google Play" يعرض اشتراكًا تم إلغاؤه مع زر إعادة الاشتراك.

لمزيد من المعلومات حول استعادة الاشتراكات، يمكنك الاطّلاع على عمليات الاسترداد.

بعد انتهاء صلاحية الاشتراك - داخل التطبيق

يمكنك السماح للمشتركين منتهي الصلاحية بإعادة الاشتراك داخل تطبيقك من خلال تطبيق عملية شراء المنتجات داخل التطبيق نفسها على المشتركين الجُدد. لاحظ ما يلي:

  • لتقديم خصم للمستخدمين، يمكنك تقديم معرّف منتج مع سعر خاص لاشتراكك، وهو ما يُعرف أيضًا باسم رمز التخزين التعريفي لإلغاء الاشتراك. يمكنك تقديم العرض في تطبيقك، أو يمكنك إرسال إشعار للمستخدم بشأن العرض خارج التطبيق، في رسالة إلكترونية مثلاً.
  • لبدء عملية استعادة الاشتراك، عليك بدء مسار الشراء في تطبيق Android باستخدام Google Play Billing Library. وهذه هي العملية نفسها المتبعة مع الاشتراك الجديد، ولكن يمكنك تحديد رمز التخزين التعريفي المتاح للمستخدم.
  • إذا قررت تضمين فترة تجريبية مجانية أو سعر تمهيدي في رمز التخزين التعريفي للاستعادة، تأكّد من أنّ المستخدم مؤهَّل عن طريق إزالة العلامة من المربّع السماح بفترة تجريبية مجانية واحدة لكل تطبيق في Google Play Console، مما يحصر إمكانية حصول المستخدم على فترة تجريبية مجانية واحدة لكل تطبيق.
  • إذا أعاد المستخدم الاشتراك في رمز التخزين التعريفي نفسه، لن يكون مؤهلاً للاستفادة من الفترات التجريبية المجانية أو السعر التمهيدي. تأكَّد من أنّ واجهة المستخدم تعكس ذلك.

عندما تتلقّى الرمز المميّز للشراء، يمكنك معالجة عملية الشراء تمامًا كما تفعل مع الاشتراك الجديد. لن تتلقّى linkedPurchaseToken في مورد الاشتراك.

بعد انتهاء صلاحية الاشتراك - في "متجر Play"

في حال التفعيل، يمكن للمستخدمين إعادة الاشتراك في رمز التخزين التعريفي نفسه لمدة تصل إلى عام واحد بعد انتهاء الصلاحية من خلال النقر على إعادة الاشتراك في مركز اشتراكات Google Play. يؤدي هذا الإجراء إلى إنشاء اشتراك جديد ورمز مميّز للشراء.

قسم "الاشتراكات" في تطبيق "متجر Google Play" يعرض
 اشتراكًا تم إلغاؤه ومنتهي الصلاحية مع زرّ "إعادة الاشتراك" و"إزالة"
الشكل 9. قسم الحساب > الاشتراكات في تطبيق "متجر Google Play" يعرض اشتراكًا تم إلغاؤه وانتهت صلاحيته مع زرَّي إعادة الاشتراك وإزالة.

تُعتبر إعادة الاشتراك عملية شراء خارج التطبيق، لذا احرص على اتّباع أفضل الممارسات للتعامل مع عمليات الشراء التي يتم إجراؤها من خارج التطبيق.

ترقية اشتراكك

يمكنك إنشاء رموز ترويجية لمنح مستخدمين محدّدين فترة تجريبية مجانية إضافية لاشتراك حالي. لمزيد من المعلومات، اطّلِع على مقالة الرموز الترويجية.

بالنسبة إلى الفترات التجريبية المجانية، يتحقّق Google Play من أنّ المستخدم لديه طريقة دفع صالحة قبل بدء الفترة التجريبية المجانية. قد يرى بعض المستخدمين عملية التحقق هذه كتعليق أو رسوم في طريقة الدفع لديهم. يكون هذا التعليق أو الرسوم مؤقتة ويتم عكسها أو ردّها لاحقًا.

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

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

الإلغاء أو ردّ الأموال أو الإبطال

يمكنك استخدام واجهة برمجة التطبيقات Google Play Developer API لإلغاء اشتراك أو ردّ الأموال أو إبطاله. تتوفّر هذه الوظيفة أيضًا في Google Play Console.

  • الإلغاء: يمكن للمستخدمين إلغاء اشتراك على Google Play. يمكنك أيضًا توفير خيار يتيح للمستخدمين إلغاء الاشتراك في تطبيقك أو على موقعك الإلكتروني. ويجب أن يعالج تطبيقك عمليات الإلغاء هذه على النحو الموضَّح في صفحة عمليات الإلغاء.
  • ردّ الأموال: عند ردّ الأموال، يمكن للمستخدم مواصلة استخدام الاشتراك. يمكن على سبيل المثال استخدام عمليات ردّ الأموال في حال حدوث خطأ فني يمنع المستخدم من الوصول إلى منتجك، ولكن تم حلّ الخطأ. تجدر الإشارة إلى أنّه عليك استخدام Google Play Console لردّ أموال أكثر من آخر دفعة أو إذا كنت تريد ردّ جزء من الأموال.
  • الإبطال: عند إبطال هذا الخيار، سيفقد المستخدم على الفور إمكانية الوصول إلى الاشتراك. يمكن استخدام ذلك في حالة، على سبيل المثال، إذا كان هناك خطأ فني يمنع المستخدم من الوصول إلى المنتج، ولم يرغب المستخدم في مواصلة استخدام المنتج. ويجب أن يعالج تطبيقك عمليات الإلغاء هذه على النحو الموضَّح في عمليات الإلغاء.

يوضح الجدول التالي الاختلافات بين الإلغاء وردّ الأموال والإبطال.

إيقاف التجديد ردّ الأموال إبطال إذن الوصول
إلغاء نعم لا لا
ردّ الأموال لا نعم لا
إلغاء نعم نعم نعم

تأجيل فوترة أحد المشتركين

يمكنك تحديد تاريخ الفوترة التالي لمشترك يتم تجديده تلقائيًا باستخدام Purchases.subscriptions:defer من Google Play Developer API. أثناء فترة التأجيل، يشترك المستخدم في المحتوى الخاص بك مع إمكانية الوصول الكامل ولكن لا يتم تحصيل رسومه. يتم تعديل تاريخ تجديد الاشتراك ليعكس التاريخ الجديد.

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

تسمح لك الفوترة المؤجلة بإجراء ما يلي:

  • يمكنك منح المستخدمين إمكانية الوصول مجانًا كعرض خاص، مثل تقديم اشتراك مجاني لمدة أسبوع واحد لشراء فيلم.
  • منح العملاء الوصول مجانًا كإيماءة حسنة.

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

على سبيل المثال، لدى دارسي اشتراك شهري في المحتوى المتوفر على الإنترنت لتطبيق صيد الأسماك على الإنترنت. ويتم تحصيل رسومها عادةً 1.25 جنيه إسترليني في اليوم الأول من كل شهر. في آذار (مارس)، شاركت في استطلاع على الإنترنت لناشر التطبيق. يكافئها الناشر ستة أسابيع مجانية من خلال تأجيل الدفعة التالية حتى 15 مايو، أي بعد ستة أسابيع من تاريخ الفوترة المجدولة سابقًا في 1 أبريل. لا يتم تحصيل رسوم مقابل دارسي عن أبريل أو بداية مايو وما زال بإمكانه الوصول إلى المحتوى. في 15 أيار (مايو)، تم تحصيل رسوم الاشتراك العادية التي تبلغ 1.25 جنيه إسترليني في الشهر. وسيكون تاريخ التجديد التالي لها هو 15 حزيران (يونيو).

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

التعامل مع حالات رفض الدفعات

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

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

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

يمكنك تحديد طول فترة السماح لكل خطة أساسية يتم تجديدها تلقائيًا وفترة تعليق الاشتراك في Google Play Console. قد يؤدي تحديد أطوال أقل من القيم التلقائية إلى تقليل عدد الاشتراكات التي تم استردادها بعد رفض الدفعات.

لزيادة احتمالية استرداد الاشتراك أثناء رفض الدفعة، يمكنك إبلاغ المستخدم بمشكلة في الدفع وطلب حلّها.

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

المراسلة داخل التطبيق

إذا فعّلت المراسلة داخل التطبيق من خلال InAppMessageCategoryId.TRANSACTIONAL، سيعرض Google Play للمستخدمين إمكانية المراسلة أثناء فترة السماح وفترة تعليق الاشتراك مرّة واحدة يوميًا، وسيتيح لهم فرصة حلّ مشاكل الدفع بدون مغادرة التطبيق.

Snackbar يخبر المستخدم بإصلاح مشكلة الدفع
الشكل 20. يُعلِم Snackbar المستخدم بحلّ مشكلة الدفع.

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

إذا استردّ المستخدم اشتراكه بنجاح، ستتلقّى رمز الاستجابة SUBSCRIPTION_STATUS_UPDATED بالإضافة إلى رمز مميّز للشراء. يجب عليك بعد ذلك استخدام رمز الشراء المميز هذا لطلب بيانات واجهة برمجة تطبيقات مطوّر برامج Google Play وإعادة تحميل حالة الاشتراك في تطبيقك.

دمج المراسلة داخل التطبيق

لعرض المراسلة داخل التطبيق للمستخدم، استخدِم BillingClient.showInAppMessages().

في ما يلي مثال على تشغيل تدفق المراسلة داخل التطبيق:

Kotlin

val inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build()

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        object : InAppMessageResponseListener() {
            override fun onInAppMessageResponse(inAppMessageResult: InAppMessageResult) {
                if (inAppMessageResult.responseCode == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        })

Java

InAppMessageParams inAppMessageParams = InAppMessageParams.newBuilder()
        .addInAppMessageCategoryToShow(InAppMessageCategoryId.TRANSACTIONAL)
        .build();

billingClient.showInAppMessages(activity,
        inAppMessageParams,
        new InAppMessageResponseListener() {
            @Override
            public void onInAppMessageResponse(InAppMessageResult inAppMessageResult) {
                if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.NO_ACTION_NEEDED) {
                    // The flow has finished and there is no action needed from developers.
                } else if (inAppMessageResult.responseCode
                        == InAppMessageResponseCode.SUBSCRIPTION_STATUS_UPDATED) {
                    // The subscription status changed. For example, a subscription
                    // has been recovered from a suspend state. Developers should
                    // expect the purchase token to be returned with this response
                    // code and use the purchase token with the Google Play
                    // Developer API.
                }
            }
        });