ملاحظات إصدار Google Play Billing Library

يحتوي هذا المستند على ملاحظات الإصدار الخاصة بمكتبة Google Play Billing Library.

إصدار Google Play Billing Library 8.1.0‏ (‎06/11/2025)

يتوفّر الآن الإصدار 8.1.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

  • الاشتراكات المعلَّقة

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

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

  • تعديلات على الاشتراكات:

    • يتضمّن العنصر BillingFlowParams.ProductDetailsParams الآن الطريقة setSubscriptionProductReplacementParams() التي يمكنك من خلالها تحديد معلومات الاستبدال على مستوى المنتج.

    • يحتوي العنصر SubscriptionProductReplacementParams على طريقتَي ضبط:

      • setOldProductId: المنتج القديم الذي يجب استبداله بالمنتج في ProductDetails الحالي
      • setReplacementMode: هذا هو وضع الاستبدال على مستوى السلعة. تتشابه الأوضاع بشكل أساسي مع SubscriptionUpdateParams، ولكن تم تعديل عملية ربط القيم. تمت إضافة وضع استبدال جديد KEEP_EXISTING يتيح لك إبقاء جدول الدفع الحالي بدون تغيير لأحد العناصر.
    • سيتم إيقاف SubscriptionUpdateParams setSubscriptionReplacementMode نهائيًا. يجب استخدام SubscriptionProductReplacementParams.setReplacementMode بدلاً من ذلك.

  • تم تعديل minSdkVersion إلى 23.

  • تم تفعيل واجهات برمجة التطبيقات الخاصة بالطلب المُسبَق للمنتجات التي يتم تحصيل سعرها مرة واحدة

    أصبحت واجهة برمجة التطبيقات ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() التي تحصل على تفاصيل الطلب المُسبَق متاحة للاستخدام الآن.

  • تتوافق "مكتبة الفوترة في Google Play" الآن مع الإصدار 2.2.0 من Kotlin.

إصدار Google Play Billing Library 8.0.0‏ (‎30/06/2025)

يتوفّر الآن الإصدار 8.0.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

  • سيُشار الآن إلى المنتجات داخل التطبيق باسم المنتجات التي يتم تحصيل سعرها مرة واحدة.

  • خيارات شراء وعروض ترويجية متعدّدة للمنتجات التي يتم تحصيل سعرها مرة واحدة

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

  • تم تحسين طريقة queryProductDetailsAsync().

    قبل الإصدار 8.0.0 من PBL، لم تكن الطريقة queryProductDetailsAsync() تعرض المنتجات التي يتعذّر جلبها. قد يرجع ذلك إلى أسباب مثل عدم العثور على المنتج أو عدم توفّر عروض للمستخدم. في الإصدار 8.0.0 من PBL، يتم عرض المنتجات التي لم يتم استرجاعها مع رمز حالة جديد على مستوى المنتج يقدّم معلومات عن المنتجات التي لم يتم استرجاعها. يُرجى العِلم أنّه تم إجراء تغيير في توقيع ProductDetailsResponseListener.onProductDetailsResponse()، ما يتطلّب إجراء تغييرات في تطبيقك. لمزيد من المعلومات، يُرجى الاطّلاع على معالجة النتيجة.

  • إعادة الاتصال بالخدمة تلقائيًا

    يتيح مَعلمة BillingClient.Builder.enableAutoServiceReconnection() الجديدة للمطوّرين الموافقة على إعادة الاتصال التلقائي بالخدمة، ما يسهّل إدارة الاتصال من خلال التعامل مع عمليات إعادة الاتصال بـ "خدمة الفوترة في Play" تلقائيًا وإلغاء الحاجة إلى طلب startConnection() يدويًا في حال انقطاع الاتصال بالخدمة. لمزيد من المعلومات، يُرجى الاطّلاع على إعادة إنشاء اتصال تلقائيًا.

  • رموز الاستجابة الفرعية لطريقة launchBillingFlow().

    سيتضمّن BillingResult الذي تم عرضه من launchBillingFlow() الآن حقل رمز الاستجابة الفرعية. لن يتم ملء هذا الحقل إلا في بعض الحالات لتقديم سبب أكثر تحديدًا لتعذُّر إكمال العملية. في الإصدار 8.0.0 من مكتبة Play Billing، يتم عرض الرمز الفرعي PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS في حال كانت أموال المستخدم أقل من سعر المنتج الذي يحاول شراءه.

  • تمت إزالة طريقة queryPurchaseHistory().

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

  • تمت إزالة طريقة querySkuDetailsAsync().

    تمت الآن إزالة الطريقة querySkuDetailsAsync() التي تم وضع علامة عليها سابقًا باعتبارها متوقفة. عليك استخدام الدالة queryProductDetailsAsync بدلاً من ذلك.

  • تمت إزالة طريقة BillingClient.Builder.enablePendingPurchases().

    تمت الآن إزالة طريقة enablePendingPurchases() التي لم تتضمّن أي مَعلمات والتي تم وضع علامة عليها سابقًا باعتبارها متوقفة نهائيًا. يجب استخدام enablePendingPurchases(PendingPurchaseParams params) بدلاً من ذلك. يُرجى العِلم أنّ enablePendingPurchases() المتوقّف نهائيًا يعادل enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) من الناحية الوظيفية.

  • تمت إزالة طريقة queryPurchasesAsync() المحمّلة بشكل زائد والتي تأخذ skuType.

    تمت الآن إزالة الطريقة queryPurchasesAsync(String skuType, PurchasesResponseListener listener) التي تم وضع علامة عليها سابقًا باعتبارها متوقفة. يمكنك بدلاً من ذلك استخدام queryPurchasesAsync(QueryPurchasesParams queryPurchasesParams, PurchasesResponseListener listener).

