يمكن أن تمر عمليات شراء الاشتراكات خلال عدة ولايات مختلفة اعتمادًا على عدة عوامل، منها سلوك التجديد التلقائي والدفع ومواقف الرفض وإجراءات إدارة المطورين.
معالجة دورة حياة الاشتراكات التي يتم تجديدها تلقائيًا
عندما تتغير حالة اشتراك أحد المستخدمين، يتلقى خادم الخلفية
رسالة SubscriptionNotification
لتعديل الحالة في الخلفية، يُرجى طلب
purchases.subscriptionsv2.get
واجهة برمجة التطبيقات مع الرمز المميّز للشراء المضمّن في الإشعار توفر نقطة النهاية هذه
آخر حالة اشتراك بالنظر إلى رمز الشراء المميز
مصدرًا أساسيًا لإدارة الاشتراكات
يكون الرمز المميز للشراء صالحًا من الاشتراك في الاشتراك حتى 60 يومًا بعد انتهاء الصلاحية. بعد هذا التاريخ، لن يصبح الرمز المميّز للشراء صالحًا للاستخدام: عن طريق الاتصال بواجهة برمجة تطبيقات Google Play Developer API.
عمليات شراء الاشتراكات الجديدة التي يتم تجديدها تلقائيًا
عندما يشتري مستخدم اشتراكًا، ستظهر رسالة SubscriptionNotification
مع
النوع SUBSCRIPTION_PURCHASED
يتم إرساله إلى عميل RTDN. ما إذا تلقيت
هذا الإشعار أو أنك تسجّل عملية شراء جديدة داخل التطبيق من خلال
PurchasesUpdatedListener
أو جلب المشتريات يدويًا في
طريقة onResume()
التطبيق، يجب معالجة عملية الشراء الجديدة في
الخلفية. لإجراء هذا، اتبع هذه الخطوات:
- الاستعلام عن
purchases.subscriptionsv2.get
نقطة نهاية للحصول على اشتراك المرجع يتضمّن آخر حالة اشتراك - تأكد من أن قيمة
subscriptionState
هوSUBSCRIPTION_STATE_ACTIVE
. - تأكيد عملية الشراء
- امنح المستخدم إذن الوصول إلى المحتوى. إنّ حساب المستخدِم المرتبط
عملية الشراء من خلال
ExternalAccountIdentifiers
من مورد الاشتراك إذا تم ضبط المعرّفات عند الشراء وقت استخدامsetObfuscatedAccountId
أوsetObfuscatedProfileId
تتضمّن مكتبة فوترة Play أيضًا طريقة لتأكيد الاشتراك
acknowledgePurchase()
،
وطريقة للتحقق من حالة الإقرار
isAcknowledged()
ومع ذلك، ننصحك بمعالجة عمليات الشراء في الخلفية للحصول على
أمان أفضل.
يبدو مورد الاشتراك لعمليات الشراء الجديدة مشابهًا لما يلي: مثال:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_PENDING", // need to acknowledge new purchases
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
عمليات تجديد الاشتراك
بالنسبة إلى الاشتراكات غير القابلة للتقسيط والتجديد التلقائي: SUBSCRIPTION_RENEWED
يتم إرسال إشعار عند تجديد الاشتراك. للتقسيط
الاشتراكات، يتم إرسال إشعار SUBSCRIPTION_RENEWED
في كل مرة
يتم تحصيل رسوم الاشتراك في تاريخ الفوترة المحدد. تأكد من أن المستخدم لا يزال
التي يحق لها الاشتراك ثم تحديث حالة الاشتراك
مبلغ expiryTime
المقدَّم في الاشتراك
المصدر الذي تم إرجاعه من Google Play
واجهة برمجة التطبيقات Developer API. يبدو مورد الاشتراك مشابهًا للمثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
]
}
لا تحتاج إلى الإقرار بتجديد الاشتراك.
فترة السماح
في حال حدوث مشاكل في الدفع أثناء تجديد الاشتراك، تُرسِل Google إشعارًا إلى المستخدم ويحاول بشكل دوري تجديد الاشتراك لبعض الوقت قبل بانتهاء صلاحية الاشتراك. يمكن أن تتكون فترة الاسترداد هذه من فترة سماح متبوعة بفترة تعليق الاشتراك. أثناء فترة السماح، على المستخدم يمكنهم الوصول إلى إذن استخدام الاشتراك
تشير رسالة الأشكال البيانية
queryPurchasesAsync()
إرجاع المشتريات التي لا تزال في فترة السماح. إذا كان تطبيقك
وحدها على queryPurchasesAsync
للتحقّق مما إذا كان المستخدم يحق له الحصول على
الاشتراك، فسيتعامل تطبيقك تلقائيًا مع فترات السماح، لأن
تظهر هذه الاشتراكات على أنّها نشِطة في Play Billing Library.
من خلال مزامنة حالة الاشتراك مع الخلفية، يمكنك أن تكون أكثر وعيًا.
من عمليات رفض الدفعات، ويمنحك سياقًا إضافيًا عند محاولة الحد من الخسارة الإجبارية
انسحاب أحد العملاء. الاستماع إلى
SubscriptionNotification
رسالة
من النوع SUBSCRIPTION_IN_GRACE_PERIOD
ليتم إخطار المستخدم عند إدخال
فترة السماح. وعندما يكون المستخدم في فترة السماح، لن يتمكن الاشتراك
المرجع
يحتوي على autoRenewEnabled = true
. يعمل Google Play على توسيع نطاق
expiryTime
حتى انتهاء فترة السماح بسبب الاستحقاق
إلى أن يلغي المستخدم اشتراكه أو تستمر فترة السماح
الحد الأقصى للطول. قيمة الحقل subscriptionState
خلال هذه الفترة هي
SUBSCRIPTION_STATE_IN_GRACE_PERIOD
يبدو مورد الاشتراك مشابهًا
في المثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_IN_GRACE_PERIOD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
يُعلِم Play المستخدمين الذين هم في فترة السماح برفض عملية الدفع. ويطلب منهم حل مشاكل طريقة الدفع في "متجر Play". عندما دخول المستخدم في فترة سماح، فيجب عليك أيضًا تشجيع المستخدم على إصلاح طريقة الدفع في حال كان الإخفاق إجباريًا. هناك طريقة مباشرة للقيام وهي استخدام ميزة المراسلة داخل التطبيق API. في حال استدعاء واجهة برمجة التطبيقات هذه عندما يفتح المستخدم تطبيقك، ستظهر له رسالة Play في شريط إعلام منبثق يخبر المستخدم برفض الدفع. هذه الرسالة تتضمّن أيضًا رابطًا لصفحة في التطبيق ليتمكّن المستخدم من تصحيح طريقة الدفع على Google اللعب.
عندما يصلح المستخدم طريقة الدفع، يتم تجديد الاشتراك مع تاريخ التجديد الأصلي، ويمكنك معالجة التجديد على النحو الموضَّح في عمليات التجديد:
إذا لم يقم المستخدم بإصلاح طريقة الدفع خلال فترة السماح، يجب يدخل الاشتراك في فترة تعليق الاشتراك، ويفقد الاستحقاق.
الوصول إلى فترة السماح واستردادها
يوضح الشكل 2 مخططًا زمنيًا للاشتراك الذي يدخل في فترة سماح ثم يتم استردادها عندما يصلح المستخدم طريقة الدفع. بعد فترة السماح ينتهي، يُفترَض أن يفقد المستخدم مزايا الاشتراك وأن يدخل في فترة تعليق الاشتراك.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/grace-period.png?authuser=9&hl=ar)
من المهم تذكر النقاط التالية:
- خلال فترة السماح، يجب أن يحتفظ المستخدم بإمكانية الوصول إلى مزايا الاشتراك.
- عندما يتم استرداد اشتراك خلال فترة السماح، يُحفَظ تاريخ التجديد لم تتم إعادة ضبطه.
- في حال زيادة فترة السماح - على سبيل المثال، من 7 أيام إلى 14 يومًا - المستخدمون الذين في فترة السماح، يمكنهم الحصول على إمكانية وصول إضافي إلى مزايا الاشتراك.
- في حال تقليل فترة السماح، سيحصل المستخدمون الذين لم يصلوا إلى فترة السماح القديمة بما يكفي فترة السماح الجديدة لتجاوز فترة السماح الجديدة على الفور. على سبيل المثال، إذا قمت بتقليل فترة السماح من 14 يومًا إلى 7 أيام، فالمستخدمون خلال الفترة من 8 إلى 14 من فترة السماح القديمة وإبطال مزايا اشتراكهم على الفور.
- يظل الاشتراك في حالة نشطة ولن تحصل على فترة سماح. فترة ”مراسلة نصية في الوقت الفعلي“ حتى انتهاء فترة السماح الصامتة
فترة السماح الصامتة
يمكنك ضبط فترة سماح لتكون 0 يوم، ولكن سينتظر Play لمدة يوم واحد على الأقل
ضمان الوقت الكافي لمحاولات الدفع. تقدم فترة السماح الصامتة هذه
شبكة أمان لمعالجة عمليات الدفع. خلال هذه الفترة التي تبلغ 24 ساعة
يبقى اشتراكك في
حالة ACTIVE
.
أفضل طريقة للبقاء على اطّلاع دائم على تغييرات حالة الاشتراك هي
الاستماع إلى إشعارات المطوّرين في الوقت الفعلي (RTDN) والتفاعل معها عليك استدعاء
purchases.subscriptionsv2.get()
في وقت RTDN بدلاً من وقت انتهاء الصلاحية للحصول على بيانات أكثر دقة
حالة الاشتراك.
استنادًا إلى حالة الاشتراك بعد فترة السماح الصامتة التي تبلغ مدتها 24 ساعة ستتلقى أحد الإشعارات التالية:
SUBSCRIPTION_ON_HOLD
(في حال تفعيله)SUBSCRIPTION_CANCELED
(في حال الإلغاء)SUBSCRIPTION_EXPIRED
(في حال انتهاء صلاحيته)SUBSCRIPTION_RENEWED
(في حال التجديد بنجاح)
ويمكنك أيضًا استدعاء طريقة subscriptionV2.get()
في أي وقت بعد
فترة سماح صامتة لمدة 24 ساعة للاطّلاع على أحدث حالة للاشتراك.
تعليق الحساب
في حال حدوث مشاكل في الدفع في تجديد الاشتراك بعد أي فترة السماح الفترة، وبدأت فترة تعليق الاشتراك. عندما يدخل الاشتراك فترة تعليق الاشتراك، فيجب حظر الوصول إلى الاشتراك الوصول.
عليك مواصلة معالجة أيّ عمليات إلغاء خلال فترة تعليق الاشتراك. عمليات استعادة اشتراكاتك أو إعادة شرائها حسب الحاجة لأنه يمكن للمستخدم إجراء هذه التغييرات أثناء اشتراك معلّقة.
تُعلمك شبكات RTDN عندما يدخل المستخدم فترة تعليق الاشتراك، حتى تتمكّن من إعلامك في أقرب وقت ممكن عن سبب تعليق وصولهم إلى الاشتراك. ومن الطرق المباشرة لإجراء ذلك استخدام ميزة المراسلة داخل التطبيق API. يتطلب الاتصال بواجهة برمجة التطبيقات هذه عند عندما يفتح المستخدِم التطبيق، سيعرض رسالة للمستخدم في شريط نصي مؤقت لإبلاغه برفض الدفعة. تتضمن هذه الرسالة أيضًا رابط لصفحة في التطبيق يمكن للمستخدم من خلاله تصحيح طريقة الدفع على Google Play.
إذا كان بإمكان المستخدمين الوصول إلى محتوى الاشتراك خارج تطبيقك، قد يتمكّنون من اكتشف أنه فقد إمكانية الوصول إليه على أسطح مختلفة. قد ترغب في إرسال إشعار فوري أو رسالة إلكترونية إلى المستخدم لإعلامه بأنه لم يعُد اشتراكك نشِطًا بسبب رفض الدفعة.
لا يتم إرجاع الاشتراك من خلال
queryPurchasesAsync()
أثناء فترة تعليق الاشتراك، لذلك إذا كان تطبيقك يعتمد على هذه الطريقة لعرض
عمليات الشراء الحالية، فينبغي عليك دعم فترة تعليق الاشتراك بشكل افتراضي.
مع مطوّر في الوقت الفعلي
الإشعارات، ستتلقى
رسالة SubscriptionNotification
من النوع SUBSCRIPTION_ON_HOLD
عند دخول الاشتراك في فترة تعليق الاشتراك اتصل
الـ
purchases.subscriptionsv2.get
من خادم الخلفية الآمن لاسترداد الاشتراك الجديد
المعلومات. أثناء فترة تعليق الاشتراك في الحقل expiryTime
ضمن الاشتراك
المرجع
على طابع زمني من الماضي، والحقل subscriptionState
على
SUBSCRIPTION_STATE_ON_HOLD
:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ON_HOLD",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
لاستعادة إمكانية الوصول إلى البيانات، على المستخدمين تصحيح معلومات طريقة الدفع. يُعلِم Play المستخدمين في تعليق حسابه على رفض الدفعة، كما ننصحك بتشجيعه على حل طريقة الدفع التي اختاروها.
بعد تصحيح المستخدم لطريقة الدفع، يعود الاشتراك إلى وضع نشط.
وينبغي عليك بعد ذلك استعادة إمكانية الدخول إلى المحتوى الذي اشتركت فيه. وفي هذه الحالة،
وأن الرمز المميّز للشراء هو نفسه الذي كان عليه قبل بدء فترة تعليق الاشتراك بسبب
استرداد عملية الشراء نفسها، وتتلقى RTDN
SUBSCRIPTION_RECOVERED
بالنسبة إلى الاشتراكات المستندة إلى الأقساط، قد يتم رفض الدفعات واستردادها في لأي محاولة دفع فردية.
بعد استرداد الاشتراك، تُرجع Play Billing Library الاشتراك مرة أخرى من خلال
طريقة queryPurchasesAsync()
. إذا استخدمت هذه الطريقة لتحديد ما إذا
يحقّ للمستخدم الحصول على اشتراك، فيجب أن يتعامل تطبيقك تلقائيًا
استرداد الاشتراك بعد تجاوز فترة تعليق الاشتراك
الاستماع إلى
رسالة SubscriptionNotification
من النوع SUBSCRIPTION_RECOVERED
ليتم إرسال إشعار عند انتهاء مدة الاشتراك
استرداده ويجب على المستخدم استعادة إمكانية الوصول. في حال طلب اشتراك
بعد تلقّي هذا الإشعار، يتم ضبط الحقل expiryTime
على طابع زمني.
في المستقبل ويتم ضبط الحقل subscriptionState
على
SUBSCRIPTION_STATE_ACTIVE
مرة أخرى:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
...
}
],
}
إذا لم يقم المستخدم بتصحيح طريقة الدفع قبل نهاية فترة تعليق الاشتراك
ستتلقى بدلاً من ذلك RTDN من النوع SUBSCRIPTION_CANCELED
. بالنسبة
إرشادات حول التعامل مع عملية الإلغاء، راجع عمليات الإلغاء. عندما تريد
عن اشتراك تم إلغاؤه بهذه الطريقة،
تم ضبط حقل expiryTime
على طابع زمني سابق:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_past,
...
}
],
}
فور إعلامك بالإلغاء مباشرةً أثناء فترة تعليق الاشتراك،
سيتلقّى أيضًا ”الإشعارات في الوقت الفعلي الخاصة بالمطوّرين“ من النوع SUBSCRIPTION_EXPIRED
لأنّ المستخدم
خارج الاستحقاق المدفوع وتم إيقاف الاشتراك مع الإلغاء.
يمكنك التعامل مع انتهاء الصلاحية هذا بالطريقة المعتادة.
يمكن للمستخدم استعادة إمكانية الوصول من خلال إعادة شراء خطة الاشتراك نفسها أو أي خطة
خطة أخرى تقدّمها من خلال التطبيق خلال فترة تعليق الاشتراك
عملية الشراء الأصلية. وفي هذه الحالة، يتم إصدار رمز مميّز جديد للشراء
يتم عرض القيمة الجديدة كجزء من حدث SUBSCRIPTION_PURCHASED
الذي
يمثل هذا المثيل الجديد.
الوصول إلى فترة تعليق الاشتراك واستردادها
يوضح الشكل 3 مخططًا زمنيًا للاشتراكات التي تدخل في فترة تعليق الاشتراك ثم يتم استردادها عندما يصلح المستخدم طريقة الدفع.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/acct-hold-1.png?authuser=9&hl=ar)
على غرار المثال السابق، يعرض الشكل 4 مخططًا زمنيًا للاشتراك تدخل في فترة سماح أولاً قبل فترة تعليق الاشتراك، ثم يتعافى أثناء الانتظار.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/acct-hold-2.png?authuser=9&hl=ar)
من المهم تذكر النقاط التالية:
- قبل دخول الاشتراك في فترة تعليق الاشتراك، يقدّم Google Play مبالغ إضافية محاولة تحصيل الرسوم من طريقة الدفع لمدة تصل إلى 48 ساعة يحتفظ المستخدم مزايا الاشتراك خلال هذه الفترة. وبعد انقضاء فترة إعادة المحاولة هذه، يدخل الاشتراك في فترة تعليق الاشتراك، ومن المفترض أن يفقد المستخدم الوصول إلى مزايا الاشتراك.
- يدخل الاشتراك في فترة تعليق الاشتراك مباشرةً عندما استئنافه من حالة توقف مؤقتًا مع عدم نجاح طريقة الدفع.
- عندما يسترد الاشتراك فترة تعليقه، تتم إعادة ضبط تاريخ التجديد.
فترات انتهاء الصلاحية
بعد انتهاء صلاحية الاشتراك، من المفترض أن يفقد المستخدم إمكانية الوصول إلى الاشتراك. حاسمة
تم إرسال رسالة واحدة (SubscriptionNotification
) من النوع SUBSCRIPTION_EXPIRED
في هذه الحالة. عند تلقّي هذا الإشعار، يمكنك طلب المساعدة من مطوِّر برامج Google Play.
واجهة برمجة التطبيقات للحصول على أحدث اشتراكات
المرجع.
بعد التأكّد من أنّ قيمة subscriptionState
هي SUBSCRIPTION_STATE_EXPIRED
،
أزِل الإذن وسجِّل حالة الشراء على أنّها غير صالحة في
الخلفية. يبدو مورد الاشتراك مشابهًا للمثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time_in_past,
...
}
],
}
عمليات إلغاء الاشتراكات
يمكن للمستخدم إلغاء اشتراك طوعًا من مركز اشتراكات Play.
أو سيتم إلغاء اشتراكهم تلقائيًا في حال عدم استرداد الاشتراك بعد
قيد تعليق الاشتراك. يمكن للمطوّرين أيضًا تشغيل
إمكانية الإلغاء مع
purchases.subscriptions.cancel
عند إلغاء اشتراك، يحتفظ المستخدم بإمكانية الوصول إلى المحتوى حتى
نهاية دورة الفوترة الحالية. عند انتهاء دورة الفوترة، من المفترض أن يكون بإمكانك الوصول إلى الحساب
إبطاله.
يؤدي إلغاء اشتراك غير مستند إلى تقسيط إلى ظهور
إشعار واحد (SUBSCRIPTION_CANCELED
) فعندما
تلقيت هذا الإشعار، تجدر الإشارة إلى أن اشتراك
المرجع
التي يتم عرضها من خلال Google Play Developer API تحتوي على الحقل subscriptionState
على SUBSCRIPTION_STATE_CANCELED
، ويحتوي الحقل expiryTime
على
التاريخ الذي ينبغي أن يفقد فيه المستخدم إمكانية الوصول إلى الاشتراك. إذا كان هذا التاريخ في
في الماضي، فيجب أن يفقد المستخدم إذن الوصول إليه على الفور. يمكن أن يحدث هذا،
إذا ألغى أحد المستخدمين اشتراكًا أثناء استخدام الحساب
تعليق بسبب رفض الدفعة.
يبدو مورد الاشتراك لعملية الشراء الملغاة مشابهًا لما يلي: مثال:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_CANCELED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
],
}
بالنسبة إلى اشتراكات الأقساط، يجب إدخال SUBSCRIPTION_CANCELLATION_SCHEDULED
يتم إرسال إشعار عند إلغاء اشتراك المستخدم في حال بقيت الدفعات
عن مدة الاشتراك عملية الإلغاء في انتظار المراجعة وستدخل حيز التنفيذ في
نهاية مدة الاشتراك الحالية عند تلقّي هذا الإشعار، سيتم
في مورد الاشتراك الذي تم إرجاعه من واجهة برمجة تطبيقات Google Play Developer API
تم ضبط الحقل SubscriptionState على SUBSCRIPTION_STATE_ACTIVE
لأنّ
لا يزال اشتراك الأقساط نشطًا حتى انتهاء مدة الاشتراك.
ومع ذلك، هناك عنصر فارغ في انتظار الإلغاء.
يتم إرسال إشعار SUBSCRIPTION_CANCELED
متبوعًا
SUBSCRIPTION_EXPIRED
في نهاية مدة الاشتراك.
مرجع الاشتراك الخاص بعملية شراء الاشتراك بالتقسيط الذي عملية الإلغاء في انتظار المراجعة مشابهة للمثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_plan01",
"expiryTime": expiration_time,
"autoRenewingPlan": {
"autoRenewEnabled": true,
"recurringPrice": {
"currencyCode": "USD",
"units": "1",
"nanos": 990000000
},
"installmentDetails": {
"initialCommittedPaymentsCount": 6,
"remainingCommittedPaymentsCount": 5,
"pendingCancellation": {}
...
}
}
}
],
}
يمكنك الاطّلاع على الحقل canceledStateContext
في مورد الاشتراكات من أجل
التعرّف على سبب إلغاء الاشتراك (على سبيل المثال، ما إذا كان الاشتراك
المستخدم أو النظام أو أنت). إذا كان الاشتراك
تم إلغاؤها من قِبل المستخدم، يمكنك الاطّلاع على الحقل userInitiatedCancellation
التعرّف على سبب إلغاء المستخدم للاشتراك. يمكن أن يساعد هذا في إبلاغ التواصل
والاستراتيجيات.
في حال إلغاء اشتراك بدون انتهاء صلاحيته بعد،
لا يزال عاد من
queryPurchasesAsync()
قد ترغب في عرض رسالة في تطبيقك تخبر المستخدم بأن
تم إلغاء الاشتراك ومنحهم تاريخ انتهاء الصلاحية.
عمليات الإبطال
يمكن إبطال الاشتراك لأسباب مختلفة، بما فيها الخلفية.
إلغاء الاشتراك باستخدام
purchases.subscriptionsv2.revoke
أو عند استرداد مبلغ عملية الشراء في هذه الحالة، أبطل توجيه المستخدم
بشكل فوري. رسالة SubscriptionNotification
من النوع
ويتم إرسال SUBSCRIPTION_REVOKED
عند حدوث ذلك. عندما تتلقى هذه الرسالة
الإشعار، سيتم إرسال اشتراك
المرجع
التي يتم عرضها من خلال Google Play Developer API تحتوي على الحقل subscriptionState
مضبوطة على SUBSCRIPTION_STATE_EXPIRED
يبدو مورد الاشتراك لعملية شراء تم إبطالها مشابهًا لما يلي: مثال:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_EXPIRED",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": expiration_time,
...
}
]
}
الاشتراكات المؤجلة
هناك مجموعة متنوعة من الأسباب التي قد تدفعك إلى توسيع نطاق
الوصول. على سبيل المثال، قد ترغب في منح المستخدمين وصولاً مجانيًا إلى
مثل تقديم أسبوع مجاني لشراء فيلم أو تقديم
الوصول إلى العملاء كإيماءة حسنة. يمكنك استخدام صفحة
purchases.subscriptions.defer
من Play Developer API لتقديم تاريخ الفوترة التالي
تجديد الاشتراك تلقائيًا. عند إجراء ذلك، سيتم تنفيذ الإجراء على SubscriptionNotification
يتم إرسال رسالة من النوع SUBSCRIPTION_DEFERRED
. خلال فترة التأجيل،
يكون المستخدم مشتركًا في المحتوى الخاص بك مع إمكانية الوصول الكامل ولكن لا يتم تحصيل رسوم منه. تشير رسالة الأشكال البيانية
يتم تعديل تاريخ تجديد الاشتراك ليوافق التاريخ الجديد.
بالنسبة إلى خطط الدفع المُسبق، يمكنك استخدام تأجيل الفوترة لواجهة برمجة التطبيقات لتأجيل انتهاء الصلاحية. الوقت.
يبدو مورد الاشتراك للاشتراك المؤجل مشابهًا المثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": timestamp_in_future,
...
}
],
}
الاشتراكات المتوقفة مؤقتًا
يمكنك تقليل الإيقاف التطوعي للاستخدام عن طريق تمكين المستخدمين من إيقاف اشتراكهم مؤقتًا. عند تفعيل ميزة الإيقاف المؤقت، يمكن للمستخدمين اختيار إيقاف اشتراكهم مؤقتًا لفترة زمنية تتراوح بين أسبوع وثلاثة أشهر، حسب فترة متكررة.
تكرار الاشتراك | أسبوعيًا | شهريًا | ثلاثة أشهر | ستة أشهر | السنوية |
---|---|---|---|---|---|
مدد الإيقاف المؤقت المتاحة* | أسبوع واحد أسبوعان 3 أسابيع 4 أسابيع |
شهر واحد شهران 3 أشهر |
شهر واحد شهران 3 أشهر |
شهر واحد شهران 3 أشهر |
لا ينطبق |
لا يتم إيقاف الاشتراك مؤقتًا إلا بعد انتهاء المدة الحالية للفوترة. أثناء إيقاف الاشتراك مؤقتًا، لا يمكن للمستخدم الوصول إلى الاشتراك، ولا يدفعون سعر التجديد. في نهاية الإيقاف المؤقت يتم استئناف الاشتراك وستحاول Google تجديده. وفي حال تم تفعيل استئناف الاشتراك، سيصبح نشطًا مرة أخرى. إذا كانت استئنافه بسبب مشكلة في الدفع، يدخل المستخدم في حالة تعليق الحساب كما هو موضح في الشكلين 5 و6:
![](https://developer.android.com/static/images/google/play/billing/lifecycle/pause-1.png?authuser=9&hl=ar)
![](https://developer.android.com/static/images/google/play/billing/lifecycle/pause-2.png?authuser=9&hl=ar)
ويمكن للمستخدم أيضًا اختيار استئناف الاشتراك يدويًا في أي وقت أثناء لفترة الإيقاف المؤقت، كما هو موضح في الشكل 6. عندما يستأنف المستخدم العمل يدويًا، يتم إصدار تغييرات التاريخ إلى تاريخ الاستئناف اليدوي.
عند إيقاف اشتراك المستخدم مؤقتًا، لا يتم عرض واجهة برمجة التطبيقات Play Billing Library
الاشتراك من خلال
queryPurchasesAsync()
. في حال استئناف الاشتراك، استخدِم طريقة queryPurchasesAsync()
وإعادته مرة أخرى.
الاستماع إلى ”إشعارات الوقت الفعلي الخاصة بالمطوّرين (RTDN)“ لمعرفة متى يوقف المستخدم اشتراكه مؤقتًا هذه تتيح لك الإشعارات أيضًا إبلاغ المستخدمين في تطبيقك بأنهم إيقاف اشتراكهم مؤقتًا ولا يمكنهم الوصول إليه. يجب عليك أيضًا تقديم للمستخدم لاستئناف اشتراكه يدويًا في أي وقت باستخدام رابط لصفحة في التطبيق إلى Google Play.
رسالة SubscriptionNotification
من النوع SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED
عندما يبدأ المستخدم
الإيقاف المؤقت لاشتراكهم. في هذا الوقت، يجب على المستخدم الاحتفاظ بإمكانية الوصول إلى
اشتراكهم حتى تاريخ التجديد التالي، ويشمل ذلك
المرجع
يحتوي على autoRenewEnabled = true
. قيمة الحقل subscriptionState
يبلغ SUBSCRIPTION_STATE_ACTIVE
في هذه المرحلة.
يتم إرسال رسالة SubscriptionNotification
من النوع SUBSCRIPTION_PAUSED
عند
الإيقاف المؤقت. عندما يحدث هذا، من المفترض أن يفقد المستخدم إمكانية الوصول إلى
اشتراكك، ويحتوي مورد الاشتراك على autoRenewEnabled = true
وتم ضبط الحقل subscriptionState
على SUBSCRIPTION_STATE_PAUSED
. يمكنك
يمكنك معرفة الموعد المتوقَّع لتجديد الاشتراك من خلال التحقّق من
PausedStateContext
الخاص بك.
يتم إرسال رسالة SubscriptionNotification
من النوع SUBSCRIPTION_RENEWED
إذا
أن يتم استئناف الاشتراك تلقائيًا إما في نهاية فترة الإيقاف المؤقت
أو إذا اختار المستخدم استئناف الاشتراك يدويًا يجب معالجة هذا الأمر
كما هو موضح في عمليات التجديد.
يتم إرسال رسالة SubscriptionNotification
من النوع SUBSCRIPTION_ON_HOLD
إذا
تعذّر الدفع أثناء محاولة استئناف الاشتراك بعد الإيقاف المؤقت.
ويجب التعامل مع هذا الإجراء على النحو الموضّح في مقالة فترة تعليق الاشتراك.
إعادة الاشتراك
بالنسبة إلى الخطط الأساسية للاشتراكات التي يتم تجديدها تلقائيًا، قد يعرض "متجر Google Play" زر إعادة الاشتراك يتيح هذا الزر للمستخدمين استعادة إمكانية الوصول. إلى اشتراك وقد لا يظهر لأسباب مختلفة، على سبيل المثال: عندما انتهت صلاحية اشتراك منذ وقت طويل.
![](https://developer.android.com/static/images/google/play/billing/lifecycle/restoration.png?authuser=9&hl=ar)
على الرغم من أنّ الزر يحمل اسم إعادة الاشتراك دائمًا، تعتمد وظائفه على وفقًا لحالة الاشتراك
على الرغم من إلغاء الاشتراك ولكن لم تنتهِ صلاحيته بعد، يظل المستخدم المشتركين وتلقّي مزايا الاشتراك إذا نقر المستخدم على "إعادة الاشتراك"، يتم التراجع عن الإلغاء بشكلٍ فعلي مع استمرار تجديد الاشتراك. ويُعرف هذا الإجراء باسم الاستعادة في مستندات المطوّرين على Play وواجهات برمجة التطبيقات.
بعد انتهاء صلاحية الاشتراك الذي يتم تجديده تلقائيًا، يمكنك السماح للمستخدمين بالشراء. نفس الخطة الأساسية للاشتراك. يُعرف هذا الإجراء باسم إعادة الاشتراك في مستندات مطوّري برامج Play وواجهات برمجة التطبيقات يمكنك ضبط هذا الخيار. لكل خطة أساسية في Play Console أو باستخدام واجهة برمجة التطبيقات.
استعادة البيانات قبل انتهاء الصلاحية
إذا كان تطبيقك يعتمد فقط على
queryPurchasesAsync()
لتحديد ما إذا كان المستخدم يحق له الحصول على اشتراك، سيثبت تطبيق
من المفترض أن تعالج عمليات الاستعادة تلقائيًا نظرًا لأن queryPurchasesAsync()
إرجاع عمليات الشراء المُلغاة قبل تواريخ انتهاء صلاحيتها. حاسمة
سيستمر تجديد الاشتراك الذي تمت استعادته كما لو لم يتم إلغاؤه.
إذا كان التطبيق يزامن حالة الاشتراك مع الخلفية، يجب أن يستمع المستخدم إلى البيانات.
لـ SubscriptionNotification
رسالة من النوع SUBSCRIPTION_RESTARTED
. بعد تلقي RTDN هذا،
يمكن لتطبيقك الاستجابة إلى الإشعار، وتسجيل أنّ الاشتراك أصبح الآن
الضبط على تجديد رسائل الاستعادة وإيقاف عرضها في تطبيقك. تشير رسالة الأشكال البيانية
يبدو مورد الاشتراك مشابهًا للمثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date
...
}
],
}
إعادة الاشتراك بعد انتهاء الصلاحية
في حال إعداد خطة أساسية تتجدّد تلقائيًا باستخدام Google Play Console أو واجهة برمجة التطبيقات للسماح بإعادة الاشتراك، يمكن للمستخدمين إعادة شراء اشتراك منتهي الصلاحية من خلال "متجر Google Play".
هذه عمليات شراء جديدة. يصدر Google Play رمزًا مميزًا جديدًا للشراء،
الخلفية تتلقّى RTDN من النوع SUBSCRIPTION_PURCHASED
. حالة الشراء
لهذا النوع من عمليات الشراء خارج التطبيق لا تشمل linkedPurchaseToken
المرتبطة بعملية الشراء الأصلية في هذه الحالة، نظرًا لأن الأصل
انتهاء صلاحية اشتراكك بالكامل. هذه هي عمليات الشراء الجديدة التي يجب على الخلفية الحصول عليها
والإقرار بالموافقة مثل أي عملية شراء أخرى.
عمليات الترقية والرجوع إلى إصدار سابق وإعادة الاشتراك
عندما يقوم المستخدم بالترقية أو الرجوع إلى إصدار سابق أو الاشتراك بعد الإلغاء من تطبيقك قبل انتهاء صلاحية الاشتراك، يتم إلغاء صلاحية الاشتراك وإنشاء اشتراك جديد يتضمن رمز شراء مميز جديد.
بالإضافة إلى ذلك، إنّ اشتراك
المرجع
التي تعرضها واجهة برمجة التطبيقات Google Play Developer API تحتوي على linkedPurchaseToken
الذي يشير إلى عملية الشراء القديمة التي قام المستخدم بالترقية منها، أو الرجوع إلى إصدار سابق،
أو أعادوا الاشتراك يمكنك استخدام رمز الشراء المميز في هذا الحقل للبحث عن الرمز القديم
الاشتراك وتحديد حساب المستخدم الحالي لتتمكن من ربط
عملية الشراء الجديدة باستخدام الحساب نفسه.
قبل توفير خيارات الترقية أو الاشتراك في خطة أقلّ كلفة أو إعادة الاشتراك للمستخدم في تطبيقك، يجب الإقرار بالاشتراك الحالي. عند تغيير الخطة أو إعادة الاشتراك إذا كان الاشتراك الحالي لا يزال في انتظار الإقرار.
إذا اشترى المستخدم الترقية أو الرجوع إلى إصدار سابق أو إعادة الاشتراك بنجاح هذه عملية شراء جديدة يجب الإقرار بها. الطريقة الموصى بها لتنفيذ ذلك، يمكنك استخدام Google Play Developer API. يبدو مورد الاشتراك مشابهًا للمثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
...
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"linkedPurchaseToken": old_purchase_token,
...
"lineItems": [
{
"productId": "sub_variant_plan01",
"expiryTime": next_renewal_date,
"autoRenewingPlan": {
"autoRenewEnabled": true
}
}
],
}
تغييرات السعر
الاطّلاع على دليل أفضل الممارسات المتعلّقة بتغيير السعر مزيد من المعلومات حول تغيير أسعار الاشتراكات التي يتم تجديدها تلقائيًا وإعلام المستخدمين عندما يكون ذلك مناسبًا.
عندما تفعّل هذه التغييرات على الأسعار للمشتركين الحاليين، يجب: تلقّي RTDN في حال اتّخذ المستخدم إجراءً لتأكيد السعر الجديد أو رفضه.
التعامل مع تأكيد المستخدم لتغيير السعر
عندما يقبل المستخدِم زيادة سعر اشتراكك، ستتلقّى
رسالة SubscriptionNotification
من النوع SUBSCRIPTION_PRICE_CHANGED_CONFIRMED
. بسعر لا يُطبَّق على المستخدمين
تخفيضًا، أو عند تجديد الزيادة في سعر الاشتراك، ستتلقى
رسالة واحدة (SubscriptionNotification
) من النوع SUBSCRIPTION_RENEWED
. التعامل مع هذه المشكلة
إشعار مثل أي تجديد آخر.
التعامل مع الحالات التي لا يتم فيها قبول الزيادة في السعر التي تتطلّب موافقة
إذا لم يقبل المستخدم الزيادة في السعر التي تتطلب موافقة المستخدم قبل أن يحتاج إلى التجديد
مقابل سعر أعلى، فسيتم إلغاء اشتراكهم تلقائيًا وتحصل على
رسالة SubscriptionNotification
من النوع SUBSCRIPTION_CANCELED
. التعامل مع هذا الحدث على النحو الموضَّح في
عمليات الإلغاء:
يمكن للمستخدمين أيضًا إلغاء اشتراكاتهم بسبب زيادة في السعر لا تتطلّب موافقة. باتباع الآلية نفسها.
التعامل مع دورة حياة خطط الدفع المُسبق
كما هو الحال مع الاشتراكات التي يتم تجديدها تلقائيًا، يجب الإقرار بخطط الدفع المُسبَق بعد كل عملية شراء جديدة. في حالة خطط الدفع المسبق، يجب عليك معالجة كل من عملية الشراء الأولية وأي عمليات إضافة رصيد، لأن المستخدم يتعين عليه الانتقال خلال مسار الشراء في كل مرة.
نظرًا لاحتمالية تقصير مدة خطة الدفع المُسبَق، من المهم والإقرار بعملية الشراء في أقرب وقت ممكن. خطط الدفع المُسبق التي تبلغ مدتها يجب الإقرار بأسبوع واحد أو أكثر في غضون 3 أيام. خطط الدفع المُسبق التي تتضمّن يجب الإقرار بمدة أقل من أسبوع واحد خلال نصف الخطة المدة. على سبيل المثال، نمنح المطوّرين مهلة يوم ونصف للإقرار عند شراء لخطة دفع مُسبَق لمدة ثلاثة أيام.
رسالة SubscriptionNotification
ذات النوع SUBSCRIPTION_PURCHASED
إلى عميل RTDN:
يتم شراء الاشتراك في خطة الدفع المُسبق، بما في ذلك كل عملية إضافة رصيد. عليك استدعاء
purchases.subscriptionsv2.get
للتحقّق من أحدث حالة اشتراك في خطة الدفع المُسبَق.
يتم إصدار رمز شراء مميّز جديد لعمليات الشراء التي تتم إضافة رصيد إليها، وستتلقّى
رمز الشراء السابق في الحقل linkedPurchaseToken
كجزء من الرمز الجديد
حالة شراء الاشتراك. الرمز المميّز للشراء صالح من الاشتراك
الاشتراك حتى 60 يومًا من انتهاء الصلاحية. وبعد هذا التاريخ، سيصبح رمز الشراء
لم تعد صالحة للاستخدام لطلب واجهة برمجة التطبيقات Google Play Developer API.
يبدو مورد الاشتراك لعملية شراء خطة دفع مُسبَق مشابهًا المثال التالي:
{
"kind": "androidpublisher#subscriptionPurchaseV2",
"startTime": "2022-04-22T18:39:58.270Z",
"regionCode": "US",
"subscriptionState": "SUBSCRIPTION_STATE_ACTIVE",
"latestOrderId": "GPA.3333-4137-0319-36762",
"acknowledgementState": "ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED",
"lineItems": [
{
"productId": "prepaid_plan01",
"expiryTime": expiry_date,
"prepaidPlan": {
"allowExtendAfterTime": timestamp_after_which_topups_are_allowed
}
}
]
}
يمكنك معرفة وقت انتهاء الإذن بالوصول في الحقل expiryTime
. إضافة رصيد
تؤدي عمليات الشراء إلى زيادة وقت الوصول إلى الموقع الإلكتروني من خلال تجميعه. هذا يعني أنه إذا
يضيف المستخدِم رصيدًا قبل انتهاء إذن الوصول الأصلي، وتتم إضافة الوقت الجديد
بالإضافة إلى تاريخ انتهاء الصلاحية السابق.
قد ترغب في عرض رسالة في تطبيقك تخبر المستخدم بأن
يمكن تمديد الاشتراكات المدفوعة مسبقًا من خلال إضافة رصيد. لمعرفة متى يكون المستخدم
إضافة رصيد، يُرجى التحقّق من الحقل allowExtendAfterTime
في حقل الاشتراك
المصدر.
لا يتم تجديد خطط الدفع المُسبق تلقائيًا، لذا لا يمكن إلغاؤها. إذا أراد أحد المستخدمين إلغاء خطة دفع مُسبق، قد يسمح لها ببلوغ تاريخ انتهاء صلاحيتها.