اشتراک با افزونهها به شما امکان میدهد چندین محصول اشتراکی را که میتوانند با هم خریداری، صورتحساب و مدیریت شوند، با هم ترکیب کنید. اشتراکهای کاتالوگ محصولات موجود شما میتوانند به صورت یکپارچه و بدون هیچ گونه مشخصات اولیه یا پیکربندی اضافی به عنوان افزونه ارائه شوند. میتوانید یک جریان خرید با چندین محصول اشتراکی موجود راهاندازی کنید و آنها را به عنوان افزونه بفروشید.
ملاحظات
هنگام استفاده از اشتراک با افزونهها، نکات زیر را در نظر بگیرید:
اشتراک با افزونهها فقط برای طرحهای پایه با قابلیت تمدید خودکار پشتیبانی میشود.
همه اقلام موجود در خرید باید دوره صورتحساب تکراری یکسانی داشته باشند. برای مثال، شما نمیتوانید اشتراکی با صورتحساب سالانه داشته باشید و افزونههایی با صورتحساب ماهانه.
شما میتوانید حداکثر ۵۰ مورد را در یک اشتراک با خرید افزونهها داشته باشید.
این ویژگی در مناطق هند ( IN ) و کره جنوبی ( KR ) در دسترس نیست.
ادغام با کتابخانه پرداخت Play
این بخش نحوه ادغام ویژگی اشتراک با افزونهها را با کتابخانه پرداخت Play (PBL) شرح میدهد. فرض بر این است که شما با مراحل اولیه ادغام PBL مانند افزودن وابستگی PBL به برنامه خود ، مقداردهی اولیه BillingClient و اتصال به Google Play آشنا هستید. این بخش بر جنبههای ادغام PBL که مختص اشتراک با افزونهها هستند، تمرکز دارد.
جریان خرید را راهاندازی کنید
برای راهاندازی جریان خرید برای اشتراک با افزونهها، مراحل زیر را انجام دهید:
با استفاده از متد
BillingClient.queryProductDetailsAsync، تمام اقلام اشتراک خود را دریافت کنید.برای هر آیتم، شیء
ProductDetailsParamsرا تنظیم کنید.آیتمی که توسط شیء
ProductDetailsParamsنمایش داده میشود، همProductDetailsرا که نشاندهندهی آیتم اشتراک است و همofferTokenکه یک طرح یاofferbase planاشتراک خاص را انتخاب میکند، مشخص میکند.جزئیات کالا را در متد
BillingFlowParams.Builder.setProductDetailsParamsListمشخص کنید. کلاسBillingFlowParamsجزئیات جریان خرید را مشخص میکند.نمونه زیر نحوه راهاندازی جریان صورتحساب برای خرید اشتراک با چندین مورد را نشان میدهد:
جاوا
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);
قوانین مربوط به اقلام موجود در خرید
- برای اطمینان از اینکه تاریخهای تمدید افزونه در نهایت با کالای پایه مطابقت دارند، گوگل پلی ممکن است پس از هر مرحله قیمتگذاری آزمایشی یا مقدماتی، هزینهای متناسب با آن را اعمال کند.
- واجد شرایط بودن پیشنهاد برای هر مورد به طور جداگانه ارزیابی خواهد شد.
خریدهای فرآیندی
پردازش اشتراک با افزونهها مشابه پردازش خریدهای تککالایی است که در بخش «ادغام کتابخانه صورتحساب گوگل پلی در برنامهتان» توضیح داده شده است. تنها تفاوت این است که کاربر میتواند چندین حق امتیاز را با یک خرید واحد دریافت کند. خرید اشتراک با افزونهها چندین کالا را برمیگرداند که میتوان آنها را با استفاده از Purchase.getProducts() در کتابخانه صورتحساب گوگل پلی و سپس لیست lineItems در purchases.subscriptionsv2.get از API توسعهدهنده گوگل پلی بازیابی کرد.
اشتراکها را با افزونهها تغییر دهید
هرگونه تغییر در اشتراک شما با افزونهها، منجر به ارتقاء یا تنزل رتبه میشود. برای اطلاعات بیشتر، به بخش ارتقاء یا تنزل رتبه اشتراکها مراجعه کنید.
برای تغییر یا بازیابی خرید اشتراک موجود با افزونهها در برنامه خود، باید API launchBillingFlow را با پارامترهای اضافی فراخوانی کنید و موارد زیر را رعایت کنید:
- همیشه تابع
setOldPurchaseTokenبا توکن خرید اشتراک فعلی فراخوانی کنید. - برای ارتقا، کاهش یا افزایش سطح یک کالا، تابع
SubscriptionProductReplacementParams.setReplacementModeفراخوانی کنید تا مشخص شود که تغییر طرح خرید بین کالای خرید قدیمی و جدید چگونه مدیریت شود. در غیر این صورت، نیازی به تنظیم این پارامتر نیست. - وقتی آیتم پایه تغییر نمیکند، همچنان میتوانید
SubscriptionProductReplacementParams.setSubscriptionReplacementModeرا برای اعمال یک رفتار جایگزینی خاص فراخوانی کنید. برای قوانین مربوطه در این مورد، به Resubscribe یا تغییر طرحها در همان اشتراک مراجعه کنید. - افزونههای جدید بلافاصله با هزینهای متناسب اعمال میشوند تا تاریخ تمدید بعدی با مورد پایه در اشتراک هماهنگ شود.
- افزونههای حذفشده در پایان دوره صورتحساب فعلی خود منقضی میشوند.
- هنگام راهاندازی جریان صورتحساب، باید تمام موارد فعال در اشتراک را به همراه افزونهها، به جز مواردی که باید حذف شوند، و همچنین هرگونه افزونه جدید، مشخص کنید.
نمونه زیر نحوه فراخوانی API launchBillingFlow را هنگام تغییر خرید اشتراک موجود با افزونهها نشان میدهد:
جاوا
BillingClient billingClient = …; int replacementMode =…; // ProductDetails obtained from queryProductDetailsAsync(). ProductDetailsParams productDetails1 = ...; ProductDetailsParams productDetails2 = ...; ProductDetailsParams productDetails3 = ...; ArrayListnewProductDetailsList = 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);
سناریوهای اصلاح اشتراک
جدول زیر سناریوهای مختلف اصلاح برای اشتراک با افزونهها و رفتار مربوطه را فهرست میکند.
هنگام استفاده از SubscriptionProductReplacementParams
| اقلام موجود | موارد اصلاحشده | آیا لازم است حالت جایگزینی را در SubscriptionProductReplacementParams تنظیم کنید؟ | رفتار |
|---|---|---|---|
| الف (مورد پایه)، ب | الف (مورد پایه) | بله (از KEEP_EXISTING استفاده کنید) |
|
| الف | الف (مورد پایه)، ب | بله (برای A KEEP_EXISTING استفاده کنید) |
|
| الف (مورد پایه)، ب | الف (مورد پایه)، ج | بله (برای A KEEP_EXISTING استفاده کنید) |
|
| الف (مورد پایه)، ب | ب (مورد پایه) | خیر | قرار است اخراج الف به تعویق بیفتد. |
| الف (مورد پایه)، ب | ج (مورد پایه) | بله |
|
| الف (مورد پایه)، ب | ج (مورد پایه)، ب | بله |
|
| الف (مورد پایه)، ب | ج (مورد پایه)، د | بله |
|
| الف (مورد پایه)، ب | الف (مورد پایه)، ج | بله |
|
| الف (مورد پایه)، ب، ج | د (مورد پایه)، ب، ج | بله |
|
هنگام استفاده از SubscriptionUpdateParams
| اقلام موجود | موارد اصلاحشده | آیا نیاز به تنظیم اطلاعات جایگزین دارید؟ | رفتار |
|---|---|---|---|
| الف (مورد پایه)، ب | الف (مورد پایه) | خیر |
|
| الف | الف (مورد پایه)، ب | خیر |
|
| الف (مورد پایه)، ب | الف (مورد پایه)، ج | خیر |
|
| الف (مورد پایه)، ب | ب (مورد پایه) | خیر | قرار است اخراج الف به تعویق بیفتد. |
| الف (مورد پایه)، ب | ج (مورد پایه) | بله |
|
| الف (مورد پایه)، ب | ج (مورد پایه)، ب | بله | جایگزینی برای A -> C به setSubscriptionReplacementMode بستگی دارد (در PBL 8.1 منسوخ شده است). |
| الف (مورد پایه)، ب | ج (مورد پایه)، د | بله |
|
اعلانهای توسعهدهنده در لحظه
فیلد subscriptionId در RTDN برای خریدهای اشتراکی با افزونهها که شامل چندین حق امتیاز کالا هستند، ارائه نشده است. در عوض، میتوانید از APIهای توسعهدهندگان Play برای دریافت خرید و مشاهده حق امتیازهای کالای مرتبط استفاده کنید.
تغییر قیمت برای مشترکین فعلی
تغییر قیمت اشتراک برای مشترکین فعلی اشتراکی که افزونهها را خریداری میکند، مشابه تغییر قیمت اشتراک اشتراکهای تکمحصولی است که در بخش «تغییر قیمت اشتراک» توضیح داده شده است. با این حال، برخی محدودیتها و تفاوتهای عملکردی وجود دارد که در این بخش توضیح داده شده است.
به یک گروه قیمتی قدیمی پایان دهید
پایان دادن به یک گروه قدیمی همچنین بر اشتراک با خریدهای افزونه تأثیر میگذارد. قوانین زیر اعمال میشود:
تمام افزایش قیمتهای ثبتشدهی برجسته باید زمان تمدید یکسانی با قیمت جدید داشته باشند. اگر یک کالا در اشتراک با خرید افزونهها، افزایش قیمت ثبتشدهای داشته باشد که هنوز توسط کاربر تأیید نشده باشد، هرگونه افزایش قیمت ثبتشدهی جدید برای سایر اقلام موجود در خرید نادیده گرفته میشود، مگر اینکه منجر به همان زمان تمدید درخواست قیمت جدید با افزایش قیمت موجود در حالت برجسته شود . پس از تأیید افزایش قیمت توسط کاربر، هرگونه تغییر قیمت جدیدتر ثبت خواهد شد. و کاربران فقط میتوانند تمام افزایش قیمتهای ثبتشدهی تأییدنشده را یکجا بپذیرند.
مثال:
- اشتراکی را در نظر بگیرید که شامل افزونهها (موارد الف و ب) است و هفتم هر ماه تمدید میشود.
- قیمت کالای A از ۷ دلار به ۱۰ دلار در حال افزایش است و انتظار میرود این افزایش قیمت از ۷ جولای اعمال شود.
- تغییر قیمت جدید از ۵ دلار به ۶ دلار، برای کالای B از ۲ ژوئن آغاز میشود. از آنجایی که افزایش قیمت انتخابی ۳۷ روز پس از تغییر قیمت آغاز میشود، زودترین زمان افزایش قیمت برای کالای B، ۷ آگوست خواهد بود.
در این سناریو، تا زمانی که کاربر تغییر قیمت کالای A را نپذیرد (تا زمانی که در حالت تأیید شده باشد)، تغییر قیمت کالای B برای این خرید اشتراکی ثبت نمیشود و SubscriptionPurchaseV2 جزئیات تغییر قیمت کالای B را برنمیگرداند. پس از اینکه کاربر تغییر قیمت کالای A را تأیید کرد، تغییر قیمت کالای B شروع میشود. کاربر تنها پس از پذیرش افزایش قیمت انتخابی کالای A، افزایش قیمت انتخابی کالای B را دریافت میکند.
ایمیل گوگل پلی حاوی فهرستی از تمام اقلامی است که افزایش یا کاهش قیمت آنها از همان روز اعمال میشود.
لغو اشتراک با افزونهها
کاربران میتوانند کل خرید اشتراک دارای افزونهها را در مرکز اشتراک پلی لغو کنند و شما فقط میتوانید کل خرید اشتراک دارای افزونهها را با استفاده از رابط برنامهنویسی کاربردی توسعهدهندگان گوگل پلی لغو کنید.
وقتی خرید اشتراک بدون ابطال لغو میشود، هیچ یک از اقلام موجود در خرید به طور خودکار تمدید نمیشوند، اما کاربر تا پایان دورههای صورتحساب مربوطه، همچنان به اقلام دارای حق دسترسی خواهد داشت.
لغو و بازپرداخت اشتراکها با افزونهها
در ادامه به برخی از دستورالعملهای لغو اشتراک و بازپرداخت وجه اشاره شده است:
از کنسول Play برای صدور بازپرداخت مبتنی بر مبلغ برای یک سفارش خاص بدون لغو دسترسی به اشتراک استفاده کنید.
برای بازپرداخت کامل پرداختهای اشتراک خاص کاربر بدون لغو دسترسی به اشتراک، با
orders.refundتماس بگیرید.برای لغو فوری دسترسی به همه موارد اشتراک،
purchases.subscriptionsv2.revokeرا فراخوانی کنید. با این API، میتوانید:دسترسی به همه موارد را لغو کنید و مبلغ پرداختی را به صورت متناسب بازپرداخت کنید.
هنگام لغو اشتراک با افزونهها با استفاده از بازپرداختهای متناسب، مبلغ بازپرداخت برای آخرین سفارش هر کالا با مبلغ متناسب بر اساس زمان باقی مانده تا تمدید بعدی صادر میشود.
دسترسی به همه موارد را لغو کنید و یک بازپرداخت کامل ارائه دهید.
دسترسی به هر کالا را لغو کنید و مبلغ پرداختی را به طور کامل به آن کالا برگردانید.
لغو یک مورد خاص در یک اشتراک با افزونهها
برای لغو اقلام اشتراک تکی در یک اشتراک با افزونهها بدون لغو کل خرید، تابع purchases.subscriptionsv2.revoke را با فیلد ItemBasedRefund تنظیم شده در RevocationContext فراخوانی کنید. productId کالایی که باید لغو و وجه آن مسترد شود، میتواند در فیلد ItemBasedRefund تنظیم شود.
فیلد ItemBasedRefund را میتوان برای خریدهایی با یک یا چند مورد اشتراک با قابلیت تمدید خودکار تنظیم کرد.
- اگر پس از لغو کالای مشخص شده در
ItemBasedRefund، هنوز اقلام فعالی در خرید اشتراک باقی مانده باشد، فقط همان کالا لغو شده و بدون ایجاد اختلال در وضعیت اشتراک، وجه آن به طور کامل بازپرداخت میشود. - اگر پس از لغو کالای مشخص شده در
ItemBasedRefund، هیچ کالای فعالی در خرید اشتراک باقی نمانده باشد، کالا لغو، وجه آن به طور کامل بازپرداخت و اشتراک لغو میشود.
ملاحظات
- هنگام استفاده از
ItemBasedRefundفقط یک مورد میتواند در یک زمان لغو شود. در صورت نیاز به لغو موارد مختلف، میتوان درخواست را چندین بار فراخوانی کرد. - وقتی خرید اشتراک در هر یک از حالتهای رد پرداخت باشد، یا کالای مشخص شده در
ItemBasedRefundمتعلق به کسی نباشد یا منقضی شده باشد، رد کالا مسدود میشود. - رد کردن کالا در اشتراک پیشپرداخت پشتیبانی نمیشود.
انقضای کالا در طول کاهش پرداخت
برای خرید اشتراک به همراه افزونهها، تمدیدهای خاص ممکن است فقط نیاز به تمدید زیرمجموعهای از حق امتیاز اقلام داشته باشند، بدون اینکه روی اقلامی که تاریخ انقضای آنها در آینده است تأثیری داشته باشد.
صرف نظر از اینکه کدام موارد در تمدید دخیل هستند، اگر پرداخت تمدید رد شود، کل خرید اشتراک طبق توضیحات مستندات زیر وارد دوره تنفس و مسدود شدن حساب خواهد شد.
انتخاب دوره نقاهت
از آنجایی که خودِ دورهی مهلت همچنان به کاربر حق عضویت میدهد، پس از خرید اشتراک به همراه افزونهها، پرداخت تمدید لغو میشود، کالایی که حداقل دورهی مهلت را نسبت به تمام کالاهای فعال دارد انتخاب میشود و دورهی مهلت و مدت زمان نگهداری حساب آن به عنوان دورهی بازیابی برای این تمدید اعمال میشود.
اقلام فعال شامل اقلامی میشود که درست قبل از اقدام به تمدید، در خرید اشتراک با افزونهها فعال بودهاند، و شامل اقلام تازه اضافه شده (که تا پس از بازیابی واجد شرایط نخواهند بود) و اقلامی که به دلیل حذف یا عدم پذیرش دیگر فعال نیستند، نمیشود.
تنظیمات مربوط به مدت زمان نگهداری حساب برای کالایی که حداقل مدت زمان مجاز برای آن انتخاب شده است، اعمال میشود. اگر بیش از یک کالا با حداقل مدت زمان مجاز برای نگهداری حساب وجود داشته باشد، اما مدت زمان نگهداری حساب آنها متفاوت باشد، طولانیترین مدت زمان نگهداری حساب اعمال میشود.
دوره فیض
وقتی پرداخت تمدید اشتراک رد میشود، خرید اشتراک وارد حالت مهلت میشود. در طول دوره مهلت، کاربر همچنان به تمام اقلام فعال از دوره تمدید قبلی دسترسی خواهد داشت. پس از دوره مهلت، اگر روش پرداخت اصلاح نشده باشد، کل خرید اشتراک به حالت تعلیق در حساب میرود. اگر اقلام دیگری در طول دوره مهلت به تاریخ تمدید خود برسند، پس از بهبود اشتراک از کاهش پرداخت، تلاش برای شارژ جدید برای آن اقلام آغاز خواهد شد.
نگه داشتن حساب
در حالی که خرید اشتراک در حساب کاربری شما مسدود است، دسترسی به تمام موارد اشتراک تا زمان بازیابی وجه، به حالت تعلیق در میآید.
اگر اشتراک موجود در حساب بازیابی شود، خرید اشتراک به قوت خود باقی میماند. اگر اشتراک بازیابی نشود، اقلام موجود در لیست لغو پرداخت منقضی میشوند و دسترسی به سایر اقلام برای دوره صورتحساب باقیمانده از سر گرفته میشود.
مثال:
کاربر اشتراک طرح پایه من را دارد که اول هر ماه تمدید میشود، سپس در ۱۵ آگوست، ماهانه ۱۰ دلار به طرح اضافه با یک دوره آزمایشی هفت روزه رایگان اضافه میشود. هیچکدام از این موارد مهلت استفاده ندارند و هر دو دوره نگهداری حساب ۳۰ روزه دارند.
در ۲۲ آگوست، مبلغ ۲.۹۰ دلار (۱۰*۹/۳۱) از کاربر کسر میشود تا به ۳۱ آگوست برسد، اما روش پرداخت کاربر قبل از آن منقضی میشود و اشتراک در ۲۲ آگوست به مرحلهی کاهش پرداخت میرسد.
وقتی اشتراک به دلیل کاهش پرداخت، وارد حالت تعلیق حساب میشود، کاربر به هیچ یک از موارد موجود در اشتراک دارای افزونه دسترسی نخواهد داشت. زمان باقیمانده برای مواردی که تمدید نمیشوند، پس از خروج اشتراک از حالت تعلیق حساب، چه به دلیل بازیابی پرداخت و چه به دلیل لغو، به کاربران بازگردانده میشود.
در مثال قبلی، یک اشتراک در تاریخ ۲۲ آگوست وارد حساب کاربری میشود.
اگر حساب در ۲۵ آگوست، قبل از تاریخ تمدید گستردهتر در ۱ سپتامبر، بازیابی شود، کاربر در همان روز دوباره به هر دو طرح پایه من و طرح اضافه کردن دسترسی پیدا میکند. تاریخ صدور صورتحساب بعدی به ۴ سپتامبر تغییر میکند.
اگر حساب کاربری پس از 30 روز بازیابی نشود، اشتراک در 21 سپتامبر لغو میشود و کاربر دسترسی به طرح «افزودن به حساب» را از دست میدهد و دسترسی به طرح «پایه من» تا 30 سپتامبر از سر گرفته میشود.
در این مثال، شما باید expiryTime بهروزرسانیشده را برای همه اقلام موجود در اشتراک دارای افزونه دریافت کنید، زیرا برخی از اقلام ممکن است پس از دوره مهلت و توقف حساب، دوباره واجد شرایط دریافت شوند.
گزارشگری مالی و تطبیق
از گزارش درآمد برای تطبیق اشتراکهای فعال خود با تراکنشهای Play استفاده کنید. هر ردیف تراکنش دارای یک شناسه سفارش است. در خریدهایی که شامل چندین کالا هستند، گزارشهای درآمد و فروش تخمینی شامل ردیفهای جداگانهای برای هر تراکنش مانند هزینه، کارمزد، مالیات و بازپرداخت برای هر کالا خواهند بود.
برای داشبوردها در کنسول Play:
آمار درآمد ارائه شده در بخش گزارش مالی کنسول، بر اساس اقلام تفکیک شده است.
مدیریت سفارش، خرید اشتراک به همراه افزونهها را نشان میدهد و لیستهای دقیقی از آنچه خریداری شده است را نشان میدهد. از طریق مدیریت سفارش، میتوانید خرید کاربر را لغو، لغو یا به طور کامل وجه را بازپرداخت کنید.