نقل البيانات إلى الإصدار 6 من Google Play Billing Library من الإصدار 4 أو 5

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

للحصول على قائمة كاملة بالتغييرات في الإصدار 6.0.0، يمكنك الرجوع إلى ملاحظات الإصدار.

نظرة عامة

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

لمزيد من المعلومات حول الميزات الجديدة التي تم توفيرها في Play Billing Library 5، يُرجى الاطّلاع على المقالة التغييرات الأخيرة على الاشتراكات في Play Console.

ترقية Play Billing Library متوافقة مع الإصدارات السابقة

تم تحويل جميع المنتجات الحالية المتوفّرة عند الاشتراك تلقائيًا إلى هذا النموذج الجديد كجزء من إصدار Play Billing Library 5 الذي تم إطلاقه في أيار (مايو) 2022 والمنصة الجديدة للاشتراكات. يعني ذلك أنّه لن يكون عليك إجراء أي تغييرات على إعدادات المنتجات المتوفّرة عند الاشتراك كي يكون لديك كتالوج متوافق مع الإصدارات الجديدة من Play Billing Library. لمزيد من المعلومات حول طريقة تحويل رموز التخزين التعريفية للاشتراكات إلى اشتراكات متوافقة مع الأنظمة القديمة، يُرجى الاطّلاع على قسم العمل مع الاشتراكات القديمة في مقالة مركز مساعدة Play Console.

لا تزال الإصدارات القديمة من تطبيقك تعمل

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

تجدر الإشارة إلى أنّ إصدارات تطبيقك التي تستخدم طرق متوقّفة نهائيًا (مثل querySkuDetailsAsync()) لن تتمكّن من بيع أي خطط أساسية أو عروض غير متوافقة مع الأنظمة القديمة. يمكنك التعرُّف على العروض المتوافقة مع الأنظمة القديمة في مقالة مركز مساعدة Play Console ذات الصلة.

الترقية إلى الإصدار 5 أو 6 من Play Billing Library

يتضمّن الإصداران 5 و6 من Play Billing Library الطريقتَين المتوقفة نهائيًا querySkuDetailsAsync وBillingFlowParams.Builder.setSkuDetails التي تستخدم SkuDetails كمَعلمة لتدفق الفوترة. يعني هذا أنّه يمكنك الانتقال تدريجيًا إلى الإصدار 6 من Play Billing Library من خلال التخطيط لمراحل مختلفة من عملية نقل البيانات.

كخطوة أولى للنقل، يمكنك فقط تحديث إصدار المكتبة، وترك الكتالوج والخلفية كما هي، واختبار تطبيقك أثناء استخدام الطرق المتوقّفة نهائيًا. في حال عدم استخدام السمة queryPurchases أو launchPriceChangeFlow أو setVrPurchaseFlow، من المفترَض أن تعمل على النحو المطلوب. بعد ذلك، يمكنك إعادة استخدام ميزات الاشتراك الجديدة التي تم إصدارها في أيار (مايو) 2022 بشكل كامل.

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

خطوات نقل البيانات الكاملة

إنشاء اشتراكات جديدة في كتالوج المنتجات الخلفية

باستخدام Play Console أو واجهة برمجة التطبيقات Play Developer API، يمكنك الآن إعداد اشتراك واحد يتضمّن عدة خطط أساسية، ولكل منها عروضًا متعددة. تتضمّن عروض الاشتراك نماذج أسعار مرنة وخيارات أهلية. يمكنك إنشاء عروض طوال دورة حياة الاشتراك باستخدام مجموعة متنوعة من خطط التجديد التلقائي وخطط الدفع المُسبَق.

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

ننصح بعدم تعديل المنتجات المتوفّرة عند الاشتراك التي تم تحويلها بعد إصدار شهر أيار (مايو) 2022، بل تركها كما هي ليتم بيعها مع إصدارات تطبيقك باستخدام طرق متوقّفة نهائيًا (مثل querySkuDetailsAsync()) بدون إدخال تغييرات قد تؤثر في هذه الإصدارات القديمة.

