В этом документе содержатся заметки о выпуске Google Play Billing Library.
Выпуск Google Play Billing Library 8.1.0 (06.11.2025)
Теперь доступна версия 8.1.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Приостановленные подписки
В метод
BillingClient.queryPurchasesAsync()добавлен новый параметр, позволяющий учитывать приостановленные подписки при запросе подписок. Приостановленные подписки по-прежнему привязаны к пользователю, но неактивны, поскольку пользователь приостановил подписку или его способ оплаты продления был отклонен.Объект
Purchase, возвращаемый в прослушивателе, вернётisSuspended() = trueдля всех приостановленных подписок. В этом случае не следует предоставлять доступ к приобретённой подписке, а вместо этого направить пользователя в центр подписок , где он сможет управлять способами оплаты или приостановить подписку, чтобы повторно её активировать.Обновления подписок :
Объект
BillingFlowParams.ProductDetailsParamsтеперь имеет методsetSubscriptionProductReplacementParams(), в котором можно указать информацию о замене на уровне продукта.Объект
SubscriptionProductReplacementParamsимеет два метода установки:-
setOldProductId: Старый продукт, который необходимо заменить продуктом из текущегоProductDetails. -
setReplacementMode: это режим замены на уровне элемента. Режимы по сути те же, что и у SubscriptionUpdateParams, но сопоставление значений обновлено. Введен новый режим заменыKEEP_EXISTING, который позволяет сохранить существующий график платежей для элемента без изменений.
-
Метод SubscriptionUpdateParams setSubscriptionReplacementMode будет упразднён. Вместо него следует использовать
SubscriptionProductReplacementParams.setReplacementMode.
Обновлен
minSdkVersionдо 23.Включены API предварительного заказа для одноразовых продуктов
API
ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails(), который получает данные о предварительном заказе, теперь доступен для использования.Библиотека Google Play Billing теперь поддерживает Kotlin версии 2.2.0 .
Выпуск Google Play Billing Library 8.0.0 (30.06.2025)
Теперь доступна версия 8.0.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Элементы приложения теперь будут называться одноразовыми продуктами .
Множество вариантов покупки и предложений для разовых товаров.
Теперь вы можете использовать несколько вариантов покупки и предложений для ваших разовых товаров. Это обеспечивает гибкость в выборе способа продажи и упрощает управление ими.
Улучшен метод
queryProductDetailsAsync().До версии PBL 8.0.0 метод
queryProductDetailsAsync()не возвращал товары, которые не удалось получить. Это могло быть связано с такими причинами, как отсутствие товара или отсутствие доступных пользователю предложений. В версии PBL 8.0.0 неполученные товары возвращаются с новым кодом статуса на уровне товара, который предоставляет информацию о них. Обратите внимание на изменение сигнатуры методаProductDetailsResponseListener.onProductDetailsResponse(), что требует внесения изменений в ваше приложение. Подробнее см. в разделе «Обработка результата» .Автоматическое переподключение услуги.
Новый параметр конструктора
BillingClient.Builder.enableAutoServiceReconnection()позволяет разработчикам включить автоматическое переподключение к сервису, что упрощает управление подключениями, автоматически обрабатывая переподключения к сервису Play Billing Service и устраняя необходимость вручную вызыватьstartConnection()в случае отключения сервиса. Подробнее см. в разделе Автоматическое переподключение .Коды подответов для метода
launchBillingFlow().Результат BillingResult , возвращаемый функцией
launchBillingFlow()теперь будет включать поле кода дополнительного ответа. Это поле будет заполняться только в некоторых случаях для более точного указания причины сбоя. В версии PBL 8.0.0 дополнительный код PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS возвращается в случае, когда сумма средств пользователя меньше стоимости товара, который он пытается купить.Удален метод
queryPurchaseHistory().Метод
queryPurchaseHistory(), ранее отмеченный как устаревший, теперь удалён. Подробнее об альтернативных API, которые можно использовать, см. в разделе «Запрос истории покупок» .Удален метод
querySkuDetailsAsync().Метод
querySkuDetailsAsync(), ранее помеченный как устаревший, теперь удалён. Вместо него следует использовать queryProductDetailsAsync .Удален метод
BillingClient.Builder.enablePendingPurchases().Метод
enablePendingPurchases()без параметров, ранее помеченный как устаревший, теперь удалён. Вместо него следует использоватьenablePendingPurchases(PendingPurchaseParams params). Обратите внимание, что устаревшийenablePendingPurchases()функционально эквивалентен методуenablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()).Удален перегруженный метод
queryPurchasesAsync()который принимает skuType .Метод
queryPurchasesAsync(String skuType, PurchasesResponseListener listener), ранее помеченный как устаревший, теперь удалён. В качестве альтернативы можно использоватьqueryPurchasesAsync(QueryPurchasesParams queryPurchasesParams, PurchasesResponseListener listener).
Выпуск Google Play Billing Library 7.1.1 (03.10.2024)
Теперь доступна версия 7.1.1 библиотеки Google Play Billing Library и расширения Kotlin.
Исправления ошибок
- Исправлена ошибка в Play Billing Library 7.1.0, связанная с тестированием кодов ответов
BillingResult.
Выпуск Google Play Billing Library 7.1.0 (19 сентября 2024 г.)
Теперь доступна версия 7.1.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
- Улучшена безопасность потоков, связанная с состоянием соединения и управлением.
- Внесены частичные изменения в тестирование кодов ответов [
BillingResult][billing-result], которые полностью реализованы в Play Billing Library 7.1.1. Для тестирования интеграции с использованием этой функции необходимо обновить Play Billing Library до версии 7.1.1. Существует ошибка, которая затрагивает только приложения с [billing overrides testing enabled][enable-billing-overrides-testing] и не влияет на обычное использование. Подробнее см. в разделе Тестирование кодов ответовBillingResult. [billing-result]: /reference/com/android/billingclient/api/BillingResult [enable-billing-overrides-testing]: /google/play/billing/test-response-codes#enable-billing-overrides-testing
Выпуск Google Play Billing Library 7.0.0 (14.05.2024)
Теперь доступна версия 7.0.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Добавлены API для поддержки подписок в рассрочку.
- Добавлен [
ProductDetails.InstallmentPlanDetails][installment-details] для базовых планов рассрочки, которые пользователи могут приобрести. Этот API помогает вашему приложению определить план рассрочки и его настройки, чтобы предоставить пользователю соответствующую информацию. Подробнее см. в нашем [руководстве по рассрочке подписки][installments]. [installment-details]: /reference/com/android/billingclient/api/ProductDetails.InstallmentPlanDetails [installments]: /google/play/billing/subscriptions#installments
- Добавлен [
Добавлены
PendingPurchasesParamsиBillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)для заменыBillingClient.Builder.enablePendingPurchases(), который устарел в этом выпуске.- Устаревший метод
enablePendingPurchases()функционально эквивалентенenablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()).
- Устаревший метод
Добавлены API для поддержки ожидающих транзакций для предоплаченных тарифных планов:
- Используйте
PendingPurchasesParams.Builder.enablePrepaidPlans()вместе сBillingClient.Builder.enablePendingPurchases(PendingPurchaseParams)для включения отложенных транзакций для предоплаченных тарифных планов. При добавлении поддержки убедитесь, что ваше приложение также корректно управляет жизненными циклами подписок. Подробнее см. в нашем руководстве по отложенным покупкам . - Добавлены методы
Purchase.PendingPurchaseUpdateиPurchase.getPendingPurchaseUpdate()для получения ожидающего пополнения или повышения или понижения уровня существующей подписки.
- Используйте
Удалены
BillingClient.Builder.enableAlternativeBilling(),AlternativeBillingListenerиAlternativeChoiceDetails.- Вместо этого разработчикам следует использовать
BillingClient.Builder.enableUserChoiceBilling()сUserChoiceBillingListenerиUserChoiceDetailsв обратном вызове прослушивателя.
- Вместо этого разработчикам следует использовать
Удалены
BillingFlowParams.ProrationMode,BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode()иBillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode(). - Разработчикам следует использоватьBillingFlowParams.SubscriptionUpdateParams.ReplacementModeсBillingFlowParams.SubscriptionUpdateParams.Builder#setSubscriptionReplacementMode(int)вместо этого. -BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceProrationMode(). -BillingFlowParams.SubscriptionUpdateParams.Builder.setReplaceSkusProrationMode().Удален
BillingFlowParams.SubscriptionUpdateParams.Builder#setOldSkuPurchaseToken(). - Разработчикам следует использовать вместо этогоBillingFlowParams.SubscriptionUpdateParams.Builder#setOldPurchaseToken(java.lang.String).BillingClient.queryPurchaseHistoryAsync()устарел и будет удалён в будущем выпуске. Разработчикам следует использовать следующие альтернативы:- Подтвержденные и ожидающие покупки: используйте
BillingClient.queryPurchasesAsync()для извлечения активных покупок. - Совершенные покупки: Разработчики должны отслеживать совершенные покупки на своих собственных серверах.
- Отмененные покупки: используйте API разработчика аннулированных покупок .
- Более подробную информацию см. в разделе «История запросов покупок».
- Подтвержденные и ожидающие покупки: используйте
BillingFlowParams.ProductDetailsParams.setOfferToken()теперь выдает исключение, когда разработчики указывают пустойofferToken.Обновлено
minSdkVersionдо 21 иtargetSdkVersionдо 34.
Выпуск Google Play Billing Library 6.2.1 (16 апреля 2024 г.)
Теперь доступна версия 6.2.1 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
- Исправлена ошибка в
BillingClient.showAlternativeBillingOnlyInformationDialog(), из-за которойAlternativeBillingOnlyInformationDialogListenerмог не вызываться в некоторых случаях после завершения диалога.
Выпуск Google Play Billing Library 6.2.0 (06.03.2024)
Теперь доступна версия 6.2.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
- Добавлены API для поддержки внешних предложений
- Добавлен
BillingClient.Builder.enableExternalOffer()для включения возможности предоставления внешних предложений. - Добавлен
BillingClient.isExternalOfferAvailableAsync()для проверки доступности функциональности предоставления внешних предложений. - Добавлен
BillingClient.showExternalOfferInformationDialog()для показа пользователям информационного диалогового окна перед выходом из приложения. - Добавлен
BillingClient.createExternalOfferReportingDetailsAsync()для создания полезной нагрузки, необходимой для сообщения о транзакциях, совершенных через внешние предложения.
- Добавлен
Выпуск Google Play Billing Library 6.1.0 (14 ноября 2023 г.)
Теперь доступна версия 6.1.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
- Добавлены API только для поддержки альтернативного выставления счетов (т. е. без выбора пользователя)
- Добавлен
BillingClient.Builder.enableAlternativeBillingOnly()для функциональной возможности предлагать только альтернативный биллинг. - Добавлен
BillingClient.isAlternativeBillingOnlyAvailableAsync()для проверки возможности предложения только альтернативного биллинга. - Добавлен
BillingClient.showAlternativeBillingOnlyInformationDialog()для отображения информационного диалогового окна, информирующего пользователей об использовании только альтернативного выставления счетов. - Добавлен
BillingClient.createAlternativeBillingOnlyReportingDetailsAsync()для создания полезной нагрузки, необходимой для сообщения о транзакциях, совершенных только через альтернативный биллинг.
- Добавлен
- Обновлены API для выставления счетов по выбору пользователя.
- Добавлен
UserChoiceBillingListenerдля замены AlternativeBillingListener , который был помечен как устаревший. - Добавлен
UserChoiceDetailsдля заменыAlternativeChoiceDetails, который был помечен как устаревший. - Добавлен
BillingClient.Builder.enableUserChoiceBilling()для заменыBillingClient.Builder.enableAlternativeBilling()который был помечен как устаревший.
- Добавлен
- Добавлен
BillingClient.getBillingConfigAsync()для получения страны Google Play.
Выпуск Google Play Billing Library 6.0.1 (22 июня 2023 г.)
Теперь доступна версия 6.0.1 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Обновите Play Billing Library для совместимости с Android 14.
Выпуск Google Play Billing Library 6.0 (10.05.2023)
Теперь доступна версия 6.0.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Добавлено новое перечисление
ReplacementModeдля заменыProrationMode.Обратите внимание, что
ProrationModeпо-прежнему доступен в целях обратной совместимости.Удален идентификатор заказа для
PENDINGпокупок.Ранее идентификатор заказа создавался всегда, даже если покупка находилась в состоянии ожидания. Начиная с версии 6.0.0, идентификатор заказа не будет создаваться для покупок в состоянии ожидания, и для таких покупок идентификатор заказа будет заполнен после перевода покупки в состояние
PURCHASED.Удалены методы
queryPurchasesиlaunchPriceConfirmationFlow.Методы
queryPurchasesиlaunchPriceConfirmationFlow, ранее отмеченные как устаревшие, теперь удалены в Play Billing Library 6.0.0. Разработчикам следует использоватьqueryPurchasesAsyncвместоqueryPurchases. АльтернативыlaunchPriceConfirmationFlowсм. в разделе «Изменения цен» .Добавлен новый код ответа об ошибке сети.
Начиная с версии PBL 6.0.0, добавлен новый код ответа об ошибке сети —
NETWORK_ERROR. Этот код возвращается при возникновении ошибки, связанной с сетевым подключением. Ранее подобные ошибки сетевого подключения регистрировались какSERVICE_UNAVAILABLE.Обновлены
SERVICE_UNAVAILABLEиSERVICE_TIMEOUT.Начиная с версии PBL 6.0.0, ошибки, вызванные тайм-аутом при обработке, будут возвращаться как
SERVICE_UNAVAILABLEвместо текущегоSERVICE_TIMEOUT.В более ранних версиях PBL поведение не менялось.
Удален
SERVICE_TIMEOUT.Начиная с версии PBL 6.0.0,
SERVICE_TIMEOUTбольше не возвращается. Предыдущие версии PBL по-прежнему будут возвращать этот код.Добавлено дополнительное ведение журнала.
В релизе Play Billing Library 6 реализовано дополнительное журналирование, которое предоставляет информацию об использовании API (например, об успешности и неудаче) и проблемах с подключением к сервисам. Эта информация будет использоваться для повышения производительности Play Billing Library и улучшения поддержки в случае ошибок.
Выпуск Google Play Billing Library 5.2.1 (22 июня 2023 г.)
Теперь доступна версия 5.2.1 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Обновите Play Billing Library для совместимости с Android 14.
Выпуск Google Play Billing Library 5.2 (06.04.2023)
Теперь доступна версия 5.2.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
- Добавлены классы для поддержки альтернативных потоков выставления счетов на мобильных устройствах/планшетах для пользователей в Южной Корее:
- Добавлен метод
BillingFlowParams.SubscriptionUpdateParams.Builder.setOriginalExternalTransactionId()для указания внешнего идентификатора транзакции исходной подписки. - Добавлен метод
BillingClient.Builder.enableAlternativeBilling()позволяющий пользователям в Южной Корее выбирать альтернативный вариант оплаты.
Выпуск Google Play Billing Library 5.1 (31.10.2022)
Теперь доступна версия 5.1.0 библиотеки Google Play Billing Library и расширения Kotlin.
Эта версия содержит следующие изменения.
Краткое изложение изменений
- Добавлен метод
ProductDetails.SubscriptionOfferDetails.getOfferId()для получения идентификатора предложения. - Добавлен метод
ProductDetails.SubscriptionOfferDetails.getBasePlanId()для получения идентификатора базового плана. - Обновлена версия
targetSdkVersionдо 31.
Выпуск Google Play Billing Library 5.0 (11.05.2022)
Теперь доступна версия 5.0.0 библиотеки Google Play Billing Library и расширения Kotlin.
Эта версия содержит следующие изменения.
Краткое изложение изменений
- Представлена новая модель подписок, включая новые сущности, позволяющие создавать несколько предложений для одного продукта в рамках подписки. Подробнее см. в руководстве по миграции .
- Добавлен
BillingClient.queryProductDetailsAsync()для заменыBillingClient.querySkuDetailsAsync(). - Добавлен метод
setIsOfferPersonalized()для раскрытия персонализированных цен в ЕС. Подробнее об использовании этого метода см. в разделе «Указание персонализированной цены» . - Удален
queryPurchases(), который ранее считался устаревшим и заменен на queryPurchasesAsync, представленный в Google Play Billing Library 4.0.0. -
launchPriceChangeFlowустарел и будет удалён в будущем выпуске. Подробнее об альтернативах см. в статье «Запуск потока подтверждения изменения цены» . - Удалён
setVrPurchaseFlow(), который ранее использовался при создании процесса покупки. В предыдущих версиях этот метод перенаправлял пользователя для завершения покупки на его устройстве Android. После удаления этого метода пользователи будут завершать покупку через стандартный процесс покупки.
Выпуск Google Play Billing Library 4.1 (23.02.2022)
Теперь доступна версия 4.1.0 библиотеки Google Play Billing Library и расширения Kotlin.
Эта версия содержит следующие изменения.
Краткое изложение изменений
- Добавлен
BillingClient.showInAppMessages()для обработки отклоненных платежей за подписку. Подробнее об использовании сообщений внутри приложения для обработки отклоненных платежей за подписку см. в разделе Обработка отклоненных платежей .
Выпуск Google Play Billing Library 4.0 (18.05.2021)
Теперь доступна версия 4.0.0 библиотеки Google Play Billing Library и расширения Kotlin.
Краткое изложение изменений
Добавлен
BillingClient.queryPurchasesAsync()для заменыBillingClient.queryPurchases()который будет удален в будущем выпуске.Добавлен новый режим замены подписки
IMMEDIATE_AND_CHARGE_FULL_PRICE.Добавлен метод
BillingClient.getConnectionState()для получения состояния подключения Play Billing Library.Обновлены Javadoc и реализация с целью указания, в каком потоке может быть вызван метод и в каком потоке публикуются результаты.
Добавлен
BillingFlowParams.Builder.setSubscriptionUpdateParams()для инициирования обновлений подписок. Он заменяетBillingFlowParams#getReplaceSkusProrationMode,BillingFlowParams#getOldSkuPurchaseToken,BillingFlowParams#getOldSku,BillingFlowParams.Builder#setReplaceSkusProrationModeиBillingFlowParams.Builder#setOldSku, которые были удалены.Добавлены
Purchase.getQuantity()иPurchaseHistoryRecord.getQuantity().Добавлены
Purchase#getSkus()иPurchaseHistoryRecord#getSkus(). Они заменяютPurchase#getSkuиPurchaseHistoryRecord#getSku, которые были удалены.Удалены
BillingFlowParams#getSku,BillingFlowParams#getSkuDetailsиBillingFlowParams#getSkuType.
Выпуск Google Play Billing Library 3.0.3 (12.03.2021)
Теперь доступны версия 3.0.3 библиотеки Google Play Billing Library, расширение Kotlin и плагин Unity.
Исправления ошибок Java и Kotlin
- Исправлена утечка памяти при вызове
endConnection(). - Исправлена проблема, при которой библиотека Google Play Billing Library использовалась приложениями, использующими режим запуска одной задачи. Обратный вызов
onPurchasesUpdated()будет срабатывать при возобновлении работы приложения из панели запуска Android, если диалоговое окно с платежными данными было видно до приостановки.
Исправления ошибок Unity
- Выполните обновление до версии Java 3.0.3, чтобы устранить утечку памяти и решить проблему, препятствующую покупкам, когда приложение возобновляется из панели запуска Android, а диалоговое окно с платежными данными было видно до приостановки.
Выпуск Google Play Billing Library 3.0.2 (24 ноября 2020 г.)
Теперь доступна версия 3.0.2 библиотеки Google Play Billing Library и расширения Kotlin.
Исправления ошибок
- Исправлена ошибка в расширении Kotlin, из-за которой сопрограмма завершалась сбоем с ошибкой «Уже возобновлено».
- Исправлены неразрешенные ссылки при использовании расширения Kotlin с библиотекой kotlinx.coroutines версии 1.4+.
Выпуск Google Play Billing Library 3.0.1 (30.09.2020)
Теперь доступна версия 3.0.1 библиотеки Google Play Billing Library и расширения Kotlin.
Исправления ошибок
- Исправлена ошибка, из-за которой, если приложение было закрыто и восстановлено во время выставления счета,
PurchasesUpdatedListenerмог не вызываться с результатом покупки.
Выпуск Google Play Billing Library 3.0 (08.06.2020)
Теперь доступны версия 3.0.0 библиотеки Google Play Billing Library, расширение Kotlin и плагин Unity.
Краткое изложение изменений
- Удалена поддержка вознагражденных SKU.
- Удалены параметры
ChildDirectedиUnderAgeOfConsent. - Удалены устаревшие методы полезной нагрузки разработчика.
- Удалены устаревшие методы
BillingFlowParams.setAccountId()иBillingFlowParams.setDeveloperId(). - Удалены устаревшие методы
BillingFlowParams.setOldSkus(String oldSku)иBillingFlowParams.addOldSku(String oldSku). - Добавлены аннотации о допустимости значений NULL.
Исправления ошибок
-
SkuDetails.getIntroductoryPriceCycles()теперь возвращаетintвместоString. - Исправлена ошибка, из-за которой поток выставления счетов рассматривался как имеющий дополнительные параметры, даже если никакие дополнительные параметры не были установлены.
Выпуск Google Play Billing Library 2.2.1 (20.05.2020)
Доступна версия 2.2.1 библиотеки Google Play Billing.
Исправления ошибок
- Обновлена версия по умолчанию библиотеки Java Play Billing, от которой зависит расширение Kotlin.
Выпуск Google Play Billing Library 2.2.0 и поддержка Unity (23.03.2020)
Версия 2.2.0 Google Play Billing предоставляет функционал, помогающий разработчикам гарантировать, что покупки будут приписаны правильному пользователю. Эти изменения устраняют необходимость в разработке специальных решений на основе полезных данных разработчика. В рамках этого обновления функциональность полезных данных разработчика устарела и будет удалена в будущих выпусках. Дополнительную информацию, включая рекомендуемые альтернативы, см. в разделе «Полезные данные разработчика» .
Библиотека выставления счетов Google Play Billing 2 для Unity
В дополнение к текущим версиям Google Play Billing Library 2 для Java и Kotlin, мы выпустили версию библиотеки для Unity. Разработчики игр, использующие API для покупок внутри приложений Unity, могут обновить её уже сейчас, чтобы воспользоваться всеми функциями Google Play Billing Library 2 и упростить последующие обновления до будущих версий Google Play Billing Library.
Более подробную информацию см. в статье Использование Google Play Billing с Unity .
Краткое изложение изменений
- Библиотека Java Google Play Billing
- В
AcknowledgePurchaseParamsустарели методыsetDeveloperPayload()иgetDeveloperPayload(). - В
ConsumeParamsустарели методыsetDeveloperPayload()иgetDeveloperPayload(). - В
BillingFlowParamssetAccountId()переименован вsetObfuscatedAccountId(), а также задокументировано ограничение на длину в 64 символа и ограничение, запрещающее использование персонально идентифицируемой информации (PII) в этом поле.setAccountId()помечен как устаревший и будет удален в будущей версии библиотеки. - В
BillingFlowParamsдобавленsetObfuscatedProfileId(), который работает аналогичноsetObfuscatedAccountId(). Подробнее см. в разделе «Обновления и альтернативы для разработчиков» . - В
Purchaseдобавлен методgetAccountIdentifiers()для возврата запутанных идентификаторов счетов, установленных вBillingFlowParams. - В
BillingClientметодloadRewardedSku()отмечен как устаревший в рамках прекращения поддержки вознаграждений за SKU. Подробнее об этом прекращении поддержки см. в справочном центре Play Console .
- В
Выпуск Google Play Billing Library 2.1.0 и выпуск расширения Kotlin 2.1.0 (10 декабря 2019 г.)
Библиотека Google Play Billing версии 2.1.0 и новое расширение Kotlin уже доступны. Расширение Kotlin для Play Billing Library предоставляет альтернативные API для работы с Kotlin, включая улучшенную защиту от null-значений и сопрограммы. Примеры кода см. в разделе «Использование библиотеки Google Play Billing» .
Эта версия содержит следующие изменения.
Краткое изложение изменений
- В
BillingFlowParamssetOldSku(String oldSku)устарел и заменен наsetOldSku(String oldSku, String purchaseToken)для устранения неоднозначности, когда несколько учетных записей на устройстве владеют одним и тем же sku.
Выпуск Google Play Billing Library 2.0.3 (05.08.2019)
Доступна версия 2.0.3 библиотеки Google Play Billing.
Исправления ошибок
- Исправлена ошибка, из-за которой
querySkuDetailsAsync()иногда завершался сбоем с кодомDEVELOPER_ERRORвместо возврата успешного результата.
Выпуск Google Play Billing Library 2.0.2 (08.07.2019)
Доступна версия 2.0.2 библиотеки Google Play Billing. Этот выпуск содержит обновления справочной документации и не меняет функционал библиотеки.
Выпуск Google Play Billing Library 2.0.1 (06.06.2019)
Доступна версия 2.0.1 библиотеки Google Play Billing. Эта версия содержит следующие изменения.
Исправления ошибок
- Исправлена ошибка, из-за которой отладочные сообщения в некоторых случаях возвращались как
null. - Исправлена потенциальная проблема утечки памяти.
Выпуск Google Play Billing Library 2.0 (07.05.2019)
Доступна версия 2.0 библиотеки Google Play Billing. Эта версия содержит следующие изменения.
Покупки должны быть подтверждены в течение трех дней.
Google Play поддерживает покупку товаров как внутри приложения (in-app), так и вне его (out-of-app). Чтобы Google Play обеспечивал единообразный процесс покупки независимо от того, где пользователь приобретает ваш продукт, необходимо подтверждать все покупки, полученные через Библиотеку платежей Google Play, как можно скорее после предоставления пользователю права на покупку. Если вы не подтвердите покупку в течение трёх дней, пользователь автоматически получит возврат средств, а Google Play отменит покупку. Для ожидающих транзакций (новое в версии 2.0) трёхдневный период начинается с момента перехода покупки в состояние PURCHASED и не применяется, пока покупка находится в состоянии PENDING .
Для подписок необходимо подтвердить каждую покупку с новым токеном покупки. Это означает, что все первоначальные покупки, изменения тарифного плана и повторные регистрации должны быть подтверждены, но подтверждать последующие продления не требуется. Чтобы определить, требуется ли подтверждение покупки, проверьте поле подтверждения в соответствующем разделе.
Объект Purchase теперь включает метод isAcknowledged() , который указывает, была ли покупка подтверждена. Кроме того, API разработчика Google Play включает логические значения подтверждения для Purchases.products и Purchases.subscriptions . Прежде чем подтверждать покупку, обязательно используйте эти методы, чтобы определить, была ли она уже подтверждена.
Подтвердить покупку можно одним из следующих способов:
- Для потребляемых продуктов используйте
consumeAsync(), найденный в клиентском API. - Для продуктов, которые не потребляются, используйте
acknowledgePurchase(), найденный в клиентском API. - Новый метод
acknowledge()также доступен в API сервера.
BillingFlowParams.setSku() был удален
Ранее устаревший метод BillingFlowParams#setSku() был удалён в этой версии. Теперь перед рендерингом товаров в процессе покупки необходимо вызвать BillingClient.querySkuDetailsAsync() и передать полученный объект SkuDetails в BillingFlowParams.Builder.setSkuDetails() .
Примеры кода см. в разделе Использование библиотеки Google Play Billing Library .
Поддерживается полезная нагрузка разработчика
В версии 2.0 библиотеки Google Play Billing добавлена поддержка полезных данных разработчика — произвольных строк, которые можно прикреплять к покупкам. Вы можете прикрепить параметр полезных данных разработчика к покупке, но только после подтверждения покупки или её оплаты. Это отличается от полезных данных разработчика в AIDL, где полезные данные можно было указать при запуске процесса покупки. Поскольку покупки теперь можно инициировать извне вашего приложения , это изменение гарантирует вам всегда возможность добавить полезные данные к покупкам.
Для доступа к полезной нагрузке в новой библиотеке объекты Purchase теперь включают метод getDeveloperPayload() .
Последовательные предложения
Когда вы предлагаете товар со скидкой, Google Play теперь возвращает первоначальную цену товара, чтобы вы могли показать пользователям, что они получают скидку.
SkuDetails содержит два новых метода для получения исходной цены SKU:
-
getOriginalPriceAmountMicros()- возвращает неформатированную исходную цену товара до скидки.
-
getOriginalPrice()- возвращает исходную цену с дополнительным форматированием валюты.
Ожидаемые транзакции
В версии 2.0 библиотеки Google Play Billing необходимо поддерживать покупки, требующие дополнительных действий перед предоставлением права. Например, пользователь может выбрать покупку вашего товара в приложении в обычном магазине за наличные. Это означает, что транзакция совершается вне вашего приложения. В этом случае предоставление права следует предоставлять только после того, как пользователь завершит транзакцию.
Чтобы включить отложенные покупки, вызовите enablePendingPurchases() в ходе инициализации вашего приложения.
Используйте Purchase.getPurchaseState() чтобы определить, находится ли покупка в состоянии PURCHASED или PENDING . Обратите внимание, что разрешение следует предоставлять только в состоянии PURCHASED . Необходимо проверить наличие обновлений статуса Purchase , выполнив следующие действия:
- При запуске приложения вызовите
BillingClient.queryPurchases()чтобы получить список неиспользованных продуктов, связанных с пользователем. - Вызовите
Purchase.getPurchaseState()для каждого возвращенного объектаPurchase. - Реализуйте метод
onPurchasesUpdated()для реагирования на изменения объектовPurchase.
Кроме того, API разработчика Google Play включает состояние PENDING для Purchases.products . Ожидающие транзакции не поддерживаются для подписок.
В этом выпуске также представлен новый тип уведомлений для разработчиков в режиме реального времени — OneTimeProductNotification . Этот тип уведомлений содержит одно сообщение со значением ONE_TIME_PRODUCT_PURCHASED или ONE_TIME_PRODUCT_CANCELED . Этот тип уведомлений отправляется только для покупок, связанных с отложенной оплатой, например, наличными.
При подтверждении отложенных покупок обязательно подтверждайте только те состояния покупки, которые указаны PURCHASED , а не PENDING .
Изменения API
Версия 2.0 библиотеки Google Play Billing содержит несколько изменений API для поддержки новых функций и уточнения существующего функционала.
useAsync
consumeAsync() теперь принимает объект ConsumeParams вместо purchaseToken . ConsumeParams содержит purchaseToken , а также дополнительную полезную нагрузку разработчика.
Предыдущая версия consumeAsync() в этом выпуске удалена.
queryPurchaseHistoryAsync
To minimize confusion, queryPurchaseHistoryAsync() now returns a PurchaseHistoryRecord object instead of a Purchase object. The PurchaseHistoryRecord object is the same as a Purchase object, except that it reflects only the values returned by queryPurchaseHistoryAsync() and does not contain the autoRenewing , orderId , and packageName fields. Note that nothing has changed with the returned data— queryPurchaseHistoryAsync() returns the same data as before.
BillingResult return values
APIs that previously returned a BillingResponse integer value now return a BillingResult object. BillingResult contains the BillingResponse integer as well as a debug string that you can use to diagnose errors. The debug string uses an en-US locale and is not meant to be shown to end users.
Исправления ошибок
-
SkuDetails.getIntroductoryPriceAmountMicros()now returns alonginstead of aString.
Google Play Billing Library 1.2.2 Release (2019-03-07)
Version 1.2.2 of the Google Play Billing library is now available. This version contains the following changes.
Исправления ошибок
- Fixed a threading issue introduced in v1.2.1. Background calls no longer block the main thread.
Другие изменения
- Although using the main thread is still recommended, you can now instantiate the Google Play Billing Library from a background thread.
- Instantiation has been fully migrated to the background thread to reduce the chance of causing ANRs.
Play Billing Library 1.2.1 Release (2019-03-04)
Version 1.2.1 of the Google Play Billing library is now available. This version contains the following changes.
Основные изменения
- Added support for rewarded products . For more information on monetization options, see Add rewarded-product-specific features .
Другие изменения
- Added public constructors for
PurchasesResultandSkuDetailsResultto make testing easier. -
SkuDetailsobjects can use a new method,getOriginalJson(). - All AIDL service calls are now handled by background threads.
Исправления ошибок
- Null callback listeners are no longer passed into public APIs.
Google Play Billing Library 1.2 Release (2018-10-18)
Version 1.2 of the Google Play Billing library is now available. This version contains the following changes.
Краткое изложение изменений
- The Google Play Billing Library is now licensed under the Android Software Development Kit License Agreement .
- Added the
launchPriceChangeConfirmationFlowAPI, which prompts users to review a pending change to a subscription price. - Added support for a new proration mode,
DEFERRED, when upgrading or downgrading a user's subscription. - In the
BillingFlowParamsclass, replacedsetSku()withsetSkuDetails(). - Minor bug fixes and code optimizations.
Price change confirmation
You can now change the price of a subscription in Google Play Console and prompt users to review and accept the new price when they enter your app.
To use this API, create a PriceChangeFlowParams object by using the skuDetails of the subscription product, and then call launchPriceChangeConfirmationFlow() . Implement the PriceChangeConfirmationListener to handle the result when the price change confirmation flow finishes, as shown in the following code snippet:
Котлин
val priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(skuDetailsOfThePriceChangedSubscription) .build() billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, object : PriceChangeConfirmationListener() { override fun onPriceChangeConfirmationResult(responseCode: Int) { // Handle the result. } })
Ява
PriceChangeFlowParams priceChangeFlowParams = PriceChangeFlowParams.newBuilder() .setSkuDetails(skuDetailsOfThePriceChangedSubscription) .build(); billingClient.launchPriceChangeConfirmationFlow(activity, priceChangeFlowParams, new PriceChangeConfirmationListener() { @Override public void onPriceChangeConfirmationResult(int responseCode) { // Handle the result. } });
The price change confirmation flow displays a dialog containing the new pricing information, asking users to accept the new price. This flow returns a response code of type BillingClient.BillingResponse .
New proration mode
When upgrading or downgrading a user's subscription, you can use a new proration mode, DEFERRED . This mode updates the user's subscription when it next renews. To learn more about how to set this proration mode, see Set proration mode .
New method for setting SKU details
In the BillingFlowParams class, the setSku() method has been deprecated. This change serves to optimize the Google Play Billing flow.
When constructing a new instance of BillingFlowParams in your in-app billing client, we recommend that you instead work with the JSON object directly using setSkuDetails() , as shown in the following code snippet:
In the BillingFlowParams Builder class, the setSku() method has been deprecated. Instead, use the setSkuDetails() method, as shown in the following code snippet. The object passed into setSkuDetails() object comes from the querySkuDetailsAsync() method.
Котлин
private lateinit var mBillingClient: BillingClient private val mSkuDetailsMap = HashMap<String, SkuDetails>() private fun querySkuDetails() { val skuDetailsParamsBuilder = SkuDetailsParams.newBuilder() mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build() ) { responseCode, skuDetailsList -> if (responseCode == 0) { for (skuDetails in skuDetailsList) { mSkuDetailsMap[skuDetails.sku] = skuDetails } } } } private fun startPurchase(skuId: String) { val billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap[skuId]) .build() }
Ява
private BillingClient mBillingClient; private Map<String, SkuDetails> mSkuDetailsMap = new HashMap<>(); private void querySkuDetails() { SkuDetailsParams.Builder skuDetailsParamsBuilder = SkuDetailsParams.newBuilder(); mBillingClient.querySkuDetailsAsync(skuDetailsParamsBuilder.build(), new SkuDetailsResponseListener() { @Override public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) { if (responseCode == 0) { for (SkuDetails skuDetails : skuDetailsList) { mSkuDetailsMap.put(skuDetails.getSku(), skuDetails); } } } }); } private void startPurchase(String skuId) { BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(mSkuDetailsMap.get(skuId)) .build(); }
Play Billing Library 1.1 Release (2018-05-07)
Version 1.1 of the Google Play Billing library is now available. This version contains the following changes.
Краткое изложение изменений
- Added support to specify a proration mode in
BillingFlowParamswhen upgrading/downgrading an existing subscription. - The
replaceSkusProrationboolean flag inBillingFlowParamsis no longer supported. UsereplaceSkusProrationModeinstead. -
launchBillingFlow()now triggers a callback for failed responses.
Behavior changes
Version 1.1 of the Google Play Billing library contains the following behavior changes.
Developers can set replaceSkusProrationMode in BillingFlowParams class
A ProrationMode provides further details on the type of proration when upgrading or downgrading a user's subscription.
Котлин
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build()
Ява
BillingFlowParams.newBuilder() .setSku(skuId) .setType(billingType) .setOldSku(oldSku) .setReplaceSkusProrationMode(replaceSkusProrationMode) .build();
Google Play supports following proration modes:
IMMEDIATE_WITH_TIME_PRORATION | Replacement takes effect immediately, and the new expiration time will be prorated and credited or charged to the user. This is the current default behavior. |
IMMEDIATE_AND_CHARGE_PRORATED_PRICE | Replacement takes effect immediately, and the billing cycle remains the same. The price for the remaining period will be charged. Note : This option is only available for subscription upgrade. |
IMMEDIATE_WITHOUT_PRORATION | Replacement takes effect immediately, and the new price will be charged on next recurrence time. The billing cycle stays the same. |
replaceSkusProration is no longer supported in BillingFlowParams class
Developers used to be able to set a boolean flag to charge a prorated amount for a subscription upgrade request. Given that we are supporting ProrationMode , which contains more detailed proration instruction, this boolean flag is no longer supported.
launchBillingFlow() now triggers a callback for failed responses
The Billing Library will always trigger the PurhcasesUpdatedListener callback and return a BillingResponse asynchronously. The synchronous return value of BillingResponse is kept as well.
Исправления ошибок
- Properly exits early in async methods when service is disconnected.
-
Builderparam objects no longer mutates built objects. - Issue 68087141 :
launchBillingFlow()now trigger callback for failed responses.
Google Play Billing Library 1.0 Release (2017-09-19, Announcement )
Version 1.0 of the Google Play Billing library is now available. This version contains the following changes.
Важные изменения
- Embedded billing permission inside library's manifest. It's not necessary to add the
com.android.vending.BILLINGpermission inside Android manifest anymore. - New builder added to
BillingClient.Builderclass. - Introduced builder pattern for
SkuDetailsParamsclass to be used on methods to query SKUs. - Several API methods were updated for consistency (the same return argument names and order).
Behavior changes
Version 1.0 of the Google Play Billing library contains the following behavior changes.
BillingClient.Builder class
BillingClient.Builder is now initialized via the newBuilder pattern:
Котлин
billingClient = BillingClient.newBuilder(context).setListener(this).build()
Ява
billingClient = BillingClient.newBuilder(context).setListener(this).build();
launchBillingFlow method is now called using a BillingFlowParams class
To initiate the billing flow for a purchase or subscription, the launchBillingFlow() method receives a BillingFlowParams instance initialized with parameters specific to the request:
Котлин
BillingFlowParams.newBuilder().setSku(skuId) .setType(billingType) .setOldSku(oldSku) .build() // Then, use the BillingFlowParams to start the purchase flow val responseCode = billingClient.launchBillingFlow(builder.build())
Ява
BillingFlowParams.newBuilder().setSku(skuId) .setType(billingType) .setOldSku(oldSku) .build(); // Then, use the BillingFlowParams to start the purchase flow int responseCode = billingClient.launchBillingFlow(builder.build());
New way to query available products
Arguments for queryPurchaseHistoryAsync() and querySkuDetailsAsync() methods were wrapped into a Builder pattern:
Котлин
val params = SkuDetailsParams.newBuilder() params.setSkusList(skuList) .setType(itemType) billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() { ... })
Ява
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); params.setSkusList(skuList) .setType(itemType); billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})
The result is now returned via result code and a list of SkuDetails objects instead of previous wrapper class for your convenience and to be consistent across our API:
Котлин
fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)
Ява
public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)
Parameters order changed on onConsumeResponse() method
The order of arguments for onConsumeResponse from the ConsumeResponseListener interface has changed to be consistent across our API:
Котлин
fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)
Ява
public void onConsumeResponse(@BillingResponse int responseCode, String outToken)
Unwrapped PurchaseResult object
PurchaseResult has been unwraped to be consistent across our API:
Котлин
fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)
Ява
void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)
Исправления ошибок
- No response code in PURCHASES_UPDATED Bundle
- Fix ProxyBillingActivity and PurchasesUpdatedListener issues during device rotation
Developer Preview 1 Release (2017-06-12, Announcement )
Developer preview launched, aimed to simplify the development process when it comes to billing, allowing developers to focus their efforts on implementing logic specific to the Android app, such as application architecture and navigation structure.
The library includes several convenient classes and features for you to use when integrating your Android apps with the Google Play Billing API. The library also provides an abstraction layer on top of the Android Interface Definition Language (AIDL) service, making it easier for developers to define the interface between the app and the Google Play Billing API.