إصدار Google Play Billing Library 7.1.1 ‏ (03/10/2024)

يتوفّر الآن الإصدار 7.1.1 من Google Play Billing Library وإضافات Kotlin.

إصلاح الأخطاء

إصدار Google Play Billing Library 7.1.0 ‏ (‎19/09/2024)

يتوفّر الآن الإصدار 7.1.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

  • تحسين أمان سلاسل التعليمات المتعلّقة بحالة الاتصال وإدارته
  • تم طرح تغييرات جزئية لاختبار رموز الاستجابة [BillingResult][billing-result] التي تم إصدارها بالكامل في الإصدار 7.1.1 من Play Billing Library. لاختبار عملية الدمج باستخدام هذه الميزة، عليك الترقية إلى الإصدار 7.1.1 من مكتبة Play Billing. هناك خطأ سيؤثّر فقط في التطبيقات التي [تم تفعيل اختبار عمليات إلغاء الفوترة فيها][enable-billing-overrides-testing]، ولن يؤثّر في الاستخدام العادي. لمزيد من المعلومات، يُرجى الاطّلاع على اختبار BillingResultرموز الاستجابة. [billing-result]: /reference/com/android/billingclient/api/BillingResult [enable-billing-overrides-testing]: /google/play/billing/test-response-codes#enable-billing-overrides-testing

إصدار Google Play Billing Library 7.0.0 ‏ (‎14/05/2024)

يتوفّر الآن الإصدار 7.0.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

إصدار Google Play Billing Library 6.2.1 ‏ (‎16/04/2024)

يتوفّر الآن الإصدار 6.2.1 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

إصدار Google Play Billing Library 6.2.0 (‎06/03/2024)

يتوفّر الآن الإصدار 6.2.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

إصدار Google Play Billing Library 6.1.0 ‏ (‎14/11/2023)

يتوفّر الآن الإصدار 6.1.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

إصدار Google Play Billing Library 6.0.1‏ (‎22/06/2023)

يتوفّر الآن الإصدار 6.0.1 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

تحديث Play Billing Library لكي تتوافق مع الإصدار 14 من نظام التشغيل Android

إصدار الإصدار 6.0 من Google Play Billing Library‏ (‎10/05/2023)

يتوفّر الآن الإصدار 6.0.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

  • تمت إضافة تعداد ReplacementMode جديد لاستبدال ProrationMode.

    يُرجى العلم أنّ ProrationMode لا يزال متاحًا لأسباب تتعلّق بالتوافق مع الأنظمة القديمة.

  • تمت إزالة معرّف الطلب لعمليات الشراء التي أجريت باستخدام PENDING.

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

  • تمت إزالة الطريقتَين queryPurchases وlaunchPriceConfirmationFlow.

    تمت الآن إزالة الطريقتَين queryPurchases وlaunchPriceConfirmationFlow اللتَين تم وضع علامة عليهما سابقًا باعتبارهما متوقفتَين نهائيًا، وذلك في الإصدار 6.0.0 من مكتبة Play Billing. على المطوّرين استخدام queryPurchasesAsync بدلاً من queryPurchases. للاطّلاع على بدائل launchPriceConfirmationFlow، يُرجى الاطّلاع على تغييرات الأسعار.

  • تمت إضافة رمز استجابة جديد لخطأ في الشبكة.

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

  • تم تعديل SERVICE_UNAVAILABLE وSERVICE_TIMEOUT.

    بدءًا من الإصدار 6.0.0 من PBL، سيتم عرض الأخطاء الناتجة عن انتهاء المهلة أثناء المعالجة كرمز SERVICE_UNAVAILABLE بدلاً من الرمز SERVICE_TIMEOUT الحالي.

    لا يتغيّر السلوك في الإصدارات السابقة من PBL.

  • تمت إزالة SERVICE_TIMEOUT.

    اعتبارًا من الإصدار 6.0.0 من PBL، لن يتم عرض SERVICE_TIMEOUT. ستستمر الإصدارات السابقة من PBL في عرض هذا الرمز.

  • تمت إضافة تسجيل إضافي.

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