بعد إجراء عملية الإحالة الناجحة، أصبحت المنتجات المتوفّرة عند الاشتراك التي كانت مدرَجة في الكتالوج قبل أيار (مايو) 2022 للقراءة فقط، وذلك لتجنُّب التغييرات غير المقصودة التي قد تؤدي إلى حدوث مشاكل في عملية الدمج الحالية. من الممكن إجراء تغييرات على هذه الاشتراكات، ولكن قد تكون هناك تداعيات قد تؤثر على عمليات الدمج بين الواجهة الأمامية والخلفية:

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

  • في الخلفية، في حال تعديل اشتراكاتك المحوَّلة في واجهة مستخدم Play Console، لن تتمكّن من إدارتها باستخدام نقطة نهاية inappproducts إذا كنت تطلب نقطة النهاية لهذا الغرض. عليك أيضًا نقل البيانات إلى نقطة النهاية الجديدة لحالة شراء الاشتراك (purchases.subscriptionsv2.get) لإدارة عمليات الشراء لهذه الاشتراكات، لأنّ نقطة نهاية حالة الشراء القديمة (purchases.subscriptions.get) تعرض فقط البيانات اللازمة لمعالجة الخطط الأساسية المتوافقة مع الإصدارات السابقة وعمليات الشراء. لمعرفة مزيد من المعلومات، يمكنك الاطّلاع على قسم إدارة حالة شراء الاشتراك.

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

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

لنقل وحدة إدارة كتالوج المنتجات التلقائية للاشتراكات في خدمة "الفوترة في Google Play"، استبدِل واجهة برمجة التطبيقات inappproducts بواجهة برمجة التطبيقات الجديدة Subscription Publishing API لإدارة كتالوج الاشتراكات ونشره. هناك ثلاث نقاط نهاية جديدة:

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

لا يزال بإمكانك استخدام واجهة برمجة التطبيقات inappproducts لإدارة كتالوج المنتجات داخل التطبيق للمنتجات التي يتم شراؤها مرة واحدة.

بالنسبة إلى إصدارات تطبيقك التي تستخدم طرق متوقّفة نهائيًا (مثل querySkuDetailsAsync())، لن تتمكّن من بيع أي خطط أساسية أو عروض غير متوافقة مع الأنظمة القديمة. يمكنك الاطِّلاع على العروض المتوافقة مع الأنظمة القديمة هنا.

تحديث Google Play Billing Library

بعد إنشاء كتالوج جديد للمنتجات المتوفّرة عند الاشتراك، يمكنك نقل تطبيقك إلى الإصدار 5 من Google Billing Library. استخدِم الإصدار المعدّل بدلاً من تبعية Play Billing Library الحالية على ملف build.gradle في تطبيقك.

dependencies {
    def billingVersion = "6.0.0"

    implementation "com.android.billingclient:billing:$billingVersion"
}

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

تهيئة عميل الفوترة وإنشاء اتصال بـ Google Play

لا تزال الخطوات الأولى لبدء عمليات الشراء من تطبيق Android كما هي:

عرض المنتجات المتاحة للشراء

للحصول على جميع العروض التي يكون المستخدم مؤهلاً لشرائها، يجب اتّباع الخطوات التالية:

  • استبدال SkuDetailsParams بـ QueryProductDetailsParams
  • تبديل المكالمة BillingClient.querySkuDetailsAsync() لاستخدام BillingClient.queryProductDetailsAsync()

يُرجى العلم أنّ نتائج طلب البحث أصبحت الآن ProductDetails بدلاً من SkuDetails. تحتوي كل سلعة ProductDetails على معلومات حول المنتج (المعرّف والعنوان والنوع وما إلى ذلك). بالنسبة إلى المنتجات المتوفّرة عند الاشتراك، تحتوي السمة ProductDetails على List<ProductDetails.SubscriptionOfferDetails>، وهي قائمة بتفاصيل عروض الاشتراك. بالنسبة إلى المنتجات التي يتم شراؤها مرة واحدة، يحتوي السمة ProductDetails على ProductDetails.OneTimePurchaseOfferDetails. ويمكن استخدام هذه المعلومات لتحديد العروض التي ستظهر للمستخدمين.

يوضح المثال التالي الشكل الذي قد يبدو عليه تطبيقك قبل إجراء هذه التغييرات وبعدها:

قبل

Kotlin

val skuList = ArrayList<String>()

skuList.add("up_basic_sub")

val params = SkuDetailsParams.newBuilder()

params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS).build()

billingClient.querySkuDetailsAsync(params) {
    billingResult,
    skuDetailsList ->
    // Process the result
}

Java

List<String> skuList = new ArrayList<>();

skuList.add("up_basic_sub");

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();

params.setSkusList(skuList).setType(SkuType.SUBS).build();

billingClient.querySkuDetailsAsync(params,
    new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(BillingResult billingResult,
                List<SkuDetails> skuDetailsList) {
            // Process the result.
        }
    }
);

بعد

Kotlin

val productList =
    listOf(
        QueryProductDetailsParams.Product.newBuilder()
            .setProductId("up_basic_sub")
            .setProductType(BillingClient.ProductType.SUBS)
            .build()
    )

val params = QueryProductDetailsParams.newBuilder().setProductList(productList).build()

billingClient.queryProductDetailsAsync(params) {
    billingResult,
    productDetailsList ->
    // Process the result
}

Java

