Подписка с дополнениями позволяет вам объединять несколько подписных продуктов вместе, которые можно приобретать, выставлять счета и управлять ими вместе. Ваши существующие подписки на каталог продуктов могут быть легко предложены как дополнения без какой-либо предварительной спецификации или дополнительной конфигурации. Вы можете запустить поток покупок с несколькими существующими подписными продуктами и продавать их как дополнения.
Соображения
При использовании функции подписки с дополнениями учитывайте следующие моменты:
Подписка с дополнениями поддерживается только для базовых планов с автоматическим продлением.
Все товары в покупке должны иметь одинаковый повторяющийся период выставления счетов. Например, вы не можете иметь подписку с ежегодной оплатой и ежемесячно оплачиваемые дополнения.
В подписке с покупкой дополнений можно иметь максимум 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
с токеном покупки текущей подписки. - Для обновления, понижения или кросс-обмена базового элемента вызовите
setSubscriptionReplacementMode
чтобы указать, как следует обрабатывать смену плана между базовыми элементами старого и новой покупкой подписки с дополнениями. В противном случае нет необходимости устанавливать этот параметр. - Если базовый элемент не изменен, вы все равно можете вызвать
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);
Сценарии изменения подписки
В следующей таблице перечислены различные сценарии модификации подписки с дополнениями и соответствующее поведение.
Существующие элементы | Измененные элементы | Нужно ли устанавливать режим замены? | Поведение |
---|---|---|---|
А (базовый элемент), Б | А (базовый элемент) | Нет | Пункт B подлежит отложенному вывозу. |
А | А (базовый элемент), Б | Нет | Пункт B добавляется немедленно с пропорциональной оплатой. |
А (базовый элемент), Б | А (базовый элемент), С | Нет |
|
А (базовый элемент), Б | B (базовый элемент) | Нет | А запланировано отсроченное удаление. |
А (базовый элемент), Б | C (базовый элемент) | Да |
|
А (базовый элемент), Б | C (базовый элемент), B | Да | Замена A -> C зависит от setSubscriptionReplacementMode . |
А (базовый элемент), Б | C (базовый элемент), D | Да |
|
Уведомления разработчиков в режиме реального времени
Поле subscriptionId
не предусмотрено в RTDN для покупок подписки с дополнениями, которые содержат несколько прав на элементы. Вместо этого вы можете использовать API разработчика Play, чтобы получить покупку и увидеть связанные права на элементы.
Изменение цен для существующих подписчиков
Изменение цен на подписку для существующих подписчиков подписки с покупкой дополнений аналогично изменению цен на подписки с одним элементом, как описано в разделе Изменение цен на подписку . Однако существуют некоторые ограничения и функциональные различия, описанные в этом разделе.
Положить конец устаревшей ценовой когорте
Завершение устаревшей когорты также влияет на подписку с дополнительными покупками. Применяются следующие правила:
Все невыполненные повышения цены подписки должны иметь то же время возобновления, что и новая цена. Если элемент в подписке с покупкой дополнений имеет повышение цены подписки, которое еще не подтверждено пользователем, любое новое повышение цены подписки для других элементов в покупке будет игнорироваться, если только оно не приведет к тому же времени возобновления применения новой цены, что и существующее повышение цены в состоянии OUTSTANDING . После того, как пользователь подтвердит повышение цены, любые новые изменения цены будут зарегистрированы. И пользователи могут принять все неподтвержденные повышения цены подписки только одновременно.
Пример:
- Рассмотрите вариант подписки с дополнениями (пункты A и B), которая продлевается 7-го числа каждого месяца.
- Цена на товар А постоянно меняется с 7 до 10 долларов, ожидается, что повышение вступит в силу 7 июля.
- Новый ценовой переход с 5 до 6 долларов начнется для товара B 2 июня. Поскольку повышение цены по желанию начнется через 37 дней после перехода, самое раннее повышение цены на товар B произойдет 7 августа.
В этом сценарии, пока пользователь не примет изменение цены на товар A (пока он не перейдет в состояние CONFIRMED ), изменение цены на товар 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
. productId
элемента, который должен быть отозван и возвращен, можно установить в поле ItemBasedRefund
.
Поле ItemBasedRefund
можно настроить для покупок с одним или несколькими автоматически продлеваемыми подписками.
- Если после отмены элемента, указанного в
ItemBasedRefund
, в подписке остались активные товары, будет отозван только этот товар и полностью возмещена сумма без прерывания статуса подписки. - Если после отмены элемента, указанного в
ItemBasedRefund
, в подписке не осталось активных элементов, элемент отменяется, производится полный возврат средств, а подписка отменяется.
Соображения
- При использовании
ItemBasedRefund
за раз можно отозвать только один товар. Запрос можно вызывать несколько раз, если нужно отозвать разные товары. - Если покупка подписки находится в любом из состояний «платеж отклонен» или товар, указанный в
ItemBasedRefund
, не принадлежит владельцу или срок его действия истек, отказ от товара блокируется. - Отказ от товара не поддерживается в предоплаченной подписке.
Истечение срока действия товара при отклонении платежа
При покупке подписки с дополнениями некоторые продления могут потребовать продления только подмножества прав на товары, не затрагивая товары с истекающим сроком действия.
Независимо от того, какие элементы задействованы в продлении, если платеж за продление отклонен, для всей покупки подписки начнется льготный период и будет приостановлена учетная запись, как описано в следующей документации.
Выбор периода восстановления
Поскольку льготный период сам по себе по-прежнему предоставляет пользователю право, при покупке подписки с дополнениями платеж за продление отклоняется, выбирается элемент с минимальным льготным периодом по всем активным элементам, а его льготный период и период удержания учетной записи в качестве периода восстановления применяются к данному продлению.
Активные элементы включают элементы, которые были активны при покупке подписки с дополнениями непосредственно перед попыткой продления, исключая любые недавно добавленные элементы (которые не будут доступны до восстановления), а также исключая любые элементы, которые больше не активны из-за удаления или отказа.
Применяется настройка удержания счета элемента с минимальным выбранным льготным периодом. Если есть несколько элементов с минимальным льготным периодом, но разными периодами удержания счета, применяется самый длительный период удержания счета.
Льготный период
Если платеж за продление подписки отклонен, покупка подписки перейдет в состояние льготного периода. В течение льготного периода пользователь продолжит иметь доступ ко всем активным элементам из предыдущего периода продления. После льготного периода, если способ оплаты не был исправлен, вся покупка подписки будет заблокирована. Если в течение льготного периода наступит дата продления каких-либо других элементов, для этих элементов будет инициирована новая попытка оплаты, как только подписка восстановится после отклонения платежа.
Удержание счета
Пока покупка подписки находится на удержании на счете, доступ ко всем элементам подписки приостанавливается до тех пор, пока оплата не будет восстановлена.
Если подписка в удержании аккаунта восстановлена, покупка подписки продолжает существовать как есть. Если подписка не восстановлена, элементы в отклонении платежа истекают, а доступ к другим элементам будет возобновлен на оставшиеся периоды их выставления счетов.
Пример:
Пользователь имеет подписку My Base Plan, которая продлевается 1-го числа каждого месяца, а затем 15 августа добавляет $10 в месяц на Add on plan с семидневной бесплатной пробной версией. Ни для одного из товаров не установлен льготный период, и у обоих есть 30-дневный период удержания аккаунта.
22 августа с пользователя взимается плата в размере 2,90 долл. США (10*9/31) для пропорционального распределения до 31 августа, но срок действия способа оплаты пользователя истекает до этого момента, и 22 августа подписка отклоняется.
Когда подписка переходит в режим удержания аккаунта из-за отклонения платежа, пользователь не имеет доступа ни к одному из элементов подписки с дополнениями. Оставшееся время для элементов, которые не продлеваются, будет возвращено пользователям, когда подписка выйдет из режима удержания аккаунта, либо потому, что платеж был восстановлен, либо потому, что он был отменен.
В предыдущем примере подписка была заблокирована 22 августа.
Если аккаунт восстановлен 25 августа, до более широкой даты обновления 1 сентября, пользователь восстанавливает доступ как к My Base Plan , так и к Add on plan в тот же день. Следующая дата выставления счета изменяется на 4 сентября.
Если учетная запись не будет восстановлена в течение 30 дней, подписка будет отменена 21 сентября, и пользователь потеряет доступ к дополнительному плану и возобновит доступ к моему базовому плану до 30 сентября.
В этом примере необходимо получить обновленное expiryTime
для ВСЕХ элементов в подписке с дополнениями, поскольку некоторые элементы могут возобновить свое действие после льготного периода и блокировки учетной записи.
Финансовая отчетность и сверка
Используйте отчет о доходах для сверки ваших активных подписок с транзакциями в Play. Каждая позиция строки транзакции имеет идентификатор заказа. При покупках, представляющих несколько позиций, отчеты о доходах и предполагаемых продажах будут включать отдельные строки для каждой транзакции, такие как сбор, комиссия, налог и возврат, для каждой вовлеченной позиции.
Для панелей управления в Play Console:
Статистика доходов, представленная в разделе «Финансовая отчетность» консоли, разбита по статьям.
Управление заказами отражает покупку подписки с дополнениями и показывает подробные списки того, что было куплено. Из управления заказами вы можете отозвать, отменить или полностью вернуть покупку пользователя.