إصدار Google Play Billing Library 5.2.1‏ (‎22/06/2023)

يتوفّر الآن الإصدار 5.2.1 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

تحديث Play Billing Library لكي تتوافق مع الإصدار 14 من نظام التشغيل Android

إصدار Google Play Billing Library 5.2‏ (‎06/04/2023)

يتوفّر الآن الإصدار 5.2.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

إصدار Google Play Billing Library 5.1 ‏ (‎31/10/2022)

يتوفّر الآن الإصدار 5.1.0 من Google Play Billing Library وإضافات Kotlin.

يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

إصدار الإصدار 5.0 من Google Play Billing Library‏ (‎11/05/2022)

يتوفّر الآن الإصدار 5.0.0 من Google Play Billing Library وإضافات Kotlin.

يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

  • طرحنا نموذجًا جديدًا للاشتراكات، بما في ذلك كيانات جديدة تتيح لك إنشاء عروض متعددة لمنتج اشتراك واحد. لمزيد من المعلومات، راجِع دليل نقل البيانات.
  • تمت إضافة BillingClient.queryProductDetailsAsync() لاستبدال BillingClient.querySkuDetailsAsync().
  • تمت إضافة طريقة setIsOfferPersonalized() لتلبية متطلبات الإفصاح عن الأسعار المخصّصة في الاتحاد الأوروبي. لمزيد من المعلومات حول كيفية استخدام هذه الطريقة، يمكنك الاطّلاع على تحديد سعر مخصّص.
  • تمت إزالة queryPurchases()، التي تم إيقافها نهائيًا واستبدالها سابقًا بالدالة queryPurchasesAsync التي تم طرحها في الإصدار 4.0.0 من Google Play Billing Library.
  • تم إيقاف واجهة برمجة التطبيقات launchPriceChangeFlow نهائيًا وستتم إزالتها في إصدار مستقبلي. لمزيد من المعلومات عن البدائل، اطّلِع على إطلاق مسار تأكيد تغيير السعر.
  • تمت إزالة setVrPurchaseFlow()، الذي كان يُستخدَم سابقًا عند إنشاء مسار شراء. في الإصدارات السابقة، كانت هذه الطريقة تعيد توجيه المستخدم لإكمال عملية الشراء على جهاز Android. بعد إزالة طريقة الدفع هذه، سيُكمل المستخدمون عملية الشراء من خلال مسار الشراء العادي.

إصدار Google Play Billing Library 4.1 ‏ (‎23/02/2022)

يتوفّر الآن الإصدار 4.1.0 من Google Play Billing Library وإضافات Kotlin.

يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

إصدار الإصدار 4.0 من مكتبة الفوترة في Google Play ‏ (18/05/2021)

يتوفّر الآن الإصدار 4.0.0 من Google Play Billing Library وإضافات Kotlin.

ملخص التغييرات

  • تمت إضافة BillingClient.queryPurchasesAsync() لاستبدال BillingClient.queryPurchases() التي ستتم إزالتها في إصدار مستقبلي.

  • تمت إضافة وضع جديد لاستبدال الاشتراك IMMEDIATE_AND_CHARGE_FULL_PRICE.

  • تمت إضافة الطريقة BillingClient.getConnectionState() لاسترداد حالة الاتصال في Play Billing Library.

  • تم تعديل Javadoc والتنفيذ للإشارة إلى سلسلة التعليمات البرمجية التي يمكن استدعاء طريقة عليها وسلسلة التعليمات البرمجية التي يتم نشر النتائج عليها.

  • تمت إضافة BillingFlowParams.Builder.setSubscriptionUpdateParams() كطريقة جديدة لبدء تحديثات الاشتراك. يحلّ هذا التصنيف محلّ BillingFlowParams#getReplaceSkusProrationMode وBillingFlowParams#getOldSkuPurchaseToken وBillingFlowParams#getOldSku وBillingFlowParams.Builder#setReplaceSkusProrationMode وBillingFlowParams.Builder#setOldSku التي تمت إزالتها.

  • تمت إضافة Purchase.getQuantity() و PurchaseHistoryRecord.getQuantity().

  • تمت إضافة Purchase#getSkus() و PurchaseHistoryRecord#getSkus(). تحلّ هذه القيم محلّ Purchase#getSku وPurchaseHistoryRecord#getSku اللتين تمت إزالتهما.

  • تمت إزالة BillingFlowParams#getSku وBillingFlowParams#getSkuDetails وBillingFlowParams#getSkuType.

