Биллинговая система Google Play – это сервис, который позволяет продавать цифровые продукты и контент в вашем приложении Android. В выпуске от мая 2022 года мы изменили определение продуктов по подписке, и это влияет на то, как они продаются в приложении и управляются на вашем сервере. Если вы выполняете интеграцию с Google Play Billing впервые, вы можете начать интеграцию, прочитав статью «Подготовка» .
Если вы продавали подписки с помощью Google Play Billing до мая 2022 года, важно понимать, как внедрить новые функции, сохранив при этом существующие подписки.
Первое, что нужно знать, — это то, что все ваши существующие подписки, приложения и серверные интеграции работают так же, как и до выпуска в мае 2022 года . Вам не нужно вносить какие-либо немедленные изменения, и вы можете адаптировать эти новые функции со временем. Каждая основная версия библиотеки Google Play Billing поддерживается в течение двух лет после выпуска. Существующие интеграции с API разработчика Google Play продолжают работать в прежнем режиме.
Вот обзор обновлений за май 2022 г.:
- Новая консоль Google Play позволяет создавать подписки, базовые планы и предложения и управлять ими. Сюда входят как новые, так и перенесенные подписки.
- API разработчика Play содержит обновления для поддержки новых функций пользовательского интерфейса консоли Google Play в форме API. Примечательно, что появилась новая версия API для покупок подписки . Используйте этот API для проверки статуса подписки и управления покупками подписки.
- Новая версия 5 библиотеки платежей Play позволяет вашему приложению использовать все новые функции подписки. Когда вы будете готовы выполнить обновление до версии 5, следуйте инструкциям в руководстве по миграции .
Конфигурация подписок
Управление подписками через Google Play Console
С мая 2022 года вы заметите некоторые изменения в консоли Google Play.
Одна подписка теперь может иметь несколько базовых планов и предложений. Ранее созданные SKU подписки теперь отображаются в Play Console как новые объекты подписки, базового плана и предложения. Если вы еще этого не сделали, ознакомьтесь с описанием новых объектов, включая их функциональность и конфигурацию, в разделе «Недавние изменения в подписках в Play Console» . Все ваши существующие продукты по подписке появятся в консоли Google Play в этом новом формате. Каждый номер SKU теперь представлен объектом подписки, который содержит один базовый план и обратно совместимое предложение, если применимо.
Поскольку более старые версии интеграции предполагали, что каждая подписка будет включать одно предложение, представленное объектом SkuDetails
, каждая подписка может иметь один обратно совместимый базовый план или предложение. Базовый план или предложение с обратной совместимостью возвращается как часть SKU для приложений, использующих устаревший метод querySkuDetailsAsync()
. Дополнительные сведения о настройке предложений с обратной совместимостью и управлении ими см. в разделе Общие сведения о подписках. Когда ваше приложение использует только queryProductDetailsAsync()
и более старые версии вашего приложения все еще совершают покупки, вам больше не нужно использовать предложение с обратной совместимостью. .
Управление подписками через API публикации подписок
API разработчика Play содержит новые функции для покупки подписки. API inappproducts
для управления номерами SKU продолжает работать, как и раньше, включая обработку продуктов и подписок, приобретаемых единоразово, поэтому вам не нужно вносить какие-либо немедленные изменения для поддержания интеграции.
Однако важно отметить, что консоль Google Play использует только новые объекты подписки. Как только вы начнете редактировать свои подписки в консоли, API inappproducts
больше нельзя будет использовать для подписок .
Если вы использовали API публикации до мая 2022 года, во избежание каких-либо проблем все существующие подписки теперь отображаются в консоли Google Play только для чтения. Если вы попытаетесь внести изменения, вы можете получить предупреждение, объясняющее это ограничение. Перед дальнейшим редактированием подписок в консоли вам следует обновить интеграцию с серверной частью, чтобы использовать новые конечные точки публикации подписок. Новые конечные точки monetization.subscriptions
, monetization.subscriptions.baseplans
и monetization.subscriptions.offers
позволяют вам управлять всеми доступными базовыми планами и предложениями. В следующей таблице вы можете увидеть, как различные поля сущности InAppProduct
сопоставляются с новыми объектами в разделе monetization.subscriptions
:
InAppProduct | Подписка |
---|---|
packageName | packageName |
sku | productId |
status | basePlans[0].state |
prices | basePlans[0].regionalConfigs.price |
listings | списки |
defaultPrice | Нет эквивалентности |
subscriptionPeriod | basePlans[0].autoRenewingBasePlanType.billingPeriodDuration |
trialPeriod | basePlans[0].offers[0].phase[0].regionalConfigs[0].free |
gracePeriod | basePlans[0].autoRenewingBasePlanType.gracePeriodDuration |
subscriptionTaxesAndComplianceSettings | настройки налога и соответствия |
Это необходимое обновление API применимо только к API публикации (управление SKU).
Изменения в библиотеке платежей Play
Для поддержки постепенного перехода библиотека Play Billing Library включает в себя все методы и объекты, доступные в предыдущих версиях. Объекты и функции SkuDetails
такие как querySkuDetailsAsync()
все еще существуют, поэтому вы можете выполнить обновление для использования новых функций без необходимости немедленного обновления существующего кода подписок. Вы также можете контролировать, какие предложения доступны с помощью этих методов, отметив их как обратно совместимые.
Помимо сохранения устаревших методов, Play Billing Library 5 теперь включает новый объект ProductDetails
и соответствующий метод queryProductDetailsAsync()
для обработки новых сущностей и функций. Существующие внутриигровые продукты (разовые покупки и расходные материалы) теперь также поддерживаются ProductDetails
.
Для подписки ProductDetails.getSubscriptionOfferDetails()
возвращает список всех базовых планов и предложений, которые пользователь имеет право приобрести. Это означает, что вы можете получить доступ ко всем базовым планам и предложениям, доступным для пользователя, независимо от обратной совместимости. getSubscriptionOfferDetails()
возвращает null
для продуктов без подписки. Для разовых покупок вы можете использовать getOneTimePurchaseOfferDetails()
.
Play Billing Library 5 также включает в себя как новые, так и устаревшие методы запуска процесса покупки. Если объект BillingFlowParams
переданный в BillingClient.launchBillingFlow()
, настроен с использованием объекта SkuDetails
, система извлекает информацию о предложении для продажи из обратно совместимого базового плана или предложения, соответствующего SKU. Если объект BillingFlowParams
, переданный в BillingClient.launchBillingFlow()
, настроен с использованием объектов ProductDetailsParams
, которые включают ProductDetails
и String
, представляющую конкретный токен предложения для приобретаемого предложения, система затем использует эту информацию для идентификации продукта, приобретаемого пользователем.
queryPurchasesAsync()
возвращает все покупки, принадлежащие пользователю. Чтобы указать запрошенный тип продукта, вы можете передать значение BillingClient.SkuType
, как в более старых версиях, или объект QueryPurchasesParams
, содержащий значение BillingClient.ProductType
, представляющее новые сущности подписки.
Мы рекомендуем в ближайшее время обновить ваши приложения до версии 5 библиотеки, чтобы вы могли начать пользоваться преимуществами этих новых функций подписки.
Управление статусом подписки
В этом разделе описаны основные изменения в серверных компонентах интеграции биллинговой системы Google Play, которые необходимо реализовать для перехода на версию 5.
Уведомления разработчиков в режиме реального времени
Вскоре объект SubscriptionNotification
больше не будет содержать subscribeId . Если вы используете это поле для идентификации продукта подписки, вам следует обновить его, чтобы получить эту информацию из статуса подписки, используя purchases.subscriptionv2:get
после получения уведомления. Каждый элемент SubscriptionPurchaseLineItem
в коллекции lineItems , возвращаемый как часть статуса покупки, будет включать соответствующий ProductId .
API покупок подписок: получение статуса подписки
В предыдущих версиях API покупок подписок вы могли запросить статус подписки с помощью purchases.subscriptions:get
. Эта конечная точка не изменилась и продолжает работать при покупках подписки с обратной совместимостью. Эта конечная точка не поддерживает новые функции, выпущенные в мае 2022 г.
В новой версии API покупок подписок используйте purchases.subscriptionsv2:get
, чтобы получить статус покупки подписки. Этот API совместим с перенесенными подписками, новыми подписками (как с предоплатой, так и с автоматическим продлением), а также с покупками всех типов. Вы можете использовать эту конечную точку для проверки статуса подписки при получении уведомлений. Возвращенный объект SubscriptionPurchaseV2
содержит новые поля, но по-прежнему включает устаревшие данные, необходимые для продолжения поддержки существующих подписок.
Поля SubscriptionPurchaseV2 для предоплаченных планов
Были добавлены новые поля для поддержки предоплаченных планов, которые продлеваются пользователем вместо автоматического продления. Все поля применяются к планам с предоплатой так же, как и к подпискам с автоматическим продлением, за следующими исключениями:
- [Новое поле] lineItems[0].prepaid_plan.allowExtendAfterTime : обозначает, когда пользователю будет разрешено купить еще одно пополнение для продления своего предоплаченного плана, поскольку пользователю разрешено иметь только одно неизрасходованное пополнение одновременно.
- [Новое поле] SubscriptionState : указывает состояние объекта подписки. Для предоплаченных планов это значение всегда имеет значение
ACTIVE
,PENDING
илиCANCELED
. - lineItems[0].expiryTime : это поле всегда присутствует для планов с предоплатой.
- пауза_state_context : это поле никогда не присутствует, поскольку планы с предоплатой не могут быть приостановлены.
- lineItems[0].auto_renewing_plan : отсутствует для планов с предоплатой.
- canceled_state_context : отсутствует для планов с предоплатой, поскольку это поле применяется только к пользователям, которые активно отменяют подписку.
- lineItems[0].productId : это поле заменяет
subscriptionId
из предыдущих версий.
Поля SubscriptionPurchaseV2 для повторяющихся подписок
purchases.subscriptionv2
содержит новые поля, предоставляющие более подробную информацию о новых объектах подписки. В следующей таблице показано, как поля из конечной точки устаревшей подписки сопоставляются с соответствующими полями в purchases.subscriptionv2
.
ПодпискаПокупка | ПодпискаПокупкаV2 |
---|---|
countryCode | regionCode |
orderId | latestOrderId |
(нет эквивалентного поля) | lineItems (список SubscriptionPurchaseLineItem ), представляющий продукты, приобретенные при покупке. |
(нет эквивалентного поля) | lineItems.offerDetails.basePlanId |
(нет эквивалентного поля) | lineItems.offerDetails.offerId |
(нет эквивалентного поля) | lineItems.offerDetails.offerTags |
startTimeMillis | startTime |
expiryTimeMillis | lineItems.expiryTime (каждая подписка, приобретенная при покупке, имеет свое expiryTime ) |
(нет эквивалентного поля) | subscriptionState (указывает состояние подписки ) |
(нет эквивалентного поля) | pausedStateContext (присутствует только в том случае, если статус подписки — SUBSCRIPTION_STATE_PAUSED ) |
autoResumeTimeMillis | pausedStateContext.autoResumeTime |
(нет эквивалентного поля) | canceledStateContext (присутствует только в том случае, если статус подписки — SUBSCRIPTION_STATE_CANCELED ) |
(нет эквивалентного поля) | testPurchase (присутствует только при покупке лицензированных тестеров) |
autoRenewing | lineItems.autoRenewingPlan.autoRenewEnabled |
priceCurrenceCode , priceAmountMicros , introductoryPriceInfo | (нет эквивалентного поля) Эту информацию можно найти в basePlan / offer для каждой приобретенной подписки. |
разработчикПолезная нагрузка | (нет эквивалентного поля) Полезная нагрузка разработчика устарела |
состояние платежа | (нет эквивалентного поля) Вы можете определить состояние платежа из subscriptionState :
|
cancelReason , userCancellationTimeMillis , cancelSurveyResult | canceledStateContext |
linkedPurchaseToken | linkedPurchaseToken (без изменений) |
purchaseType | Тест: через testPurchase Продвижение: signupPromotion |
priceChange | lineItems.autoRenewingPlan.priceChangeDetails |
profileName , emailAddress , givenName , familyName , profileId | subscribeWithGoogleInfo |
acknowledgementState | acknowledgementState (no change) |
promotionType , promotionCode | signupPromotion |
externalAccountId , obfuscatedExternalAccountId , obfuscatedExteranlProfileId | externalAccountIdentifiers |
Другие функции управления подпиской
Хотя purchases.subscriptions:get
был обновлен до purchases.subscriptionsv2:get
, остальные функции управления подписками разработчика на данный момент остаются неизменными в конечной точке purchases.subscriptions
, поэтому вы можете продолжать использовать purchases.subscriptions:acknowledge
, purchases.subscriptions:cancel
, purchases.subscriptions:defer
, purchases.subscriptions:refund
и purchases.subscriptions:revoke
, как вы это делали раньше.
API ценообразования
Используйте конечную точку monetization.convertRegionPrices
для расчета региональных цен, как если бы вы это делали через Play Console. Этот метод принимает единую цену в любой валюте, поддерживаемой Play, и возвращает конвертированные цены (включая ставку налога по умолчанию, где это применимо) для всех регионов, где Google Play поддерживает покупки.