الاشتراك مع الإضافات

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

الاعتبارات

يُرجى مراعاة النقاط التالية عند استخدام ميزة "الاشتراك مع الإضافات":

  • لا يتوفّر الاشتراك مع الإضافات إلا للخطط الأساسية القابلة للتجديد التلقائي.

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

  • يمكنك شراء 50 سلعة كحد أقصى في اشتراك مع شراء إضافات.

  • لا تتوفّر هذه الميزة في منطقتَي الهند (IN) وكوريا الجنوبية (KR).

الدمج مع Play Billing Library

يوضّح هذا القسم كيفية دمج الاشتراك مع ميزة "الإضافات" باستخدام "مكتبة الفوترة في Play" (PBL). يفترض هذا الدليل أنّك على دراية بخطوات الدمج الأولية لـ PBL، مثل إضافة التبعية لـ PBL إلى تطبيقك وإعداد BillingClient، والربط بخدمة Google Play. يركز هذا القسم على دمج ميزة "الاشتراكات مع الحِزم الإضافية"، ويتناول جوانب خاصة بها.

بدء مسار شراء

لبدء عملية شراء اشتراك يتضمّن إضافات، اتّبِع الخطوات التالية:

  1. يمكنك جلب جميع عناصر اشتراكك باستخدام الطريقة BillingClient.queryProductDetailsAsync.

  2. اضبط عنصر ProductDetailsParams لكل عنصر.

    يحدّد العنصر الذي يمثّله العنصر ProductDetailsParams كلاً من ProductDetails الذي يشير إلى عنصر الاشتراك، وofferToken الذي يحدّد اشتراكًا معيّنًا base plan أو offer.

  3. حدِّد تفاصيل السلعة في الطريقة BillingFlowParams.Builder.setProductDetailsParamsList. تحدّد فئة BillingFlowParams تفاصيل مسار الشراء.

    يوضّح المثال التالي كيفية بدء عملية الفوترة لعملية شراء اشتراك تتضمّن عناصر متعددة:

    Java

       BillingClient billingClient = ;
    
        // ProductDetails obtained from queryProductDetailsAsync().
        ProductDetailsParams productDetails1 = ...;
        ProductDetailsParams productDetails2 = ...;
        ArrayList productDetailsList = new ArrayList<>();
        productDetailsList.add(productDetails1);
        productDetailsList.add(productDetails2);
    
        BillingFlowParams billingFlowParams =
            BillingFlowParams.newBuilder()
               .setProductDetailsParamsList(productDetailsList)
               .build();
        billingClient.launchBillingFlow(billingFlowParams);

القواعد السارية على السلع المضمّنة في عملية الشراء

  • لضمان توافق تواريخ تجديد الإضافة مع تواريخ تجديد المنتج الأساسي، قد تُدرج Google Play رسومًا مُقسَّمة بعد أي مراحل من الفترات التجريبية أو الأسعار التمهيدية.
  • سيتم تقييم أهلية العرض بشكل منفصل لكل سلعة.

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

تتم معالجة الاشتراكات التي تتضمّن إضافات بالطريقة نفسها التي تتم بها معالجة عمليات شراء المنتجات الفردية كما هو موضّح في مقالة دمج Google Play Billing Library في تطبيقك. ويتمثل الاختلاف الوحيد في أنّه يمكن للمستخدم الحصول على عدة مزايا من خلال عملية شراء واحدة. تؤدي عملية شراء اشتراك مع الإضافات إلى عرض عناصر متعدّدة يمكن استرجاعها باستخدام Purchase.getProducts() في مكتبة الفوترة في Google Play، ثم قائمة lineItems في purchases.subscriptionsv2.get من Google Play Developer API.

تعديل الاشتراكات باستخدام الإضافات

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

لتغيير أو استعادة عملية شراء حالية لاشتراك يتضمّن إضافات في تطبيقك، عليك استدعاء واجهة برمجة التطبيقات launchBillingFlow باستخدام مَعلمات إضافية والتأكّد مما يلي:

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

يوضِّح العيّنة التالية كيفية طلب البيانات من واجهة برمجة التطبيقات launchBillingFlow عند تغيير عملية شراء حالية لاشتراك يتضمّن إضافات:

Java

BillingClient billingClient = ;

int replacementMode =;

// ProductDetails obtained from queryProductDetailsAsync().
ProductDetailsParams productDetails1 = ...;
ProductDetailsParams productDetails2 = ...;
ProductDetailsParams productDetails3 = ...;

ArrayList newProductDetailsList = new ArrayList<>();
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);
newProductDetailsList.add(productDetails1);

BillingFlowParams billingFlowParams =
    BillingFlowParams.newBuilder()
        .setSubscriptionUpdateParams(
          SubscriptionUpdateParams.newBuilder()
              .setOldPurchaseToken(purchaseTokenOfExistingSubscription)
              // No need to set if change does not affect the base item.
             .setSubscriptionReplacementMode(replacementMode)
             .build())
        .setProductDetailsParamsList(productDetailsList)
        .build();