إصدار Google Play Billing Library 3.0.3 ‏ (‎12/03/2021)

يتوفّر الآن الإصدار 3.0.3 من Google Play Billing Library وإضافة Kotlin ومكوّن Unity الإضافي.

إصلاح الأخطاء في Java وKotlin

  • تم إصلاح مشكلة تسرب الذاكرة عند استدعاء endConnection()
  • تم إصلاح مشكلة عند استخدام Google Play Billing Library من قِبل التطبيقات التي تستخدم وضع تشغيل مهمة واحدة. سيتم تشغيل onPurchasesUpdated() دالة ردّ الاتصال عند استئناف تطبيق من مشغّل تطبيقات Android وكان مربّع حوار الفوترة مرئيًا قبل تعليقه.

إصلاحات الأخطاء في Unity

  • يمكنك التحديث إلى الإصدار 3.0.3 من Java لإصلاح مشكلة تسرُّب الذاكرة وحلّ المشكلة التي تمنع إجراء عمليات شراء عند استئناف استخدام تطبيق من مشغّل تطبيقات Android وكان مربّع حوار الفوترة ظاهرًا قبل تعليق التطبيق.

إصدار Google Play Billing Library 3.0.2 ‏ (24/11/2020)

يتوفّر الآن الإصدار 3.0.2 من Google Play Billing Library وإضافة Kotlin.

إصلاح الأخطاء

  • تم إصلاح خطأ في إضافة Kotlin حيث يتعذّر تنفيذ الروتين الفرعي مع ظهور الخطأ "تمت استئناف العملية من قبل".
  • تم إصلاح المراجع التي لم يتم حلّها عند استخدام إضافة Kotlin مع الإصدار 1.4 أو الإصدارات الأحدث من مكتبة kotlinx.coroutines.

إصدار Google Play Billing Library 3.0.1 (‫30-09-2020)

يتوفّر الآن الإصدار 3.0.1 من Google Play Billing Library وإضافة Kotlin.

إصلاح الأخطاء

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

إصدار Google Play Billing Library 3.0 (‫08-06-2020)

يتوفّر الآن الإصدار 3.0.0 من Google Play Billing Library وإضافة Kotlin ومكوّن Unity الإضافي.

ملخص التغييرات

  • تمت إزالة إمكانية استخدام رموز التخزين التعريفي للمنتجات مقابل مكافآت.
  • تمت إزالة المَعلمتَين ChildDirected وUnderAgeOfConsent.
  • تمت إزالة طرق حمولة المطوّر المتوقّفة نهائيًا.
  • تمت إزالة الطريقتَين المتوقّفتَين نهائيًا BillingFlowParams.setAccountId() وBillingFlowParams.setDeveloperId().
  • تمت إزالة الطريقتَين المتوقّفتَين نهائيًا BillingFlowParams.setOldSkus(String oldSku) وBillingFlowParams.addOldSku(String oldSku).
  • تمت إضافة تعليقات توضيحية بشأن إمكانية قبول القيمة الخالية.

إصلاح الأخطاء

  • تعرض الدالة SkuDetails.getIntroductoryPriceCycles() الآن القيمة int بدلاً من String.
  • تم إصلاح الخطأ الذي كان يؤدي إلى اعتبار عملية الفوترة تتضمّن مَعلمات إضافية حتى في حال عدم ضبط أي مَعلمات إضافية.

إصدار Google Play Billing Library 2.2.1 (‎20/05/2020)

يتوفّر الآن الإصدار 2.2.1 من مكتبة الفوترة في Google Play.

إصلاح الأخطاء

  • تم تعديل الإصدار التلقائي من مكتبة Java Play Billing التي يعتمد عليها إضافة Kotlin.

إصدار Google Play Billing Library 2.2.0 وإتاحة استخدامها في Unity (‎23/03/2020)

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

‫Google Play Billing Billing Library 2 for Unity

بالإضافة إلى إصدارَي Java وKotlin الحاليَّين من الإصدار 2 من Google Play Billing Library، طرحنا إصدارًا من المكتبة يمكن استخدامه مع Unity. يمكن لمطوّري الألعاب الذين يستخدمون واجهة برمجة التطبيقات الخاصة بعمليات الشراء داخل التطبيق في Unity الترقية الآن للاستفادة من جميع ميزات الإصدار 2 من مكتبة الفوترة في Google Play وتسهيل عمليات الترقية اللاحقة إلى الإصدارات المستقبلية من مكتبة الفوترة في Google Play.

لمزيد من المعلومات، يُرجى الاطّلاع على استخدام خدمة "الفوترة في Google Play" مع Unity.

ملخص التغييرات

إصدار Google Play Billing Library 2.1.0 وإصدار إضافة Kotlin 2.1.0 (‫10-12-2019)

