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

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

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

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

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

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

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

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

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

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

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

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

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

  • معرف الطلب
  • وقت الشراء
  • التوقيع
  • الرمز المميز للشراء
  • تم الإشعار بالاستلام

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

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

إشعار بالاستلام بشأن عملية شراء مسبقة الدفع

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

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

يجب الردّ على الخطط المدفوعة مسبقًا التي تبلغ مدتها أسبوعًا أو أكثر في غضون ثلاثة أيام.

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

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

الاشتراك بالتقسيط هو نوع من الاشتراكات يدفع فيه المستخدمون ثمن الاشتراك بالتقسيط على دفعات متعددة على مدار فترة زمنية بدلاً من دفع رسوم الاشتراك بالكامل مقدّمًا.

اعتبارات إضافية للاشتراكات المدفوعة بالتقسيط:

  • مدى التوفّر في البُلدان: لا تتوفّر ميزة الاشتراكات بالتقسيط إلا في البرازيل وفرنسا وإيطاليا وإسبانيا (يُرجى التحقّق من وحدة تحكّم المطوّر لمعرفة آخر البلدان التي تتوفّر فيها هذه الميزة).
  • تحديد السعر: عند تحديد سعر اشتراك بالتقسيط في Console، يمثّل السعر مبلغ الدفعة الشهرية. ويؤدي ذلك، بالاشتراك مع فترة الالتزام التي تم ضبطها، إلى إنشاء المبلغ الإجمالي للاشتراك في شاشة الشراء.
  • مدة الالتزام: إجمالي مدة الاشتراك الأولي الالتزام، والتي تكون فيها الدفعات الشهرية مطلوبة. على سبيل المثال، إذا كانت مدة الالتزام بالخطة الأساسية هي 15 شهرًا، سيدفع المستخدم 15 دفعة شهرية خلال هذه الفترة.
  • عمليات التجديد: في سياق الاشتراكات المدفوعة بالتقسيط، يشير "التجديد" إلى انتهاء مدة الاشتراك، سواء كانت مدة الاشتراك الأولية أو مدة الاشتراك اللاحقة. بعد الاشتراك الأولي، يتم تجديد الاشتراك لأول مرة عند اكتمال مدة الاشتراك الأولية بالكامل. تحدث عمليات التجديد التالية بعد استيفاء كل فترة التزام لاحقة. يمكن أن تكون أنواع التجديد لاشتراكات الأقساط "تجديد تلقائي شهريًا" أو "تجديد تلقائي للمدة نفسها". بالنسبة إلى "التجديد التلقائي كل شهر"، لا يوجد التزام لاحق، وتتعامَل الخطة مثل اشتراك شهري حيث يشكّل كل رسوم اشتراك شهري تجديدًا.
  • مدة الفوترة: في سياق الاشتراكات المدفوعة بالتقسيط، يشير ذلك إلى الفاصل الزمني المتكرر الذي يتم فيه إجراء الدفعات الفردية، على النحو المحدّد في الخطة الأساسية.
  • سلوك تغيير الخطة مقارنةً بسلوك تغيير السعر: في ما يتعلّق بتغييرات الأسعار والعمليات الإلغاء، يكون الالتزام ثابتًا. وهذا يعني أنّه إذا أراد المستخدم الإلغاء أو أراد المطوّر تغيير السعر، فإنّ التغيير يسري بنهاية مدة الالتزام. بالنسبة إلى تغييرات الخطة، لا يكون الالتزام ثابتًا. وهذا يعني أنّه لا يجب الانتظار حتى نهاية مدّة الالتزام لإجراء تغيير في الخطة، بل سيسري التغيير على الفور أو في تاريخ الدفع التالي استنادًا إلى وضع الاستبدال المحدّد.
  • تغيير خطة الاشتراك نفسها: لا يُسمح بتغيير الخطة من خطة أساسية تتم بالتقسيط إلى خطة أساسية بدون أقساط لمنتج الاشتراك نفسه.
  • الإشعارات في الوقت الفعلي الخاصة بالمطوّرين: يتم إرسال SUBSCRIPTION_CANCELLATION_SCHEDULED إشعار في الوقت الفعلي خاص بالمطوّر فورًا عند إلغاء المستخدم للاشتراك عندما تبقى الدفعات سارية خلال فترة الالتزام. طلب الإلغاء في انتظار المراجعة ولن يصبح ساريًا إلا في نهاية فترة الالتزام. بعد ذلك، في حال عدم استعادة المستخدم لبيانات RTDN، يتم إرسال SUBSCRIPTION_CANCELED وSUBSCRIPTION_EXPIRED في نهاية فترة الالتزام.

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

  • عمليات تحصيل الدفعات الفائتة: إذا تعذّر على المستخدم سداد أي أقساط من اشتراكه، لن تحاول "Google" أو "المطوّر" تحصيل أي دفعات مستحقة أو غير مدفوعة من المستخدم، باستثناء أنّ "Google" قد تتمكّن من إعادة محاولة الدفع بشكل دوري خلال أي فترة سماح أو فترة تعليق حساب سارية وفقًا لممارساتها العادية لإعادة محاولة الدفع. لن تتحمّل Google مسؤولية أي دفعات متبقية مستحقة لدفع أقساط الاشتراك.

  • مدى توفّر مكتبة Play Billing Library: لا يتوفّر الحقل installmentDetails إلا للإصدار 7 من مكتبة Play Billing Library أو الإصدارات الأحدث. بالنسبة إلى الإصدار 5 من "الإصدار التجريبي من Google Play" والإصدارات الأحدث، يتم إرجاع اشتراك الأقساط باستخدام queryProductDetails()، ولكن لن يتضمّن الاشتراك معلومات تفصيلية عن الأقساط، مثل عدد الدفعات المُلتزَم بها في الخطة.

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

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