billingClient.launchBillingFlow(billingFlowParams);

سيناريوهات تعديل الاشتراك

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

العناصر الحالية العناصر المعدَّلة هل تحتاج إلى ضبط وضع الاستبدال؟ السُلوك
أ (العنصر الأساسي)، ب أ (العنصر الأساسي) لا تم تحديد موعد لإزالة العنصر "ب" في المستقبل.
A أ (العنصر الأساسي)، ب لا تتم إضافة السلعة "ب" على الفور مع تحصيل رسوم مُقسَّمة على المدة المتبقية.
أ (العنصر الأساسي)، ب أ (العنصر الأساسي)، ج لا
  • تم تحديد موعد لإزالة المحتوى (ب) بعد فترة.
  • تتم إضافة "ج" على الفور مع تحصيل رسوم مُقسَّمة على المدة المتبقية.
أ (العنصر الأساسي)، ب ب (العنصر الأساسي) لا تم تحديد موعد لإزالة المحتوى (أ).
أ (العنصر الأساسي)، ب C (العنصر الأساسي) نعم
  • يعتمد الاستبدال من "أ" إلى "ج" على setSubscriptionReplacementMode.
  • تم تحديد موعد لإزالة المحتوى (ب) بعد فترة.
أ (العنصر الأساسي)، ب C (العنصر الأساسي)، B نعم يعتمد الاستبدال من A إلى C على setSubscriptionReplacementMode.
أ (العنصر الأساسي)، ب C (العنصر الأساسي)، D نعم
  • يعتمد الاستبدال من A إلى C على setSubscriptionReplacementMode.
  • تم تحديد موعد لإزالة المحتوى (ب) بعد فترة.
  • تتم إضافة "د" على الفور مع تحصيل رسوم مُقسَّمة على المدة المتبقية.

الإشعارات في الوقت الفعلي الخاصة بالمطوّرين

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

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

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

إنهاء مجموعة نموذجية قديمة للأسعار

يؤثّر إنهاء مجموعة نموذجية قديمة أيضًا في الاشتراكات التي تتضمّن عمليات شراء إضافية. تنطبق القواعد التالية:

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

    مثال:

    • لنفترض أنّ هناك اشتراكًا يتضمّن ميزات إضافية (العنصران "أ" و"ب")، ويجدّد في 7 من كل شهر.
    • يتم حاليًا نقل سعر السلعة "أ" من 7 دولار أمريكي إلى 10 دولار أمريكي، ومن المتوقّع أن يتم تطبيق الزيادة في السعر في 7 تموز (يوليو).
    • بدء عملية تغيير السعر من 5 ريال سعودي إلى 6 ريال سعودي للسلعة "ب" في 2 حزيران (يونيو) بما أنّ زيادة السعر التي تتطلّب الموافقة تبدأ بعد 37 يومًا من النقل، ستكون أقرب زيادة في سعر السلعة "ب" في 7 آب (أغسطس).

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

  • تتضمّن الرسالة الإلكترونية من Google Play قائمة بكل العناصر التي سيتم رفع أسعارها أو خفضها في اليوم نفسه.

إلغاء اشتراك يتضمّن إضافات

يمكن للمستخدمين إلغاء عملية شراء اشتراك مع الإضافات بالكامل في "مركز اشتراكات Play"، ولا يمكنك إلغاء عملية شراء اشتراك مع الإضافات بالكامل إلا باستخدام Google Play Developer API.

عند إلغاء شراء اشتراك بدون إبطاله، لن يتم تجديد أي مما يلي تلقائيًا: العناصر المضمّنة في عملية الشراء، ولكن سيظل بإمكان المستخدم الوصول إلى العناصر المؤهَّلة إلى أن تنتهي مدد الفوترة المقابلة.

إبطال الاشتراكات التي تتضمّن الإضافات وردّ الأموال المدفوعة مقابلها

في ما يلي بعض الإرشادات المتعلقة بإلغاء الاشتراكات وردّ الأموال المدفوعة مقابلها:

  • يمكنك استخدام Play Console لردّ الأموال المدفوعة مقابل طلب معيّن استنادًا إلى المبلغ المدفوع، بدون إلغاء إمكانية الوصول إلى الاشتراك.

  • يُرجى الاتصال برقم orders.refund لردّ الأموال المدفوعة بالكامل مقابل دفعات اشتراك معيّنة قد دفعها المستخدم بدون إلغاء إمكانية الوصول إلى الاشتراك.

  • يُرجى الاتصال على purchases.subscriptionsv2.revoke لإلغاء إذن الوصول فورًا إلى جميع عناصر الاشتراك. باستخدام واجهة برمجة التطبيقات هذه، يمكنك إجراء ما يلي:

    • إلغاء إمكانية الوصول إلى جميع العناصر وردّ الأموال على أساس تناسبي

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

    • يمكنك إلغاء إذن الوصول إلى جميع العناصر وتقديم FullRefund.

    • إلغاء إذن الوصول إلى منتج معيّن مع ردّ الأموال المدفوعة بالكامل مقابله