يتوفّر الآن الإصدار 2.1.0 من Google Play Billing Library وإضافة Kotlin الجديدة. يوفّر إضافة Kotlin لمكتبة Play Billing Library بدائل لواجهة برمجة التطبيقات متوافقة مع لغة Kotlin، وتتميّز بأمان أفضل للقيم الفارغة وروتينات مشتركة. للاطّلاع على أمثلة على الرموز البرمجية، راجِع مقالة استخدام Google Play Billing Library.

يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

  • في BillingFlowParams، تم إيقاف setOldSku(String oldSku) نهائيًا واستبداله بـ setOldSku(String oldSku, String purchaseToken)، وذلك لتجنُّب الغموض عند امتلاك عدة حسابات على الجهاز لمعرّف التخزين التعريفي نفسه.

إصدار Google Play Billing Library 2.0.3 (‫05-08-2019)

يتوفّر الآن الإصدار 2.0.3 من مكتبة الفوترة في Google Play.

إصلاح الأخطاء

  • تم إصلاح الخطأ الذي كان يؤدي أحيانًا إلى تعذُّر تنفيذ querySkuDetailsAsync() مع ظهور الرمز DEVELOPER_ERROR بدلاً من عرض نتيجة ناجحة.

إصدار Google Play Billing Library 2.0.2 (‫08-07-2019)

يتوفّر الآن الإصدار 2.0.2 من Google Play Billing Library. يتضمّن هذا الإصدار تعديلات على المستندات المرجعية ولا يغيّر وظائف المكتبة.

إصدار Google Play Billing Library 2.0.1 (‫06-06-2019)

يتوفّر الآن الإصدار 2.0.1 من مكتبة الفوترة في Google Play. يتضمّن هذا الإصدار التغييرات التالية.

إصلاح الأخطاء

  • تم إصلاح الخطأ الذي كان يتسبّب في عرض رسائل تصحيح الأخطاء على شكل null في بعض الحالات.
  • تم إصلاح مشكلة محتملة في تسرب الذاكرة.

إصدار الإصدار 2.0 من Google Play Billing Library (‫07-05-2019)

يتوفّر الآن الإصدار 2.0 من Google Play Billing Library. يتضمّن هذا الإصدار التغييرات التالية.

يجب تأكيد عمليات الشراء في غضون ثلاثة أيام

يتيح Google Play شراء المنتجات من داخل تطبيقك (داخل التطبيق) أو من خارجه (خارج التطبيق). لكي يضمن Google Play توفير تجربة شراء متسقة بغض النظر عن مكان شراء المستخدم لمنتجك، عليك الإقرار بجميع عمليات الشراء التي تتم من خلال Google Play Billing Library في أقرب وقت ممكن بعد منح المستخدم إذن الوصول إلى المنتج. إذا لم يتم الإقرار بإتمام الشراء في غضون ثلاثة أيام، فسيتم ردّ الأموال تلقائيًا إلى المستخدم وسيلغي Google Play عملية الشراء. بالنسبة إلى المعاملات المعلّقة (ميزة جديدة في الإصدار 2.0)، تبدأ فترة الثلاثة أيام عندما تنتقل عملية الشراء إلى الحالة PURCHASED ولا تنطبق عندما تكون عملية الشراء في الحالة PENDING.

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

يتضمّن العنصر Purchase الآن الطريقة isAcknowledged() التي تشير إلى ما إذا تم تأكيد عملية الشراء. بالإضافة إلى ذلك، تتضمّن واجهة Google Play Developer API قيمًا منطقية خاصة بالإقرار لكل من Purchases.products و Purchases.subscriptions. قبل التصديق على عملية شراء، احرص على استخدام هذه الطرق لتحديد ما إذا تم التصديق على عملية الشراء مسبقًا.

يمكنك إقرار عملية شراء باستخدام إحدى الطرق التالية:

  • بالنسبة إلى المنتجات الاستهلاكية، استخدِم consumeAsync() المتوفّر في واجهة برمجة التطبيقات الخاصة بالعميل.
  • بالنسبة إلى المنتجات غير الاستهلاكية، استخدِم acknowledgePurchase()، الذي يمكن العثور عليه في واجهة برمجة التطبيقات الخاصة بالعميل.
  • تتوفّر أيضًا طريقة acknowledge() جديدة في Server API.

تمت إزالة BillingFlowParams.setSku()

تمت إزالة الطريقة BillingFlowParams#setSku() التي تم إيقافها نهائيًا في السابق في هذا الإصدار. قبل عرض المنتجات في مسار الشراء، يجب الآن استدعاء BillingClient.querySkuDetailsAsync()، مع تمرير العنصر الناتج SkuDetails إلى BillingFlowParams.Builder.setSkuDetails().

للاطّلاع على أمثلة على الرموز البرمجية، راجِع مقالة استخدام Google Play Billing Library.