ImmutableList<Product> productList = ImmutableList.of(Product.newBuilder()
                                            .setProductId("up_basic_sub")
                                            .setProductType(ProductType.SUBS)
                                            .build());

QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder()
    .setProductList(productList)
    .build();

billingClient.queryProductDetailsAsync(
        params,
        new ProductDetailsResponseListener() {
                public void onProductDetailsResponse(BillingResult billingResult, List<ProductDetails> productDetailsList) {
                    // Process the result
                }
        }
);

تعرض عملية معاودة الاتصال بـ "queryProductDetailsAsync" رسالة List<ProductDetails>. تحتوي كل سلعة ProductDetails على معلومات حول المنتج (المعرّف والعنوان والنوع وما إلى ذلك). الفرق الرئيسي هو أنّ المنتجات المتوفّرة عند الاشتراك تحتوي الآن أيضًا على List<ProductDetails.SubscriptionOfferDetails> التي تتضمّن جميع العروض المتاحة للمستخدمين.

وبما أنّ الإصدارات السابقة من Play Billing Library لا تتيح العناصر الجديدة (الاشتراكات والخطط الأساسية والعروض وما إلى ذلك)، يحوّل النظام الجديد كل رمز تخزين تعريفي للاشتراك إلى خطة أساسية واحدة وعرض متوافق مع الإصدارات السابقة. يتم أيضًا نقل منتجات الشراء لمرة واحدة المتاحة إلى عنصر ProductDetails. يمكن الوصول إلى تفاصيل العرض لمنتج شراء لمرة واحدة باستخدام طريقة getOneTimePurchaseOfferDetails().

نادرًا ما لا تتوافق بعض الأجهزة مع ProductDetails وqueryProductDetailsAsync()، ويكون ذلك عادةً بسبب إصدارات قديمة من خدمات Google Play. لضمان تقديم الدعم المناسب لهذا السيناريو، يُرجى الاتصال على الرقم isFeatureSupported() للميزة في PRODUCT_DETAILS قبل طلب الرقم queryProductDetailsAsync. إذا كان الردّ OK، يعني هذا أنّ الجهاز يتيح هذه الميزة ويمكنك مواصلة الاتصال بالرقم queryProductDetailsAsync(). إذا كان الردّ FEATURE_NOT_SUPPORTED، يمكنك بدلاً من ذلك طلب قائمة المنتجات المتاحة المتوافقة مع الأنظمة القديمة من خلال querySkuDetailsAsync(). لمعرفة المزيد من المعلومات حول كيفية استخدام ميزات التوافق مع الأنظمة القديمة، يمكنك الاطّلاع على دليل ميزات الاشتراك لشهر أيار (مايو) 2022.

إطلاق مسار شراء العرض

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

  • بدلاً من استخدام SkuDetails للسمة BillingFlowParams، استخدِم ProductDetailsParams.
  • يمكن الحصول على تفاصيل العروض، مثل معرّف العرض الترويجي ورقم تعريف الخطة الأساسية وغيرها باستخدام عنصر SubscriptionOfferDetails.

لشراء منتج باستخدام العرض الذي اختاره المستخدم، يجب الحصول على offerToken من العرض المحدّد وإدخاله في العنصر ProductDetailsParams.

بعد إنشاء عنصر BillingFlowParams، يبقى مسار الفوترة باستخدام BillingClient كما هو.

يوضح المثال التالي الشكل الذي قد يبدو عليه تطبيقك قبل إجراء هذه التغييرات وبعدها:

قبل

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
val billingFlowParams = BillingFlowParams.newBuilder()
                            .setSkuDetails(skuDetails)
                            .build()

val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
        .setSkuDetails(skuDetails)
        .build();

BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

بعد

Kotlin

// An activity reference from which the billing flow will be launched.
val activity : Activity = ...;

val productDetailsParamsList = listOf(
    BillingFlowParams.ProductDetailsParams.newBuilder()
        // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
        .setProductDetails(productDetails)
        // For One-time product, "setOfferToken" method shouldn't be called.
        // For subscriptions, to get the offer token corresponding to the selected
        // offer call productDetails.subscriptionOfferDetails?.get(selectedOfferIndex)?.offerToken
        .setOfferToken(selectedOfferToken)
        .build()
)

val billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build()

// Launch the billing flow
val billingResult = billingClient.launchBillingFlow(activity, billingFlowParams)

Java

// An activity reference from which the billing flow will be launched.
Activity activity = ...;

ImmutableList<ProductDetailsParams> productDetailsParamsList =
    ImmutableList.of(
        ProductDetailsParams.newBuilder()
             // retrieve a value for "productDetails" by calling queryProductDetailsAsync()
            .setProductDetails(productDetails)
            // For one-time products, "setOfferToken" method shouldn't be called.
            // For subscriptions, to get the offer token corresponding to the selected
            // offer call productDetails.getSubscriptionOfferDetails().get(selectedOfferIndex).getOfferToken()
            .setOfferToken(selectedOfferToken)
            .build()
    );

BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
    .setProductDetailsParamsList(productDetailsParamsList)
    .build();

// Launch the billing flow
BillingResult billingResult = billingClient.launchBillingFlow(activity, billingFlowParams);

معالجة عمليات الشراء

تظلّ معالجة عمليات الشراء باستخدام الإصدار 6 من Google Play Billing Library مشابهة للإصدارات السابقة.

لسحب جميع عمليات الشراء النشطة التي يملكها المستخدم وطلب البحث عن عمليات الشراء الجديدة، اتّبِع الخطوات التالية:

  • بدلاً من تمرير القيمة BillingClient.SkuType إلى queryPurchasesAsync()، مرِّر عنصر QueryPurchasesParams يحتوي على القيمة BillingClient.ProductType.

يوضح المثال التالي الشكل الذي قد يبدو عليه تطبيقك قبل إجراء هذه التغييرات وبعدها:

قبل

Kotlin

billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS) {
    billingResult,
    purchaseList -> {
        // Process the result
    }
}

Java


billingClient.queryPurchasesAsync(
    BillingClient.SkuType.SUBS,
    new PurchasesResponseListener() {
        public void onQueryPurchasesResponse(
                BillingResult billingResult,
                List<Purchase> purchases) {
            // process the result
        }
    }
);

بعد

Kotlin

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder()
        .setProductType(BillingClient.ProductType.SUBS)
        .build()
) { billingResult, purchaseList ->
    // Process the result
}

Java

billingClient.queryPurchasesAsync(
    QueryPurchasesParams.newBuilder().setProductType(ProductType.SUBS).build(),
    new PurchasesResponseListener() {
        public void onQueryPurchasesResponse(
                BillingResult billingResult,
                List<Purchase> purchases) {
            // Process the result
        }
    }
);

لم تتغيّر خطوات إدارة عمليات الشراء خارج التطبيق والمعاملات المعلّقة.

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

في الخلفية، عليك نقل مكوِّن إدارة حالة شراء الاشتراكات في الخلفية للتعامل مع عمليات شراء المنتجات الجديدة التي تم إنشاؤها في الخطوات السابقة. من المفترض أن يعمل مكوّن إدارة حالة شراء الاشتراكات الحالي كالمعتاد مع منتجات الاشتراكات التي تم تحويلها التي حدّدتها قبل الإطلاق في أيار (مايو) 2022، ويكفي إدارة عمليات شراء العروض المتوافقة مع الأنظمة القديمة، إلا أنّه لا يتوافق مع أي من الوظائف الجديدة.

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

يمكنك عادةً الاتصال بـ واجهة برمجة تطبيقات عمليات شراء الاشتراكات في كل مرة تتلقّى SubscriptionNotification إشعار في الوقت الفعلي خاصة بالمطوّر لعرض أحدث المعلومات حول حالة الاشتراك. وعليك استبدال طلباتك المرسَلة إلى purchases.subscriptions.get بالإصدار الجديد من واجهة برمجة التطبيقات Subscription Purchases API purchases.subscriptionsv2.get. يتوفّر مرجع جديد يُسمى SubscriptionPurchaseV2 يوفّر معلومات كافية لإدارة استحقاقات الشراء للاشتراكات في النموذج الجديد.

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

تغيير عمليات شراء اشتراكات المستخدم

في الإصدار 5 من Play Billing Library أو إصدار أقدم، تم استخدام ProrationMode لتطبيق التغييرات على عمليات شراء الاشتراكات التي يجريها المستخدمون، مثل عمليات الترقية أو الاشتراك في خطة أقلّ كلفة. تم إيقاف هذا الإجراء نهائيًا واستبداله بـ ReplacementMode في الإصدار 6.

التعامل مع تغييرات أسعار الاشتراكات

في الإصدار 6 من Play Billing Library، تمت إزالة واجهة برمجة تطبيقات launchPriceConfirmationFlow المتوقّفة نهائيًا في السابق. للاطّلاع على البدائل، يمكنك الاطّلاع على دليل تغييرات الأسعار.

معالجة أخطاء Play Billing Library

في الإصدار 6 من Play Billing Library، تمت إضافة رمز NETWORK_ERROR جديد للإشارة إلى المشاكل في الاتصال بالشبكة بين جهاز المستخدم ونظام Google Play. كانت هناك أيضًا تغييرات على الرمزين SERVICE_TIMEOUT وSERVICE_UNAVAILABLE. لمزيد من المعلومات، يُرجى الاطّلاع على التعامل مع رموز استجابة BillingResult.

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

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