إبطال اشتراك فردي في اشتراك يتضمّن ميزات إضافية

لإلغاء عناصر اشتراك فردية في اشتراك يحتوي على إضافات بدون إلغاء عملية الشراء بالكامل، يمكنك الاتصال بـ purchases.subscriptionsv2.revoke مع ضبط الحقل ItemBasedRefund في RevocationContext. يمكن ضبط productId للعنصر الذي يجب إلغاءه وردّ قيمته في الحقل ItemBasedRefund.

يمكن ضبط الحقل ItemBasedRefund لعمليات الشراء التي تتضمّن عنصر اشتراك واحدًا أو أكثر يتم تجديده تلقائيًا.

  • إذا كانت هناك سلع نشطة لا تزال متوفّرة في عملية شراء الاشتراك بعد إلغاء السلعة المحدّدة في ItemBasedRefund، سيتم إلغاء السلعة فقط، وسيتم ردّ الأموال بالكامل بدون إيقاف حالة الاشتراك.
  • إذا لم يتبقّ أي عناصر نشطة في عملية شراء الاشتراك بعد إلغاء العنصر المحدّد في ItemBasedRefund، سيتم إلغاء العنصر وردّ الأموال بالكامل وإلغاء الاشتراك.

الاعتبارات

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

انتهاء صلاحية السلعة أثناء رفض الدفعة

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

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

اختيار فترة الاسترداد

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

تشمل العناصر النشطة العناصر التي كانت نشطة عند شراء اشتراك مع الإضافات قبل محاولة التجديد مباشرةً، وتستبعد أي عناصر تمت إضافتها حديثًا (التي لن تكون مؤهلة إلا بعد الاسترداد)، كما تستبعد أي عناصر لم تعُد نشطة بسبب الإزالة أو الإيقاف.

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

فترة السماح

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

تعليق الحساب

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

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

مثال:

  • اشترك مستخدم في خطتي الأساسية التي تتجدّد في 1 من كل شهر، ثم أضاف في 15 آب (أغسطس) خطة إضافية بقيمة 10 دولار أمريكي شهريًا مع فترة تجريبية مجانية لمدة سبعة أيام. لم يتم ضبط فترة السماح لأي من السلعتين، وتم تعليق حساب كلتا السلعتَين لمدة 30 يومًا.

  • في 22 آب (أغسطس)، يتم تحصيل رسوم من المستخدم بقيمة 2.90 دولار أمريكي (10*9/31) لتقسيم الرسوم على أساس تناسبي حتى 31 آب (أغسطس)، ولكن تنتهي صلاحية طريقة الدفع الخاصة بالمستخدم قبل ذلك التاريخ، ويصبح الاشتراك غير صالح للدفع في 22 آب (أغسطس).

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

في المثال السابق، يدخل اشتراك في فترة تعليق الحساب في 22 آب (أغسطس).

  • إذا تم استرداد الحساب في 25 آب (أغسطس)، قبل تاريخ التجديد الأوسع في 1 أيلول (سبتمبر)، يستعيد المستخدم إمكانية الوصول إلى كل من خطتي الأساسية والخطة الإضافية في اليوم نفسه. تم تغيير تاريخ الفوترة التالي إلى 4 أيلول (سبتمبر).

  • في حال عدم استرداد الحساب بعد 30 يومًا، سيتم إلغاء الاشتراك في 21 أيلول (سبتمبر) وسيفقد المستخدم إمكانية الوصول إلى الخطة الإضافية، وستتم استعادة إمكانية الوصول إلى خطتي الأساسية حتى 30 أيلول (سبتمبر).

في هذا المثال، يجب الحصول على expiryTime المعدَّل لجميع العناصر في الاشتراك الذي يتضمّن إضافات، لأنّ بعض العناصر قد تستأنف أهليتها بعد فترة السماح وتعليق الحساب.

إعداد التقارير المالية والتسويات

استخدِم تقرير الأرباح لمطابقة اشتراكاتك النشطة مع المعاملات على Play. يحتوي كل عنصر في سطر المعاملة على معرّف طلب. في حال كانت purchases تمثّل عدة سلع، ستتضمّن تقارير الأرباح والمبيعات المقدَّرة صفوفًا منفصلة لكل معاملة، مثل الرسوم والرسوم والضريبة وردّ الأموال لكل سلعة مضمّنة في المعاملة.

بالنسبة إلى لوحات البيانات في Play Console:

  • يتم تقسيم إحصاءات الأرباح المعروضة في قسم إعداد التقارير المالية ضمن وحدة التحكّم حسب العناصر.

  • تُظهر إدارة الطلبات عمليات شراء الاشتراكات مع الإضافات، وتعرض قوائم مفصّلة بما تم شراؤه. من صفحة إدارة الطلبات، يمكنك إلغاء عملية شراء المستخدم أو ردّ الأموال المدفوعة بالكامل أو إبطالها.