إتاحة حمولة المطوّر

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

للوصول إلى الحمولة في المكتبة الجديدة، تتضمّن عناصر Purchase الآن طريقة getDeveloperPayload().

العروض المتطابقة

عند تقديم رمز تخزين تعريفي بسعر مخفَّض، يعرض Google Play الآن السعر الأصلي لرمز التخزين التعريفي حتى تتمكّن من إظهار الخصم للمستخدمين.

يتضمّن SkuDetails طريقتَين جديدتَين لاسترداد سعر رمز التخزين التعريفي الأصلي:

المعاملات المعلّقة:

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

لتفعيل عمليات الشراء المعلّقة، استدعِ الدالة enablePendingPurchases() كجزء من عملية تهيئة تطبيقك.

استخدِم Purchase.getPurchaseState() لتحديد ما إذا كانت حالة الشراء هي PURCHASED أو PENDING. يُرجى العِلم أنّه يجب منح الإذن فقط عندما تكون الحالة PURCHASED. يجب التحقّق من Purchase حالة طلبك باتّباع الخطوات التالية:

  1. عند بدء تشغيل تطبيقك، استدعِ الدالة BillingClient.queryPurchases() لاسترداد قائمة المنتجات غير المستهلكة المرتبطة بالمستخدم.
  2. استدعِ الدالة Purchase.getPurchaseState() على كل عنصر Purchase تم عرضه.
  3. نفِّذ طريقة onPurchasesUpdated() للاستجابة للتغييرات التي تطرأ على عناصر Purchase.

بالإضافة إلى ذلك، تتضمّن واجهة برمجة التطبيقات Google Play Developer API حالة PENDING لـ Purchases.products. لا تتوفّر المعاملات المعلّقة للاشتراكات.

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

عند إقرار عمليات الشراء المعلقة، احرص على عدم إقرارها إلا عندما تكون حالة الشراء هي PURCHASED وليس PENDING.

التغييرات في واجهة برمجة التطبيقات

يتضمّن الإصدار 2.0 من مكتبة Google Play Billing عدة تغييرات في واجهة برمجة التطبيقات بهدف توفير ميزات جديدة وتوضيح الوظائف الحالية.

consumeAsync

تتلقّى الدالة consumeAsync() الآن الكائن ConsumeParams بدلاً من purchaseToken. يحتوي ConsumeParams على purchaseToken بالإضافة إلى حمولة اختيارية للمطوّر.

تمت إزالة الإصدار السابق من consumeAsync() في هذا الإصدار.

queryPurchaseHistoryAsync

لتجنُّب حدوث أي التباس، يعرض queryPurchaseHistoryAsync() الآن عنصر PurchaseHistoryRecord بدلاً من عنصر Purchase. عنصر PurchaseHistoryRecord هو نفسه عنصر Purchase، باستثناء أنّه يعرض القيم التي تعرضها queryPurchaseHistoryAsync() فقط ولا يحتوي على الحقول autoRenewing وorderId وpackageName. يُرجى العِلم أنّه لم يحدث أي تغيير في البيانات التي يتم عرضها، إذ تعرض queryPurchaseHistoryAsync() البيانات نفسها التي كانت تعرضها من قبل.

قيم الإرجاع الخاصة بفئة BillingResult

إنّ واجهات برمجة التطبيقات التي كانت تعرض سابقًا قيمة عدد صحيح BillingResponse تعرض الآن عنصر BillingResult. يحتوي BillingResult على العدد الصحيح BillingResponse بالإضافة إلى سلسلة تصحيح الأخطاء التي يمكنك استخدامها لتشخيص الأخطاء. تستخدم سلسلة تصحيح الأخطاء لغة en-US ولا يُفترض أن يتم عرضها للمستخدمين النهائيين.

إصلاح الأخطاء

إصدار Google Play Billing Library 1.2.2 (‫07-03-2019)

يتوفّر الآن الإصدار 1.2.2 من مكتبة الفوترة في Google Play. يتضمّن هذا الإصدار التغييرات التالية.

إصلاح الأخطاء

  • تم إصلاح مشكلة في سلاسل التعليمات البرمجية تم طرحها في الإصدار 1.2.1. لم تعُد المكالمات التي تعمل في الخلفية تحظر سلسلة التعليمات الرئيسية.

تغييرات أخرى

  • على الرغم من أنّه لا يزال يُنصح باستخدام سلسلة التعليمات الرئيسية، يمكنك الآن إنشاء مثيل لمكتبة Google Play Billing Library من سلسلة تعليمات في الخلفية.
  • تم نقل عملية إنشاء مثيل بالكامل إلى سلسلة الخلفية لتقليل احتمالية حدوث أخطاء ANR.

إصدار Play Billing Library 1.2.1 (‫04-03-2019)