يمكنك تضمين رابط لصفحة في تطبيقك يؤدي إلى مركز اشتراكات Google Play للاشتراكات التي لم تنته صلاحيتها، ويمكنك تحديدها باستخدام الحقل subscriptionState في مصدر الاشتراك. استنادًا إلى ذلك، هناك عدة طرق يمكنك من خلالها إنشاء رابط لصفحة في تطبيقك تنقل مباشرةً إلى مركز الاشتراكات في "متجر Google 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

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

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

0

CHARGE_PRORATED_PRICE

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

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

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

1

CHARGE_FULL_PRICE

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

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

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

1 (ملاحظة: 0 إذا كان الاشتراك الجديد يتضمّن فترة تجريبية مجانية)

WITHOUT_PRORATION

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

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

0

DEFERRED

لا تتم ترقية الاشتراك أو الرجوع إلى إصدار سابق منه إلا عند تجديد الاشتراك، ولكن يتم إصدار عملية الشراء الجديدة على الفور مع العنصرَين التاليَين:

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

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

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

1

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

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

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

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

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

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

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

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

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

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

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

لفهم آلية عمل كل وضع من أوضاع تقسيم التكلفة، فكِّر في السيناريو التالي:

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

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

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

WITH_TIME_PRORATION

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

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

CHARGE_PRORATED_PRICE

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

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

WITHOUT_PRORATION

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

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

DEFERRED

سيستمر اشتراك ساموايز في المستوى 1 حتى تاريخ انتهاء صلاحيته في 30 نيسان (أبريل). في 1 أيار (مايو)، بدأ اشتراك المستوى 2، وتم تحصيل 36 دولار أمريكي من ساموايز مقابل مستوى اشتراكه الجديد.

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

CHARGE_FULL_PRICE

سينتهي اشتراك ساموايز في المستوى 1 على الفور. يبدأ اشتراكه في المستوى 2 اليوم ويتم تحصيل رسوم بقيمة 36 دولار أمريكي منه. وبما أنّه دفع مقابل شهر كامل ولكنه استخدم نصفه فقط، يتم تطبيق نصف اشتراك شهري (دولار أمريكي واحد) على اشتراكه الجديد. وبما أنّ هذا الاشتراك الجديد يكلف 36 دولار أمريكي في السنة، سيتم إضافة 1/36 من السنة إلى مدة اشتراكه (أي 10 أيام تقريبًا). وبالتالي، سيتم تحصيل الرسوم التالية من ساموي بعد عام و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" أو Purchases.subscriptions:acknowledge من Google Play Developer API.

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

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

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

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

