نظام الفوترة في Google Play هو خدمة تتيح لك بيع المنتجات الرقمية والمحتوى الرقمي في تطبيق Android. في الإصدار الصادر في أيار (مايو) 2022، غيّرنا طريقة تحديد منتجات الاشتراك، ويؤثر ذلك في طريقة بيعها داخل التطبيق وإدارتها في الخلفية. إذا كنت بصدد دمج نظام الفوترة في Google Play للمرة الأولى، يمكنك بدء عملية الدمج من خلال قراءة مقالة الاستعداد.
إذا كنت تبيع اشتراكات باستخدام "الفوترة في Google Play" قبل أيار (مايو) 2022، من المهم معرفة كيفية استخدام الميزات الجديدة مع الحفاظ على اشتراكاتك الحالية.
أول ما يجب معرفته هو أنّ جميع الاشتراكات والتطبيقات وعمليات الدمج في الخلفية الحالية تعمل كما كانت قبل إصدار مايو (أيار) 2022. لست بحاجة إلى إجراء أي تغييرات فورية، ويمكنك استخدام هذه الميزات الجديدة بمرور الوقت. يستمر دعم كل إصدار رئيسي من مكتبة الفوترة في Google Play لمدة عامَين بعد إصداره. ستظل عمليات الدمج الحالية باستخدام Google Play Developer API تعمل كالمعتاد.
في ما يلي نظرة عامة على التعديلات التي أجريناها في أيار (مايو) 2022:
- تتيح لك Google Play Console الجديدة إنشاء الاشتراكات والخطط الأساسية والعروض وإدارتها. ويشمل ذلك الاشتراكات الجديدة والمُنقلة.
- تتضمّن واجهة برمجة التطبيقات Play Developer API تعديلات تتيح استخدام وظائف واجهة مستخدم Google Play Console الجديدة بتنسيق واجهة برمجة التطبيقات. يُرجى العِلم أنّه يتوفّر إصدار جديد من واجهة برمجة التطبيقات Subscription Purchases API. استخدِم واجهة برمجة التطبيقات هذه للتحقّق من حالة الاشتراك وإدارة عمليات شراء الاشتراكات.
- يتيح الإصدار الجديد من Play Billing Library 5 لتطبيقك الاستفادة من جميع ميزات الاشتراك الجديدة. عندما تكون مستعدًا للترقية إلى الإصدار 5، اتّبِع الإرشادات الواردة في دليل نقل البيانات.
إعداد الاشتراكات
إدارة الاشتراكات من خلال Google Play Console
اعتبارًا من أيار (مايو) 2022، ستلاحظ بعض الاختلافات في Google Play Console.
يمكن أن يتضمّن الاشتراك الواحد الآن عدة خطط أساسية و عروض. تظهر الآن رموز التخزين التعريفية للاشتراكات التي تم إنشاؤها سابقًا في Play Console كعناصر الاشتراك والخطة الأساسية والعرض الجديدة هذه. إذا لم يسبق لك الاطّلاع على مقالة التغييرات الأخيرة على الاشتراكات في Play Console، يمكنك الاطّلاع عليها للحصول على أوصاف عن العناصر الجديدة، بما في ذلك وظائفها وطريقة أعدادها. تظهر جميع منتجات الاشتراكات الحالية في Google Play Console بهذا التنسيق الجديد. يتم الآن تمثيل كل رمز تخزين تعريفي باستخدام كائن اشتراك يحتوي على خطة أساسية واحدة وأحد العروض الترويجية المتوافقة مع الأنظمة القديمة، إن وُجد.
بما أنّ عمليات الدمج القديمة كانت تتوقّع أن يتضمّن كل اشتراك عرضًا واحدًا،
ممثّلاً بكائن
SkuDetails
،
يمكن أن يتضمّن كل اشتراك خطة أساسية أو عرضًا ترويجيًا واحدًا متوافقَين مع الإصدارات القديمة.
يتم عرض الخطة الأساسية أو العرض المتوافقَين مع الإصدارات القديمة كجزء من رمز التخزين التعريفي
للتطبيقات التي تستخدم طريقة querySkuDetailsAsync()
المتوقفة نهائيًا.
لمزيد من المعلومات حول ضبط العروض المتوافقة مع الإصدارات القديمة وإدارتها، يُرجى الاطّلاع على مقالة فهم الاشتراكات. وبمجرد أن يستخدم تطبيقك الإصدار queryProductDetailsAsync()
فقط، ولم يعد هناك إصدارات قديمة من تطبيقك لا تزال تُجري عمليات شراء، لن تحتاج بعد ذلك إلى استخدام عرض متوافق مع الإصدارات القديمة.
إدارة الاشتراكات من خلال واجهة برمجة التطبيقات Subscriptions Publishing API
تتضمّن Play Developer API
وظائف جديدة لشراء الاشتراكات. تستمر واجهة برمجة التطبيقات
inappproducts
لإدارة رموز التخزين التعريفية في العمل كالمعتاد، بما في ذلك التعامل مع
المنتجات والاشتراكات التي يتم شراؤها لمرة واحدة، لذا ليس عليك
إجراء أي تغييرات فورية للحفاظ على عملية الدمج.
تجدر الإشارة إلى أنّ Google Play Console لا تستخدم سوى ملفّات تعريف
الاشتراك الجديدة. بعد بدء تعديل اشتراكاتك في Console، لن يعود بإمكانك استخدام واجهة برمجة التطبيقات
inappproducts
للإدارة.
إذا كنت قد استخدمت Publishing API قبل أيار (مايو) 2022، لتجنّب أي مشاكل،
تظهر الآن أي اشتراكات حالية على أنّها للقراءة فقط في
Google Play Console. إذا حاولت إجراء تغييرات، قد يظهر لك تحذير يوضّح
هذا الحدّ. قبل إجراء المزيد من التعديلات على الاشتراكات في Play Console،
يجب تعديل عملية الدمج في الخلفية لاستخدام نقاط نهاية
نشر الاشتراكات الجديدة. تتيح لك نقاط النهاية الجديدة
monetization.subscriptions
،
monetization.subscriptions.baseplans
،
و
monetization.subscriptions.offers
إدارة جميع الخطط الأساسية والعروض المتاحة. يمكنك الاطّلاع على كيفية ربط الحقول المختلفة من عنصر InAppProduct
بالعناصر الجديدة ضمن monetization.subscriptions
في الجدول التالي:
InAppProduct | الاشتراك |
---|---|
packageName |
packageName |
sku |
productId |
status |
basePlans[0].state |
prices |
basePlans[0].regionalConfigs.price |
listings |
البيانات |
defaultPrice |
لا يوجد تكافؤ |
subscriptionPeriod |
basePlans[0].autoRenewingBasePlanType.billingPeriodDuration |
trialPeriod |
basePlans[0].offers[0].phases[0].regionalConfigs[0].free |
gracePeriod |
basePlans[0].autoRenewingBasePlanType.gracePeriodDuration |
subscriptionTaxesAndComplianceSettings |
taxAndComplianceSettings |
لا ينطبق تحديث واجهة برمجة التطبيقات هذا إلّا على واجهة برمجة التطبيقات Publishing API (إدارة رموز التخزين التعريفية).
التغييرات في "مكتبة الفوترة في Play"
لتسهيل نقل البيانات تدريجيًا، تتضمّن "مكتبة الفوترة في Play" كل ال methods والكائنات المتاحة في الإصدارات السابقة.
لا تزال عناصر SkuDetails
ووظائف مثل
querySkuDetailsAsync()
متوفّرة حتى تتمكّن من الترقية لاستخدام
الوظائف الجديدة
بدون الحاجة إلى تعديل رمز الاشتراكات الحالي على الفور أيضًا.
يمكنك أيضًا التحكّم في العروض المتاحة من خلال هذه الطرق
من خلال وضع علامة عليها كعروض متوافقة مع الإصدارات القديمة.
بالإضافة إلى الاحتفاظ بالأساليب القديمة، تتضمّن الآن مكتبة Play Billing Library 5
عنصر ProductDetails
جديدًا وطريقة queryProductDetailsAsync()
مقابلة له من أجل التعامل مع الكيانات والوظائف الجديدة. أصبحت المنتجات الحالية داخل التطبيقات
(عمليات الشراء لمرة واحدة والمنتجات الاستهلاكية) متاحة أيضًا في
ProductDetails
.
بالنسبة إلى الاشتراك، يعرض ProductDetails.getSubscriptionOfferDetails()
قائمة بجميع الخطط الأساسية والعروض التي يكون المستخدم مؤهلاً لشرائها.
وهذا يعني أنّه يمكنك الوصول إلى جميع الخطط الأساسية والعروض المؤهَّلة
للمستخدم، بغض النظر عن التوافق مع الإصدارات القديمة.
getSubscriptionOfferDetails()
يردّ null
مقابل المنتجات التي لا تتطلّب اشتراكًا. بالنسبة إلى عمليات الشراء لمرة واحدة، يمكنك استخدام
getOneTimePurchaseOfferDetails()
.
تتضمّن "مكتبة الفوترة في Play" الإصدار 5 أيضًا طُرقًا جديدة وقديمًا لبدء عملية الشراء. إذا تم ضبط عنصر BillingFlowParams
الذي تم تمريره إلى
BillingClient.launchBillingFlow()
باستخدام عنصر SkuDetails
، يستخرج النظام معلومات عرض البيع
من الخطة الأساسية أو العرض المتوافقَين مع الإصدارات القديمة ويطابقان رمز التخزين التعريفي. إذا تم ضبط عنصر BillingFlowParams
الذي تم تمريره إلى
BillingClient.launchBillingFlow()
باستخدام عناصر
ProductDetailsParams
، والتي تتضمّن ProductDetails
و
String
التي تمثّل رمز العرض المحدد للعرض الذي يتم
شراؤه، يستخدم النظام بعد ذلك هذه المعلومات لتحديد
المنتج الذي يحصل عليه المستخدم.
تعرِض queryPurchasesAsync()
جميع عمليات الشراء التي يملكها
المستخدم. للإشارة إلى نوع المنتج المطلوب، يمكنك تمرير قيمة BillingClient.SkuType
، كما هو الحال في الإصدارات القديمة، أو كائن QueryPurchasesParams
يحتوي على قيمة BillingClient.ProductType
تمثّل عناصر الاشتراك الجديدة.
ننصحك بتحديث تطبيقاتك إلى الإصدار 5 من المكتبة قريبًا حتى تتمكّن من الاستفادة من ميزات الاشتراك الجديدة هذه.
إدارة حالة الاشتراك
يصف هذا القسم التغييرات الأساسية التي تم إجراؤها على مكوّنات الخلفية في عملية دمج نظام الفوترة في Google Play والتي يجب تنفيذها لنقل بياناتك إلى الإصدار 5.
الإشعارات في الوقت الفعلي الخاصة بالمطوّرين
قريبًا، لن يحتوي كائن SubscriptionNotification
على subscriptionId. إذا كنت تعتمد على
هذا الحقل لتحديد منتج الاشتراك، عليك تعديله
للحصول على هذه المعلومات من حالة الاشتراك باستخدام
purchases.subscriptionv2:get
بعد تلقّي الإشعار. سيتضمّن كل عنصر SubscriptionPurchaseLineItem
في مجموعة lineItems التي يتم عرضها كجزء من حالة الشراء
productId المقابل.
Subscriptions Purchases API: الحصول على حالة الاشتراك
في الإصدارات السابقة من واجهة برمجة التطبيقات Subscriptions Purchases API، كان بإمكانك
الاستعلام عن حالة الاشتراك باستخدام
purchases.subscriptions:get
.
لم يتم تغيير هذه النهاية ولا تزال تعمل مع عمليات شراء الاشتراكات المتوافقة مع الإصدارات القديمة. لا تتيح نقطة النهاية هذه أي وظائف
جديدة تم إصدارها في أيار (مايو) 2022.
في الإصدار الجديد من واجهة برمجة التطبيقات Subscriptions Purchases API، استخدِم purchases.subscriptionsv2:get
للحصول على حالة شراء الاشتراك. تتوافق واجهة برمجة التطبيقات هذه مع
الاشتراكات التي تم نقلها والاشتراكات الجديدة (كلاهما من النوعَين الدفع المُسبَق
والتجديد التلقائي) وعمليات الشراء بجميع أنواعها. يمكنك استخدام هذه النهاية
للتحقّق من حالة الاشتراك عند تلقّي الإشعارات. يحتوي العنصر الذي تم إرجاعه، وهو SubscriptionPurchaseV2
، على حقول جديدة، ولكنه لا يزال يتضمّن بيانات قديمة مطلوبة لمواصلة إتاحة الاشتراكات الحالية.
حقول SubscriptionPurchaseV2 للخطط المدفوعة مسبقًا
تمت إضافة حقول جديدة للسماح بالخطط المدفوعة مسبقًا التي يتم تمديدها من قِبل العميل بدلاً من تجديدها تلقائيًا. تنطبق جميع الحقول على الخطط المدفوعة مسبقًا كما تنطبق على الاشتراكات القابلة للتجديد التلقائي، مع الاستثناءات التالية:
- [حقل جديد] lineItems[0].prepaid_plan.allowExtendAfterTime: يشير إلى المدّة التي سيتم فيها السماح للمستخدم بشراء رصيد إضافي لتجديد خطته المدفوعة مسبقًا، حيث يُسمح للمستخدم بشراء رصيد إضافي واحد غير مستخدَم فقط في المرة الواحدة.
- [حقل جديد] SubscriptionState: يحدِّد حالة عنصر الاشتراك.
بالنسبة إلى الخطط المدفوعة مسبقًا، تكون هذه القيمة دائمًا إما
ACTIVE
أوPENDING
أوCANCELED
. - lineItems[0].expiryTime: يكون هذا الحقل متوفّرًا دائمًا للخطط المدفوعة مسبقًا.
- paused_state_context: لا يظهر هذا الحقل مطلقًا، لأنّه لا يمكن إيقاف الخطط المدفوعة مسبقًا مؤقتًا.
- lineItems[0].auto_renewing_plan: لا يظهر للخطط المدفوعة مسبقًا.
- canceled_state_context: لا يظهر هذا الحقل للخطط المدفوعة مسبقًا، لأنّه لا ينطبق إلا على المستخدمين الذين يلغون الاشتراك بشكل نشط.
- lineItems[0].productId: يحلّ هذا الحقل محلّ
subscriptionId
في الإصدارات السابقة.
حقول SubscriptionPurchaseV2 للاشتراكات المتكرّرة
يحتوي purchases.subscriptionv2
على حقول جديدة تقدّم المزيد من التفاصيل
عن عناصر الاشتراك الجديدة. يوضّح الجدول التالي كيفية ربط الحقول من
نقطة نهاية الاشتراك القديمة بالحقول المقابلة لها في
purchases.subscriptionv2
.
SubscriptionPurchase | SubscriptionPurchaseV2 |
---|---|
countryCode |
regionCode |
orderId |
latestOrderId |
(لا يتوفّر حقل مكافئ) | lineItems (قائمة بعناصر
SubscriptionPurchaseLineItem)
التي تمثّل المنتجات التي تم الحصول عليها من خلال عملية الشراء |
(لا يتوفّر حقل مكافئ) | lineItems.offerDetails.basePlanId |
(لا يتوفّر حقل مكافئ) | lineItems.offerDetails.offerId |
(لا يتوفّر حقل مكافئ) | lineItems.offerDetails.offerTags |
startTimeMillis |
startTime |
expiryTimeMillis |
lineItems.expiryTime (لكل اشتراك تم الحصول عليه
في عملية الشراء expiryTime خاص به) |
(لا يتوفّر حقل مكافئ) | subscriptionState (يشير إلى
حالة الاشتراك) |
(لا يتوفّر حقل مكافئ) | pausedStateContext (لا يظهر إلا إذا كانت حالة الاشتراك
هي SUBSCRIPTION_STATE_PAUSED ) |
autoResumeTimeMillis |
pausedStateContext.autoResumeTime |
(لا يتوفّر حقل مكافئ) | canceledStateContext (لا يظهر إلا إذا كانت
حالة الاشتراك هي SUBSCRIPTION_STATE_CANCELED ) |
(لا يتوفّر حقل مكافئ) | testPurchase (لا يظهر إلا في عمليات الشراء التي يجريها المختبِرون المرخَّصون
|
autoRenewing |
lineItems.autoRenewingPlan.autoRenewEnabled |
priceCurrenceCode ،
priceAmountMicros ،
introductoryPriceInfo |
(لا يتوفّر حقل مكافئ) يمكن العثور على هذه المعلومات في الحقل basePlan /offer لكل من الاشتراكات التي تم شراؤها. |
developerPayload | (لا يتوفّر حقل مكافئ) تم إيقاف الحمولة البرمجية للمطوّر نهائيًا |
paymentState | (لا يتوفّر حقل مكافئ) يمكنك استنتاج حالة الدفع من subscriptionState :
|
cancelReason ،
userCancellationTimeMillis ،
cancelSurveyResult |
canceledStateContext |
linkedPurchaseToken |
linkedPurchaseToken (ما مِن تغيير) |
purchaseType |
الفترة الاختبارية: من testPurchase العرض الترويجي: signupPromotion |
priceChange |
lineItems.autoRenewingPlan.priceChangeDetails |
profileName ،
emailAddress ،
givenName ،
familyName ،
profileId |
subscribeWithGoogleInfo |
acknowledgementState |
acknowledgementState (no change) |
promotionType ،
promotionCode |
signupPromotion |
externalAccountId ،
obfuscatedExternalAccountId ،
obfuscatedExteranlProfileId |
externalAccountIdentifiers |
وظائف إدارة الاشتراكات الأخرى
على الرغم من أنّه تمت ترقية purchases.subscriptions:get
إلى purchases.subscriptionsv2:get
،
تبقى بقية دوال إدارة اشتراك المطوّر بدون تغيير في الوقت الحالي في نقطة النهاية purchases.subscriptions
،
وبالتالي يمكنك مواصلة استخدام الدوال التالية:
purchases.subscriptions:acknowledge
،
purchases.subscriptions:cancel
،
purchases.subscriptions:defer
،
purchases.subscriptions:refund
،
و
purchases.subscriptions:revoke
كما كنت تفعل من قبل.
Pricing API
استخدِم نقطة نهاية
monetization.convertRegionPrices
لحساب الأسعار على مستوى منطقة معيّنة كما تفعل من خلال
Play Console. تقبل هذه الطريقة سعرًا واحدًا بأي ملف ملف
عملة يتيحها Play، وتُظهر الأسعار المحوَّلة (بما في ذلك معدّل الضريبة التلقائي عند الاقتضاء) لجميع المناطق التي يتيح فيها Google Play إجراء عمليات الشراء.