يوضّح هذا الموضوع كيفية التعامل مع أحداث مراحل نشاط الاشتراك، مثل عمليات التجديد وانتهاء الصلاحية. ويوضّح أيضًا ميزات الاشتراك الإضافية، مثل تقديم عروض ترويجية والسماح للمستخدمين بإدارة اشتراكاتهم.
إذا لم تضبط المنتجات المتوفّرة عند الاشتراك لتطبيقك، يمكنك الاطّلاع على إنشاء المنتجات وضبطها.
نظرة عامة على الاشتراكات
يمثّل الاشتراك مجموعة من المزايا التي يمكن للمستخدمين الاستفادة منها خلال فترة زمنية محدّدة. على سبيل المثال، قد يمنح الاشتراك المستخدم صلاحية الوصول إلى خدمة بث موسيقى.
يمكن أن تكون لديك اشتراكات متعددة في التطبيق نفسه، إما لتمثيل مجموعات مختلفة من المزايا، أو فئات مختلفة لمجموعة واحدة من المزايا ("الفضي" و "الذهبي" على سبيل المثال).
من خلال الخطط الأساسية والعروض الترويجية، يمكنك إنشاء إعدادات متعدّدة للمنتج المتوفّر عند الاشتراك نفسه. على سبيل المثال، يمكنك إنشاء عرض تمهيدي للمستخدمين الذين لم يسبق لهم الاشتراك في تطبيقك. وبالمثل، يمكنك إنشاء عرض ترقية للمستخدمين الذين سبق لهم الاشتراك في تطبيقك.
للحصول على نظرة عامة تفصيلية حول المنتجات المتوفّرة عند الاشتراك والخطط الأساسية والعروض الترويجية، يمكنك الاطّلاع على المستندات الواردة في مركز مساعدة Play Console.
دمج خطط الدفع المُسبق
لا يتم تجديد خطط الدفع المُسبق تلقائيًا عند انتهاء صلاحيتها. لتمديد استحقاق الاشتراك بدون انقطاع، على المستخدم إضافة خطة مُسبَقة الدفع للاشتراك نفسه.
بالنسبة إلى عمليات الإضافة، أطلق تدفق الفوترة كما تفعل مع عملية الشراء الأصلية. وليس عليك الإشارة إلى أنّ عملية الشراء هي إضافة رصيد.
تستخدم عمليات إضافة الرصيد لخطة الدفع المُسبَق دائمًا وضع الاستبدال
"CHARGE_FULL_PRICE
"، ولن تحتاج إلى ضبط هذا الوضع صراحةً.
يتم تحصيل رسوم من المستخدم على الفور مقابل مدة زمنية كاملة للفوترة،
ويتم تمديد استحقاقه إلى المدة المحدَّدة في عملية إضافة الرصيد.
بعد إضافة رصيد، يتم تعديل الحقول التالية في عنصر نتيجة Purchase
لتعكس آخر عملية شراء تمت إضافتها إلى الرصيد:
- معرف الطلب
- وقت الشراء
- التوقيع
- الرمز المميز للشراء
- مواضيع تمت الموافقة عليها
تحتوي حقول Purchase
التالية دائمًا على البيانات نفسها الواردة في
عملية الشراء الأصلية:
- اسم الحزمة
- حالة الشراء
- المنتجات
- تجديد تلقائي
إقرار الشراء المدفوع مسبقًا
كما هو الحال مع الاشتراكات التي يتم تجديدها تلقائيًا، عليك الإقرار بخطط الدفع المُسبَق بعد الشراء. يجب الإقرار بكل من عملية الشراء الأولية وأية إضافات. لمزيد من المعلومات، يمكنك الاطّلاع على معالجة عمليات الشراء.
ونظرًا إلى احتمال أن تكون مدة خطط الدفع المُسبق قصيرة، من المهم الإقرار بعملية الشراء في أقرب وقت ممكن.
يجب الإقرار بخطط الدفع المُسبَق التي تبلغ مدتها أسبوعًا واحدًا أو أكثر خلال ثلاثة أيام.
يجب الإقرار بخطط الدفع المُسبَق التي تكون مدتها أقل من أسبوع واحد خلال نصف مدة الخطة. على سبيل المثال، لدى المطورين 1.5 يوم للإقرار بخطة الدفع المسبق لمدة ثلاثة أيام.
دمج اشتراكات الأقساط
إنّ اشتراك تقسيط هو نوع من الاشتراكات يدفع المستخدمون فيها سعر الاشتراك على أقساط متعددة خلال فترة زمنية معيّنة، بدلاً من دفع رسوم الاشتراك بالكامل مقدّمًا.
اعتبارات إضافية لاشتراكات الأقساط:
- البلدان التي تتوفّر فيها ميزة الاشتراكات بالأقساط: لا تتوفّر ميزة الاشتراكات بالأقساط إلا في البرازيل وفرنسا وإيطاليا وإسبانيا (يمكنك الاطّلاع على مدى توفّر الميزة في Play Console).
- تحديد السعر: عند تحديد سعر اشتراك تقسيط على Console، يمثّل السعر مبلغ الدفعة الشهرية. يؤدي هذا، بالإضافة إلى مدة الاشتراك التي يتم ضبطها، إلى إنشاء المبلغ الإجمالي للاشتراك في شاشة الشراء.
- مدة الاشتراك: إجمالي مدة الاشتراك الأوّلي التي يجب خلالها تسديد دفعات شهرية. على سبيل المثال، إذا كانت الخطة الأساسية تتضمّن فترة اشتراك مدتها 15 شهرًا، سيسدّد المستخدم 15 دفعة شهرية خلال هذه الفترة.
- عمليات التجديد: في سياق اشتراكات الأقساط، يشير "التجديد" إلى انتهاء مدة الاشتراك، سواء كانت فترة الاشتراك الأولية أو فترة الاشتراك اللاحقة. بعد الاشتراك الأوّلي، يتم إجراء التجديد الأول عند اكتمال فترة الاشتراك الأوّلية بأكملها. وتحدث عمليات التجديد اللاحقة بعد استيفاء كل فترة اشتراك لاحقة. يمكن أن تكون أنواع التجديد لاشتراكات الأقساط "تجديد الاشتراك تلقائيًا كل شهر" أو "تجديد تلقائي للمدة نفسها". بالنسبة إلى "التجديد التلقائي شهريًا"، ليس هناك التزام لاحق، وتعمل الخطة كاشتراك شهري حيث تشكّل كل رسوم اشتراك شهرية تجديدًا.
- مدة الفوترة: في سياق اشتراكات الأقساط، تشير هذه القيمة إلى الفترة الزمنية المتكرّرة التي يتم خلالها تسديد دفعات فردية، على النحو المحدّد في الخطة الأساسية.
- تغيير الخطة مقابل سلوكيات تغيير الأسعار: إنّ الالتزام ثابت في ما يتعلق بتغييرات الأسعار وإلغاؤها. وهذا يعني أنّه إذا أراد المستخدم إلغاء الاشتراك أو أراد المطوّر تغيير السعر، سيتم تطبيق التغيير في نهاية مدة الاشتراك. بالنسبة لتغييرات الخطة، لا يكون الالتزام ثابتًا. يعني ذلك أنّ تغيير الخطة لن يكون عليك الانتظار حتى نهاية فترة الاشتراك، بل سيتم تطبيقه على الفور أو في تاريخ الدفع التالي استنادًا إلى وضع الاستبدال المحدّد.
- تغيير خطة الاشتراك نفسه: لا يُسمح بتغيير الخطة من خطة أساسية بالأقساط إلى خطة أساسية بغير الأقساط للمنتج نفسه المتاح عند الاشتراك.
إشعارات في الوقت الفعلي الخاصة بالمطوّرين (RTDNs):
SUBSCRIPTION_CANCELLATION_SCHEDULED
يتم إرسال إشعار RTDN مباشرةً عند إجراء عملية الإلغاء من قِبل المستخدم عندما تظل الدفعات خلال مدة الاشتراك. إنّ عملية الإلغاء في انتظار المراجعة ولن يتم تطبيقها إلا في نهاية فترة الاشتراك. بعد ذلك، في حال عدم استعادته من قِبل المستخدم، يتم إرسالSUBSCRIPTION_CANCELED
وSUBSCRIPTION_EXPIRED
RTDN في نهاية مدة الاشتراك.عائدات / تحقيق الأرباح: يتم تسديد عائدات المطوّرين عندما يسدّد المستخدمون دفعاتهم الشهرية، مع مراعاة البنود نفسها المتَّبعة في جميع الاشتراكات الأخرى. لا يتم الدفع للمطوّرين مقدمًا عند اشتراك المستخدم في اشتراك الأقساط.
تحصيلات الدفعات الفائتة: إذا تعذّر على المستخدم سداد أي دفعات اشتراك بالتقسيط، لن تحاول Google أو مطوّر البرامج تحصيل أي من هذه الدفعات الفائتة أو المستحقة من المستخدم، باستثناء أنه يجوز لشركة Google إعادة محاولة الدفع بشكل دوري خلال أي فترة السماح أو فترة تعليق الحساب السارية وفقًا للممارسات العادية لإعادة محاولة الدفع. لن تتحمّل Google مسؤولية أي من دفعات الأقساط غير المدفوعة لدى المطوّر.
مدى توفّر Play Billing Library: لا يتوفّر الحقل
installmentDetails
إلا للإصدار PBL 7 أو الإصدارات الأحدث. بالنسبة إلى الإصدار PBL 5 والإصدارات الأحدث، يتم إرجاع اشتراك الأقساط باستخدامqueryProductDetails()
، ولكن لن يتضمّن الاشتراك معلومات الأقساط التفصيلية مثل عدد الدفعات الملتزمة في الخطة.
استخدام روابط لصفحات معيّنة في التطبيق للسماح للمستخدمين بإدارة الاشتراك
يجب أن يتضمّن تطبيقك رابطًا على شاشة الإعدادات أو الإعدادات المفضّلة يسمح للمستخدمين بإدارة اشتراكاتهم، ويمكنك دمج هذا الرابط في مظهر التطبيق ومظهره الطبيعي.
يمكنك تضمين رابط لصفحة معيّنة من تطبيقك يؤدي إلى مركز اشتراكات Google Play
للاشتراكات غير المنتهية الصلاحية، والذي يمكنك تحديده باستخدام
الحقل subscriptionState
في مورد الاشتراكات.
بناءً على ذلك، تتوفّر عدة طرق يمكنك من خلالها إنشاء رابط لصفحة معيّنة في مركز الاشتراكات في "متجر Play".
رابط إلى مركز الاشتراكات
استخدِم عنوان URL التالي لتوجيه المستخدمين إلى الصفحة التي تعرض جميع اشتراكاتهم، كما هو موضَّح في الشكلَين 1 و2:
https://play.google.com/store/account/subscriptions
![تعرض شاشة اشتراكات "متجر Play" حالة جميع اشتراكات المستخدم التي تم تحصيل فواتيرها من Google Play.](https://developer.android.google.cn/static/images/google/play/billing/sub_center_general.png?authuser=5&hl=ar)
![انقر على أحد الاشتراكات للاطّلاع على تفاصيل إضافية.](https://developer.android.google.cn/static/images/google/play/billing/sub_management_mock_general.png?authuser=5&hl=ar)
قد يكون هذا الرابط لصفحة في التطبيق مفيدًا لمساعدة المستخدم على استعادة اشتراك تم إلغاؤه من مركز اشتراكات "متجر 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 مثالاً على تطبيق بثلاث خطط مختلفة:
![يشمل هذا التطبيق ثلاثة مستويات اشتراك.](https://developer.android.google.cn/static/images/google/play/billing/plan_change_inapp.png?authuser=5&hl=ar)
يمكن أن يعرض تطبيقك شاشة مشابهة للشكل 3، ما يمنح المستخدمين خيارات لتغيير اشتراكهم. في جميع الحالات، يجب أن تكون خطة الاشتراك الحالية واضحة للمستخدمين والخيارات المتاحة لتغييرها.
عندما يقرّر المستخدمون ترقية اشتراكهم أو الاشتراك في خطة أقلّ كلفة أو تغييره، يمكنك تحديد وضع الاستبدال الذي يحدِّد كيفية تطبيق القيمة التناسبية للمدة الزمنية الحالية للفوترة المدفوعة، ووقت حدوث أي تغيير في الاستحقاق.
أوضاع الاستبدال
يسرد الجدول التالي أوضاع الاستبدال المتاحة وأمثلة على الاستخدام، وعدد الدفعات التي تُعتبر مدفوعة.
وضع الاستبدال |
الوصف |
مثال للاستخدام |
الدفعات المُلتزمة المسجّلة على أنّها مدفوعة (لاستبدال اشتراك بالتقسيط) |
|
تتم ترقية الاشتراك أو الاشتراك في خطة أقلّ كلفة على الفور. يتم تعديل أي وقت متبقٍّ استنادًا إلى فرق السعر، وتتم إضافته إلى الاشتراك الجديد من خلال تأجيل تاريخ الفوترة التالي. وهذا هو الخيار التلقائي. |
يمكنك الترقية إلى فئة أعلى سعرًا، بدون أي دفعات إضافية فورية. |
0 |
|
تتم ترقية الاشتراك على الفور، وتظل دورة الفوترة كما هي. ويتم بعد ذلك تحصيل فرق السعر عن الفترة المتبقية من المستخدم. ملاحظة: لا يتوفّر هذا الخيار إلا لترقية الاشتراك، حيث يزيد السعر لكل وحدة زمنية. |
يمكنك الترقية إلى فئة أعلى سعرًا بدون تغيير تاريخ الفوترة. |
1 |
|
تتم ترقية الاشتراك أو الاشتراك في خطة أقلّ كلفة على الفور، ويتم على الفور تحصيل سعر الاشتراك الجديد من المستخدم على الفور. يتم ترحيل القيمة المتبقية من الاشتراك السابق إما لاشتراك المحتوى نفسه أو توزيعه بالتناسب على مدة الاستخدام عند التبديل إلى استحقاق مختلف. ملاحظة: إذا كان الاشتراك الجديد يتضمّن فترة تجريبية مجانية أو عرضًا تمهيديًا، يتم تحصيل رسوم من المستخدم بقيمة 0 $أو سعر العرض التمهيدي، أيهما ينطبق، في وقت الترقية أو الاشتراك في خطة أقلّ كلفة. |
الترقية من مدة فوترة أقصر إلى مدة أطول |
1 (ملاحظة: 0 إذا كان الاشتراك الجديد يتضمّن فترة تجريبية مجانية.) |
|
تتم ترقية الاشتراك أو الاشتراك في خطة أقلّ كلفة على الفور، ويتم تحصيل السعر الجديد عند تجديد الاشتراك. تظل دورة الفوترة كما هي. |
يمكنك الترقية إلى فئة اشتراك أعلى مع الاحتفاظ بأي فترة مجانية متبقية. |
0 |
|
لا تتم ترقية الاشتراك أو الرجوع إلى إصدار سابق منه إلا عند تجديد الاشتراك، ولكن يتم إصدار عملية الشراء الجديدة على الفور بتاريخ بدء في المستقبل للاستحقاق الجديد، لذلك يمكن لمطوِّر البرامج السماح للمستخدمين بإجراء تغييرات إضافية إذا أرادوا ذلك. على سبيل المثال، يمكنهم العودة إلى الخطة الأصلية أو بدء تغيير جديد للخطّة المؤجلة. ملاحظة: بالنسبة إلى اشتراكات الأقساط، يتم تغيير الخطة في بداية تاريخ الدفع التالي. |
الرجوع إلى مستوى أقل تكلفة |
1 |
لمعرفة المزيد حول التطبيقات المختلفة لترقية المبيعات والاستعادة في عروض الترقية أو الرجوع إلى إصدار سابق، اقرأ دليل العروض الترويجية والعروض الترويجية.
ضبط وضع الاستبدال لإجراء عملية شراء
يمكنك استخدام أوضاع استبدال مختلفة لأنواع مختلفة من عمليات نقل الاشتراك، وذلك وفقًا لإعداداتك المفضّلة ومنطق النشاط التجاري. يوضّح هذا القسم كيفية ضبط وضع بديل لتغيير في أحد الاشتراكات والقيود التي تنطبق.
إعادة الاشتراك أو تبديل الخطط ضمن الاشتراك نفسه
يمكنك تحديد وضع بديل تلقائي في 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 |
مباشرةً بعد نجاح تدفق الشراء (التطبيق) |
يتم استدعاء يستمر الحصول على الخطة القديمة حتى تاريخ التجديد التالي. للتأكّد من أنّ التطبيق يمنح الإذن الصحيح، يتم عرض عنصر شراء في ولم يظهر الرمز المميّز الجديد للشراء، لذا لا يمكن معالجته في هذه المرحلة. |
يتم استدعاء تعرِض ويظهر الرمز المميّز الجديد للشراء، لذلك يجب معالجته في هذه المرحلة مع الأخذ في الاعتبار وقت إجراء عملية الاستبدال. |
مباشرةً بعد نجاح مسار الشراء (الخلفية) |
لا يتم إرسال SUBSCRIPTION_PURCHASED RTDN بعد مسار الشراء. لم يتم التعرّف على عملية الشراء الجديدة في الخلفية حتى الآن. |
يتم إرسال SUBSCRIPTION_PURCHASED RTDN باستخدام معرّف product_id القديم مباشرةً بعد مسار الشراء للرمز المميّز الجديد للشراء. يؤدي استدعاء طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز الجديد للشراء إلى عرض عملية شراء تتضمّن وقت startTime يشير إلى وقت الشراء الذي يتضمّن عنصرَين:
تم إرسال SUBSCRIPTION_EXPIRED لرمز الشراء القديم. عند طلب طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز للشراء القديم، تظهر الرسالة على أنّه منتهي الصلاحية (يتم نقل استحقاق الخطة القديمة إلى عملية الشراء الجديدة خلال الفترة المتبقية). |
عند الاستبدال - التجديد الأول بعد مسار الشراء (التطبيق) |
تعرِض يظهر الآن رمز الشراء الجديد، لذا يجب معالجته. |
تعرِض يجب أن تكون عملية الشراء الجديدة قد سبق وعالجت بنجاح عملية الشراء، لذلك يجب ألا يتخذ التطبيق أي إجراء خاص إلا التأكّد من منح الأذونات الصحيحة. |
عند الاستبدال - التجديد الأول بعد تدفق الشراء (الخلفية) |
يمكن الآن معالجة عملية الشراء الجديدة والإقرار بها عند إرسال أول SUBSCRIPTION_RENEWED RTDN. يمكن استخدام |
تمت معالجة عملية الشراء الجديدة والإقرار بها عند إرسال SUBSCRIPTION_PURCHASED RTDN لرمز الشراء الجديد وتسجيله باسم "startTime". باستخدام استبدال Mode.DEFERRED، تتبع عمليات التجديد الأولى السلوك العادي لأي عملية تجديد أخرى ولن تحتاج إلى تنفيذ منطق خاص لعمليات الاستبدال عند حدوث هذا الحدث. عند استدعاء طريقة purchases.subscriptionsv2.get باستخدام الرمز المميّز الجديد للشراء، يتم عرض عملية شراء تتضمّن عنصرَين:
|
يجب استخدام القيم البديلة من الآن فصاعدًا بدلاً من ميزة 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" يعرض
اشتراكًا تم إلغاؤه مع زر إعادة الاشتراك](https://developer.android.google.cn/static/images/google/play/billing/resubscribe.jpg?authuser=5&hl=ar)
لمزيد من المعلومات حول استعادة الاشتراكات، يمكنك الاطّلاع على عمليات الاسترداد.
بعد انتهاء صلاحية الاشتراك - داخل التطبيق
يمكنك السماح للمشتركين منتهي الصلاحية بإعادة الاشتراك داخل تطبيقك من خلال تطبيق عملية شراء المنتجات داخل التطبيق نفسها على المشتركين الجُدد. لاحظ ما يلي:
- لتقديم خصم للمستخدمين، يمكنك تقديم معرّف منتج مع سعر خاص لاشتراكك، وهو ما يُعرف أيضًا باسم رمز التخزين التعريفي لإلغاء الاشتراك. يمكنك تقديم العرض في تطبيقك، أو يمكنك إرسال إشعار للمستخدم بشأن العرض خارج التطبيق، في رسالة إلكترونية مثلاً.
- لبدء عملية استعادة الاشتراك، عليك بدء مسار الشراء في تطبيق Android باستخدام Google Play Billing Library. وهذه هي العملية نفسها المتبعة مع الاشتراك الجديد، ولكن يمكنك تحديد رمز التخزين التعريفي المتاح للمستخدم.
- إذا قررت تضمين فترة تجريبية مجانية أو سعر تمهيدي في رمز التخزين التعريفي للاستعادة، تأكّد من أنّ المستخدم مؤهَّل عن طريق إزالة العلامة من المربّع السماح بفترة تجريبية مجانية واحدة لكل تطبيق في Google Play Console، مما يحصر إمكانية حصول المستخدم على فترة تجريبية مجانية واحدة لكل تطبيق.
- إذا أعاد المستخدم الاشتراك في رمز التخزين التعريفي نفسه، لن يكون مؤهلاً للاستفادة من الفترات التجريبية المجانية أو السعر التمهيدي. تأكَّد من أنّ واجهة المستخدم تعكس ذلك.
عندما تتلقّى الرمز المميّز للشراء، يمكنك معالجة عملية الشراء تمامًا كما تفعل مع الاشتراك الجديد. لن تتلقّى linkedPurchaseToken
في مورد الاشتراك.
بعد انتهاء صلاحية الاشتراك - في "متجر Play"
في حال التفعيل، يمكن للمستخدمين إعادة الاشتراك في رمز التخزين التعريفي نفسه لمدة تصل إلى عام واحد بعد انتهاء الصلاحية من خلال النقر على إعادة الاشتراك في مركز اشتراكات Google Play. يؤدي هذا الإجراء إلى إنشاء اشتراك جديد ورمز مميّز للشراء.
![قسم "الاشتراكات" في تطبيق "متجر Google Play" يعرض
اشتراكًا تم إلغاؤه ومنتهي الصلاحية مع زرّ "إعادة الاشتراك" و"إزالة"](https://developer.android.google.cn/static/images/google/play/billing/resubscribe-remove.jpg?authuser=5&hl=ar)
تُعتبر إعادة الاشتراك عملية شراء خارج التطبيق، لذا احرص على اتّباع أفضل الممارسات للتعامل مع عمليات الشراء التي يتم إجراؤها من خارج التطبيق.
ترقية اشتراكك
يمكنك إنشاء رموز ترويجية لمنح مستخدمين محدّدين فترة تجريبية مجانية إضافية لاشتراك حالي. لمزيد من المعلومات، اطّلِع على مقالة الرموز الترويجية.
بالنسبة إلى الفترات التجريبية المجانية، يتحقّق 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 يخبر المستخدم بإصلاح مشكلة الدفع](https://developer.android.google.cn/static/images/google/play/billing/subscriptions-in-app-messaging-snackbar.png?authuser=5&hl=ar)
ننصحك بطلب واجهة برمجة التطبيقات هذه كلما فتح المستخدم التطبيق لتحديد ما إذا كان يجب عرض الرسالة أم لا.
إذا استردّ المستخدم اشتراكه بنجاح، ستتلقّى رمز الاستجابة
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. } } });
معالجة معاملات الاشتراك التي في انتظار المراجعة
المعاملات في انتظار المراجعة يمكن أن تحدث في عملية الشراء الأولية أو إضافة رصيد أو الترقية أو
الرجوع إلى إصدار سابق. تبدأ عملية شراء الاشتراك بحالة
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. وفي مثل هذه الحالات، سيظل بإمكان المستخدم الوصول إلى محتوى الاشتراك القديم.