يتوفّر الآن الإصدار 1.2.1 من مكتبة الفوترة في Google Play. يتضمّن هذا الإصدار التغييرات التالية.

التغييرات الرئيسية

تغييرات أخرى

  • تمت إضافة أدوات إنشاء عامة للفئتَين PurchasesResult وSkuDetailsResult لتسهيل الاختبار.
  • يمكن لعناصر SkuDetails استخدام طريقة جديدة، وهي getOriginalJson().
  • تتم الآن معالجة جميع طلبات الخدمة في AIDL من خلال سلاسل الخلفية.

إصلاح الأخطاء

  • لم يعُد يتم تمرير أدوات معالجة رد الاتصال الفارغة إلى واجهات برمجة التطبيقات المتاحة للجميع.

إصدار Google Play Billing Library 1.2 (‫18-10-2018)

يتوفّر الآن الإصدار 1.2 من Google Play Billing Library. يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

  • أصبح ترخيص "مكتبة الفوترة في Google Play" الآن بموجب اتفاقية الترخيص الخاصة بـ "حزمة تطوير البرامج لنظام Android".
  • تمت إضافة واجهة برمجة التطبيقات launchPriceChangeConfirmationFlow التي تطلب من المستخدمين مراجعة تغيير معلّق في سعر الاشتراك.
  • تمت إضافة إمكانية استخدام وضع احتساب جديد للنسبة والتناسب، وهو DEFERRED، عند ترقية اشتراك المستخدم أو خفضه.
  • في الفئة BillingFlowParams، تم استبدال setSku() بـ setSkuDetails().
  • إصلاحات أخطاء بسيطة وتحسينات في الرمز البرمجي.

تأكيد تغيير السعر

يمكنك الآن تغيير سعر الاشتراك في Google Play Console ومطالبة المستخدمين بمراجعة السعر الجديد وقبوله عند دخولهم إلى تطبيقك.

لاستخدام واجهة برمجة التطبيقات هذه، أنشئ عنصر PriceChangeFlowParams باستخدام skuDetails الخاص بالمنتج الذي يتضمّن اشتراكًا، ثم استدعِ launchPriceChangeConfirmationFlow(). نفِّذ PriceChangeConfirmationListener للتعامل مع النتيجة عند انتهاء عملية تأكيد تغيير السعر، كما هو موضّح في مقتطف الرمز التالي:

Kotlin

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

يعرض مسار تأكيد تغيير السعر مربع حوار يحتوي على معلومات التسعير الجديدة، ويطلب من المستخدمين قبول السعر الجديد. تعرض عملية التحقّق هذه رمز استجابة من النوع BillingClient.BillingResponse.

وضع جديد لاحتساب المبالغ النسبية

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

طريقة جديدة لضبط تفاصيل رمز التخزين التعريفي

في الفئة BillingFlowParams، تم إيقاف الطريقة setSku() نهائيًا. يهدف هذا التغيير إلى تحسين مسار الفوترة في Google Play.

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

تم إيقاف الطريقة setSku() نهائيًا في فئة BillingFlowParams Builder. بدلاً من ذلك، استخدِم طريقة setSkuDetails()، كما هو موضّح في مقتطف الرمز التالي. يأتي العنصر الذي تم تمريره إلى العنصر setSkuDetails() من الإجراء querySkuDetailsAsync().

Kotlin

private lateinit var mBillingClient: BillingClient
private val mSkuDetailsMap = HashMap<String, SkuDetails>()

private fun querySkuDetails() {
    val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder()
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build()
    ) { responseCode, skuDetailsList ->
        if (responseCode == 0) {
            for (skuDetails in skuDetailsList) {
                mSkuDetailsMap[skuDetails.sku] = skuDetails
            }
        }
    }
}

private fun startPurchase(skuId: String) {
    val billingFlowParams = BillingFlowParams.newBuilder()
    .setSkuDetails(mSkuDetailsMap[skuId])
    .build()
}

Java

private BillingClient mBillingClient;
private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>();

private void querySkuDetails() {
    SkuDetailsParams.Builder skuDetailsParamsBuilder
            = SkuDetailsParams.newBuilder();
    mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(),
            new SkuDetailsResponseListener() {
                @Override
                public void onSkuDetailsResponse(int responseCode,
                        List<SkuDetails> skuDetailsList) {
                    if (responseCode == 0) {
                        for (SkuDetails skuDetails : skuDetailsList) {
                            mSkuDetailsMap.put(skuDetails.getSku(), skuDetails);
                        }
                    }
                }
            });
}

private void startPurchase(String skuId) {
    BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
            .setSkuDetails(mSkuDetailsMap.get(skuId))
            .build();
}

إصدار Play Billing Library 1.1 (‫07-05-2018)

