Примечания к выпуску библиотеки Google Play Billing

В этом документе содержатся заметки о выпуске 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.

Исправления ошибок

Выпуск 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.

Краткое изложение изменений

Выпуск Google Play Billing Library 6.2.1 (16 апреля 2024 г.)

Теперь доступна версия 6.2.1 библиотеки Google Play Billing Library и расширения Kotlin.

Краткое изложение изменений

Выпуск Google Play Billing Library 6.2.0 (06.03.2024)

Теперь доступна версия 6.2.0 библиотеки Google Play Billing Library и расширения Kotlin.

Краткое изложение изменений

Выпуск Google Play Billing Library 6.1.0 (14 ноября 2023 г.)

Теперь доступна версия 6.1.0 библиотеки Google Play Billing Library и расширения Kotlin.

Краткое изложение изменений

Выпуск 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.

Краткое изложение изменений

Выпуск Google Play Billing Library 5.1 (31.10.2022)

Теперь доступна версия 5.1.0 библиотеки Google Play Billing Library и расширения Kotlin.

Эта версия содержит следующие изменения.

Краткое изложение изменений

Выпуск 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.

Эта версия содержит следующие изменения.

Краткое изложение изменений

Выпуск 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 .

Краткое изложение изменений

Выпуск 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» .

Эта версия содержит следующие изменения.

Краткое изложение изменений

  • В BillingFlowParams setOldSku(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 , выполнив следующие действия:

  1. При запуске приложения вызовите BillingClient.queryPurchases() чтобы получить список неиспользованных продуктов, связанных с пользователем.
  2. Вызовите Purchase.getPurchaseState() для каждого возвращенного объекта Purchase .
  3. Реализуйте метод 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.

Исправления ошибок

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 public constructors for PurchasesResult and SkuDetailsResult to make testing easier.
  • SkuDetails objects 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 launchPriceChangeConfirmationFlow API, 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 BillingFlowParams class, replaced setSku() with setSkuDetails() .
  • 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 BillingFlowParams when upgrading/downgrading an existing subscription.
  • The replaceSkusProration boolean flag in BillingFlowParams is no longer supported. Use replaceSkusProrationMode instead.
  • 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.
  • Builder param 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.BILLING permission inside Android manifest anymore.
  • New builder added to BillingClient.Builder class.
  • Introduced builder pattern for SkuDetailsParams class 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)

Исправления ошибок

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.