الوقت

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

ReplacementMode.DEFERRED

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

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

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

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

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

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

يتم عرض رمز الشراء الجديد، لذا يجب معالجته في هذه المرحلة مع مراعاة وقت الاستبدال.

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

لا يتم إرسال القيمة SUBSCRIPTION_PURCHASED في علامة التبويب "البيانات الوصفية لتطبيقك" بعد مسار الشراء. لم يتم إبلاغ الخلفية بعملية الشراء الجديدة بعد.

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

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

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

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

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

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

يظهر الآن الرمز المميّز الجديد لعملية الشراء، لذا من المفترض أن تتم معالجته.

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

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

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

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

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

تمت معالجة عملية الشراء الجديدة وتأكيدها عند إرسال الرسالة القصيرة RTDN الخاصة بحالة SUBSCRIPTION_PURCHASED لرمز الشراء الجديد وتسجيله على أنّه "startTime".

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

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

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

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

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

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

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

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

التطبيقات التي لا تستخدم الإصدار 2.0 من "مكتبة الفوترة" أو الإصدارات الأحدث: لا

التطبيقات التي تستخدم الإصدار 2.0 من "مكتبة الفوترة" أو الإصدارات الأحدث: نعم. يمكن للمطوّرين إيقاف هذه الميزة في Console.

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

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

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

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

رصد أي تغيير في حالة الاشتراك

رابط لصفحة في "متجر Play"

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

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

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

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

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

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

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

عند استلام رمز الشراء، احرِص على إكمال عملية الشراء تمامًا كما تفعل مع اشتراك جديد. بالإضافة إلى ذلك، تعرض Google Play Developer APIlinkedPurchaseToken في مورد الاشتراك. احرص على إبطال الرمز المميّز المقدَّم في 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. خلال فترة التأجيل، يكون المستخدم مشتركًا في المحتوى الخاص بك مع إمكانية الوصول الكامل إليه، ولكن لا يتم تحصيل رسوم منه. يتم تعديل تاريخ تجديد الاشتراك ليوافق التاريخ الجديد.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

شريط معلومات سريع يُعلم المستخدم بضرورة حلّ مشكلة الدفع
الشكل 20. شريط معلومات سريع يُعلم المستخدم بضرورة حلّ مشكلة الدفع

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

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

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

لعرض المراسلة داخل التطبيق للمستخدم، استخدِم 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.
                }
            }
        });

معالجة المعاملات في انتظار المراجعة للاشتراكات

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

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

إنّ إضافة رصيد أو الترقية أو الرجوع إلى إصدار سابق من خلال المعاملات المعلّقة يؤدي إلى تغييرات في الحالة لكل من الاشتراك القديم والجديد. عندما يبدأ المستخدم معاملة في انتظار المراجعة متعلقة بإضافة رصيد أو ترقية أو خفض مستوى الاشتراك، يتلقّى تطبيقك Purchase للاشتراك القديم مع عنصر PendingPurchaseUpdate. في الوقت الحالي، ما زال العميل يملك الاشتراك القديم ولم يحصل على الاشتراك الجديد بعد. يؤدي استدعاء getProducts() وgetPurchaseToken() على PendingPurchaseUpdate إلى عرض معرّفات المنتجات ورمز الشراء ل الاشتراك الجديد. عند اكتمال المعاملة، يتلقّى تطبيقك Purchase مع ضبط رمز الشراء من المستوى الأعلى للاشتراك الجديد وPURCHASED. يتم إرسال رسالة SubscriptionNotification من النوع SUBSCRIPTION_PURCHASED إلى برنامج RTDN. في هذه المرحلة فقط، عليك استبدال رمز الشراء القديم برمز الشراء الجديد وتعديل إذن وصول المستخدم إلى المحتوى. إذا انتهت صلاحية المعاملة أو تم إلغاؤها، يتم إرسال رسالة SubscriptionNotification من النوع SUBSCRIPTION_PENDING_PURCHASE_CANCELED إلى برنامج RTDN. وفي مثل هذه الحالات، من المفترض أن يظل بإمكان المستخدم الوصول إلى محتوى الاشتراك القديم.