يتوفّر الآن الإصدار 1.1 من مكتبة الفوترة في Google Play. يتضمّن هذا الإصدار التغييرات التالية.

ملخص التغييرات

  • تمت إضافة إمكانية تحديد وضع احتساب النسب في BillingFlowParams عند ترقية اشتراك حالي أو خفضه.
  • لم يعُد الخيار المنطقي replaceSkusProration في BillingFlowParams متاحًا. يمكنك استخدام replaceSkusProrationMode كبديل.
  • تُفعّل خدمة launchBillingFlow() الآن عملية ردّ للاستجابات غير الناجحة.

تغييرات السلوك

يتضمّن الإصدار 1.1 من Google Play Billing Library تغييرات السلوك التالية.

يمكن للمطوّرين ضبط replaceSkusProrationMode في فئة BillingFlowParams

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

Kotlin

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

يتيح Google Play أوضاع التقسيم النسبي التالية:

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

ملاحظة: لا يتوفّر هذا الخيار إلا لترقية الاشتراك.

IMMEDIATE_WITHOUT_PRORATION يصبح الاستبدال ساريًا على الفور، وسيتم تحصيل السعر الجديد عند التكرار التالي. ستبقى دورة الفوترة كما هي.

لم يعُد replaceSkusProration متاحًا في الصف BillingFlowParams

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

تُفعّل خدمة launchBillingFlow() الآن وظيفة ردّ الاتصال للاستجابات التي تعذّر إكمالها

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

إصلاح الأخطاء

  • الخروج بشكل صحيح في وقت مبكر من الطرق غير المتزامنة عند قطع اتصال الخدمة
  • لم يعُد يتم تغيير الكائنات المضمّنة في كائنات المعلمات Builder.
  • المشكلة 68087141: launchBillingFlow() يتم الآن تفعيل دالة رد الاتصال للردود التي تعذّر إرسالها.

إصدار 1.0 من Google Play Billing Library (‫19-09-2017، إعلان)

يتوفّر الآن الإصدار 1.0 من Google Play Billing Library. يتضمّن هذا الإصدار التغييرات التالية.

التغييرات المهمة

  • إذن الفوترة المضمّنة داخل بيان المكتبة لم يعُد من الضروري إضافة الإذن com.android.vending.BILLING داخل ملف بيان Android.
  • تمت إضافة أداة إنشاء جديدة إلى فئة BillingClient.Builder.
  • تم تقديم نمط أداة الإنشاء للفئة SkuDetailsParams لاستخدامها في طرق طلب البحث عن رموز التخزين التعريفية.
  • تم تعديل عدّة طرق في واجهة برمجة التطبيقات لتحقيق التناسق (أسماء وترتيب وسيطات الإرجاع نفسها).

تغييرات السلوك

يتضمّن الإصدار 1.0 من مكتبة Google Play Billing تغييرات السلوك التالية.

فئة BillingClient.Builder

تمت الآن تهيئة BillingClient.Builder باستخدام نمط newBuilder:

Kotlin

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

يتم الآن طلب طريقة launchBillingFlow باستخدام فئة BillingFlowParams

لبدء مسار الفوترة لعملية شراء أو اشتراك، تتلقّى الطريقة launchBillingFlow() مثيلاً من BillingFlowParams تمت تهيئته باستخدام مَعلمات خاصة بالطلب:

Kotlin

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

طريقة جديدة للاستعلام عن المنتجات المتوفّرة

تم تضمين وسيطات الطريقتَين queryPurchaseHistoryAsync() وquerySkuDetailsAsync() في نمط Builder:

Kotlin

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

يتم الآن عرض النتيجة من خلال رمز النتيجة وقائمة SkuDetails بدلاً من فئة التغليف السابقة لتوفير الراحة لك ولضمان الاتساق في جميع واجهات برمجة التطبيقات:

Kotlin

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

تم تغيير ترتيب المَعلمات في الطريقة onConsumeResponse()

تم تغيير ترتيب وسيطات onConsumeResponse من واجهة ConsumeResponseListener لتصبح متسقة في جميع واجهات برمجة التطبيقات:

Kotlin

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

كائن PurchaseResult غير مضمّن

تمت إزالة التغليف عن PurchaseResult ليكون متسقًا في جميع واجهات برمجة التطبيقات:

Kotlin

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

إصلاح الأخطاء

الإصدار 1 من معاينة المطوّر (12-06-2017، إعلان)

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

تتضمّن المكتبة العديد من الفئات والميزات الملائمة التي يمكنك استخدامها عند دمج تطبيقات Android مع Google Play Billing API. توفّر المكتبة أيضًا طبقة تجريد فوق خدمة Android Interface Definition Language (AIDL)، ما يسهّل على المطوّرين تحديد الواجهة بين التطبيق وGoogle Play Billing API.