Подписка с дополнениями позволяет объединить несколько продуктов по подписке, которые можно приобретать, оплачивать и управлять ими одновременно. Ваши существующие подписки на каталог товаров можно легко предлагать как дополнения без каких-либо предварительных спецификаций или дополнительных настроек. Вы можете запустить процесс покупки с несколькими существующими продуктами по подписке и продавать их как дополнения.
Соображения
При использовании функции подписки с дополнениями учитывайте следующие моменты:
Подписка с дополнениями поддерживается только для базовых планов с автоматическим продлением.
Все товары в покупке должны иметь одинаковый период оплаты. Например, нельзя оформить подписку с годовой оплатой и ежемесячной оплатой дополнительных услуг.
В подписку с покупкой дополнений можно включить не более 50 товаров.
Эта функция недоступна в регионах Индия ( IN ) и Южная Корея ( KR ).
Интеграция с библиотекой Play Billing
В этом разделе описывается, как интегрировать функцию подписки с дополнениями с библиотекой Play Billing Library (PBL). Предполагается, что вы знакомы с начальными этапами интеграции PBL, такими как добавление зависимости PBL в ваше приложение , инициализация BillingClient и подключение к Google Play . В этом разделе рассматриваются аспекты интеграции PBL, характерные для подписки с дополнениями.
Запустить процесс покупки
Чтобы запустить процесс покупки подписки с дополнениями, выполните следующие действия:
Получите все элементы подписки с помощью метода
BillingClient.queryProductDetailsAsync.Установите объект
ProductDetailsParamsдля каждого элемента.Элемент, представленный объектом
ProductDetailsParams, определяет какProductDetailsуказывающий элемент подписки, так иofferTokenвыбирающий конкретныйbase planподписки илиoffer.Укажите сведения о товаре в методе
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);
Правила, применимые к товарам в закупке
- Чтобы даты продления дополнительных подписок в конечном итоге совпадали с датами продления базовой подписки, Google Play может взимать пропорциональную плату после любого пробного периода или этапа введения начальной цены.
- Соответствие предложения требованиям будет оцениваться отдельно для каждого товара.
Процесс покупки
Обработка подписки с дополнениями аналогична обработке покупок отдельных товаров, описанной в разделе Интеграция библиотеки Google Play Billing Library в ваше приложение . Единственное отличие заключается в том, что пользователь может получить несколько прав за одну покупку. Покупка подписки с дополнениями возвращает несколько товаров, которые можно получить с помощью метода Purchase.getProducts() в библиотеке Google Play Billing Library, а затем списка lineItems в методе purchases.subscriptionsv2.get API разработчика Google Play .
Изменение подписок с помощью дополнений
Любые изменения в вашей подписке с помощью дополнений приведут к повышению или понижению уровня подписки. Подробнее см. в разделе «Повышение или понижение уровня подписки» .
Чтобы изменить или восстановить существующую покупку подписки с дополнениями в вашем приложении, необходимо вызвать API launchBillingFlow с дополнительными параметрами и убедиться в следующем:
- Всегда вызывайте
setOldPurchaseTokenс токеном покупки текущей подписки. - Чтобы повысить, понизить или перенести товар на другую категорию, вызовите
SubscriptionProductReplacementParams.setReplacementModeчтобы указать, как следует обрабатывать смену тарифного плана между старым и новым товаром. В противном случае настраивать этот параметр не нужно. - Если базовый элемент не изменился, вы всё равно можете вызвать
SubscriptionProductReplacementParams.setSubscriptionReplacementMode, чтобы применить определённое поведение замены. Правила, применимые в этом случае, см. в разделе Повторная подписка или переключение планов в пределах одной подписки . - Новые дополнения будут применяться немедленно с пропорциональной оплатой, чтобы совместить дату следующего продления с базовым элементом подписки.
- Срок действия удаленных дополнений истечет по окончании текущего расчетного периода.
- При запуске процесса выставления счетов вам необходимо указать все активные элементы подписки с дополнениями, за исключением тех, которые будут удалены, а также любые новые дополнения.
В следующем примере показано, как вызвать 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 ) |
|
| А | А (базовый элемент), Б | Да (используйте KEEP_EXISTING для A) |
|
| А (базовый элемент), Б | А (базовый элемент), С | Да (используйте KEEP_EXISTING для A) |
|
| А (базовый элемент), Б | B (базовый элемент) | Нет | А запланировано отсроченное выдворение. |
| А (базовый элемент), Б | C (базовый элемент) | Да |
|
| А (базовый элемент), Б | C (базовый элемент), B | Да |
|
| А (базовый элемент), Б | C (базовый элемент), D | Да |
|
| А (базовый элемент), Б | А (базовый элемент), С | Да |
|
| A (базовый элемент), B, C | D (базовый элемент), B, C | Да |
|
При использовании SubscriptionUpdateParams
| Существующие элементы | Измененные элементы | Нужно ли вам указывать информацию о замене? | Поведение |
|---|---|---|---|
| А (базовый элемент), Б | А (базовый элемент) | Нет |
|
| А | А (базовый элемент), Б | Нет |
|
| А (базовый элемент), Б | А (базовый элемент), С | Нет |
|
| А (базовый элемент), Б | B (базовый элемент) | Нет | А запланировано отсроченное выдворение. |
| А (базовый элемент), Б | C (базовый элемент) | Да |
|
| А (базовый элемент), Б | C (базовый элемент), B | Да | Замена A -> C зависит от setSubscriptionReplacementMode (устарело в PBL 8.1). |
| А (базовый элемент), Б | C (базовый элемент), D | Да |
|
Уведомления разработчиков в режиме реального времени
Поле subscriptionId не предусмотрено в RTDN для покупок подписок с дополнениями, которые содержат права на несколько предметов. Вместо этого вы можете использовать API разработчика Play, чтобы получить покупку и просмотреть связанные с ней права на предметы.
Изменение цен для существующих подписчиков
Изменение цен на подписку для существующих подписчиков с покупкой дополнений аналогично изменению цен на отдельные товары, описанному в разделе «Изменение цен на подписку» . Однако существуют некоторые ограничения и функциональные различия, описанные в этом разделе.
Завершить устаревшую ценовую когорту
Завершение прежней когорты также влияет на подписку с дополнительными покупками. Действуют следующие правила:
Все неподтверждённые повышения цены должны иметь тот же срок действия, что и новая цена. Если для товара в подписке с покупками дополнений предусмотрено повышение цены по подписке, которое ещё не подтверждено пользователем, любое новое повышение цены по подписке для других товаров в этой покупке будет игнорироваться, если только оно не приведёт к тому же сроку действия применения новой цены, что и существующее повышение цены в состоянии OUTSTANDING . После подтверждения повышения цены пользователем любые последующие изменения цены будут зарегистрированы. При этом пользователи могут принять все неподтверждённые повышения цены по подписке только одновременно.
Пример:
- Рассмотрите вариант подписки с дополнениями (пункты A и B), которая продлевается 7-го числа каждого месяца.
- Цена на товар А в настоящее время меняется с 7 до 10 долларов, и ожидается, что повышение цены вступит в силу 7 июля.
- Новый переход цены с 5 до 6 долларов начнется для товара B 2 июня. Поскольку добровольное повышение цены начнется через 37 дней после перехода, самое раннее повышение цены на товар B произойдет 7 августа.
В этом сценарии, пока пользователь не примет изменение цены на товар A (пока он не перейдет в состояние «ПОДТВЕРЖДЕНО» ), изменение цены на товар B не будет зарегистрировано для этой покупки по подписке, и SubscriptionPurchaseV2 не возвращает сведения об изменении цены на товар B. После того как пользователь подтвердит изменение цены на товар A, начнется изменение цены на товар B. Пользователь получит повышение цены на товар B по подписке только после того, как примет повышение цены на товар A.
В электронном письме от Google Play содержится список всех товаров, цены на которые повышаются или понижаются в один и тот же день.
Отменить подписку с дополнениями
Пользователи могут отменить всю покупку подписки с дополнениями в Центре подписок Play, а отменить всю покупку подписки с дополнениями можно только с помощью API разработчика Google Play.
Если покупка подписки отменяется без отзыва, ни один из товаров в покупке не будет автоматически продлен, но пользователь сохранит доступ к имеющимся товарам до окончания соответствующих расчетных периодов.
Отмена и возврат подписок с дополнениями
Ниже приведены некоторые правила отмены и возврата средств за подписку:
Используйте Play Console для возврата средств за определенный заказ, не отзывая доступ к подписке.
Вызовите
orders.refund, чтобы полностью вернуть определенные платежи по подписке, которые пользователь совершил, не отзывая при этом доступ к подписке.Вызовите
purchases.subscriptionsv2.revoke, чтобы немедленно отозвать доступ ко всем подпискам. С помощью этого API вы можете:Отозвать доступ ко всем товарам и предоставить пропорциональный возврат средств.
При отмене подписки с дополнениями с использованием пропорционального возврата средств возврат будет произведен за последний заказ каждого товара с пропорциональной суммой, исходя из времени, оставшегося до следующего продления.
Отозвать доступ ко всем товарам и предоставить полный возврат средств .
Отозвать доступ к отдельному товару с полным возвратом средств за товар.
Отменить отдельный элемент в подписке с дополнениями
Чтобы отозвать отдельные товары в подписке с дополнениями, не отменяя всю покупку, вызовите purchases.subscriptionsv2.revoke , указав поле ItemBasedRefund в RevocationContext . В поле ItemBasedRefund можно указать productId товара, который необходимо отозвать и вернуть.
Поле ItemBasedRefund можно настроить для покупок с одним или несколькими товарами с автоматическим продлением подписки.
- Если после отмены товара, указанного в
ItemBasedRefund, в подписке остались еще активные товары, то будет отозван только этот товар, и средства за него будут полностью возвращены без прерывания статуса подписки. - Если после отзыва товара, указанного в
ItemBasedRefund, в подписке не осталось активных товаров, товар отзывается, производится полный возврат средств, а подписка отменяется.
Соображения
- При использовании
ItemBasedRefundможно отозвать только один товар за раз. Запрос можно вызывать несколько раз, если требуется отозвать разные товары. - Если покупка подписки находится в одном из состояний «платеж отклонен» или товар, указанный в
ItemBasedRefundне принадлежит владельцу или срок его действия истек, отказ от товара блокируется. - Отказ от товара не поддерживается в предоплаченной подписке.
Истечение срока действия товара при отклонении платежа
При покупке подписки с дополнениями некоторые продления могут потребовать продления только подмножества прав на товары, не затрагивая товары с истекающим сроком действия.
Независимо от того, какие элементы участвуют в продлении, если платеж за продление отклонен, для всей подписки будет введен льготный период и будет приостановлена учетная запись, как описано в следующей документации.
Выбор периода восстановления
Поскольку льготный период сам по себе по-прежнему предоставляет пользователю право, при покупке подписки с дополнениями платеж за продление отклоняется, выбирается товар с минимальным льготным периодом по всем активным товарам, а его льготный период и период удержания учетной записи в качестве периода восстановления применяются для данного продления.
Активные позиции включают позиции, которые были активны при покупке подписки с дополнениями непосредственно перед попыткой продления, исключая любые вновь добавленные позиции (которые не будут доступны до восстановления) и исключая любые позиции, которые больше не активны из-за удаления или отказа.
Применяется настройка блокировки аккаунта для выбранного товара с минимальным льготным периодом. Если у нескольких товаров минимальный льготный период, но разные периоды блокировки аккаунта, применяется самый длительный период блокировки аккаунта.
Льготный период
При отклонении платежа за продление подписки покупка подписки переходит в режим льготного периода. В течение льготного периода пользователь сохраняет доступ ко всем активным товарам из предыдущего периода продления. По истечении льготного периода, если способ оплаты не был исправлен, вся покупка подписки блокируется. Если в течение льготного периода наступит дата продления каких-либо других товаров, для них будет предпринята новая попытка списания средств после восстановления подписки после отклонения платежа.
Удержание счета
Пока покупка подписки находится на удержании на счете, доступ ко всем элементам подписки приостанавливается до момента восстановления оплаты.
Если приостановленная подписка будет восстановлена, покупка подписки останется без изменений. Если подписка не будет восстановлена, товары, оплата которых была отклонена, будут аннулированы, а доступ к другим товарам будет возобновлен на оставшийся срок действия их расчётных периодов.
Пример:
У пользователя есть подписка на базовый план My Base Plan, которая продлевается 1-го числа каждого месяца, а затем 15 августа он добавляет дополнительный тарифный план стоимостью 10 долларов в месяц с семидневным бесплатным пробным периодом. Для обоих вариантов не установлен льготный период, и для обоих действует 30-дневный период блокировки аккаунта.
22 августа с пользователя будет списана сумма в размере 2,90 долл. США (10*9/31) с пропорциональной оплатой до 31 августа, но срок действия способа оплаты пользователя истекает до этого, и 22 августа подписка переходит в стадию отклонения платежа.
Когда подписка блокируется из-за отклонения платежа, пользователь не получает доступа ни к одному из товаров подписки с дополнениями. Оставшееся время для товаров, которые не продлеваются, будет возвращено пользователю после выхода из режима блокировки подписки, либо в связи с возвратом платежа, либо в связи с его отменой.
В предыдущем примере подписка переходит в режим удержания счета 22 августа.
Если учётная запись восстановлена 25 августа, до даты продления 1 сентября, пользователь снова получит доступ как к базовому плану , так и к тарифному плану «Добавить» в тот же день. Дата следующего выставления счёта переносится на 4 сентября.
Если учетная запись не будет восстановлена в течение 30 дней, подписка отменяется 21 сентября, и пользователь теряет доступ к дополнительному плану и возобновляет доступ к моему базовому плану до 30 сентября.
В этом примере необходимо получить обновленное expiryTime для ВСЕХ элементов в подписке с дополнениями, поскольку некоторые элементы могут возобновить свое действие после льготного периода и удержания учетной записи.
Финансовая отчетность и сверка
Используйте отчёт о доходах для сверки ваших активных подписок с транзакциями в Google Play. Каждая строка транзакции имеет идентификатор заказа. При покупках нескольких товаров отчёты о доходах и предполагаемых продажах будут включать отдельные строки для каждой транзакции, например, списание, комиссия, налог и возврат средств для каждого товара.
Для панелей управления в Play Console:
Статистика доходов, представленная в разделе «Финансовая отчетность» консоли, разбита по позициям.
Управление заказами отражает покупку подписки с дополнениями и показывает подробные списки приобретенных товаров. В разделе управления заказами вы можете отозвать, отменить или полностью вернуть средства за покупку пользователя.