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

В этом документе содержатся примечания к выпуску библиотеки Google Play Billing.

Выпуск библиотеки Google Play Billing 9.1.0 (18.06.2026)

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

Краткое описание изменений

Выпуск библиотеки Google Play Billing 9.0.0 (19.05.2026)

Вышла версия 9.0.0 библиотеки Google Play Billing Library и расширений Kotlin. Если вы хотите перейти с предыдущих версий PBL, ознакомьтесь с руководством по миграции на PBL 9 .

Краткое описание изменений

  • Обновлены коды ошибок для заблокированных приложений Play Store : коды ошибок для заблокированных приложений Play Store были обновлены. В случаях, когда приложение Play Store блокируется системой (например, в детском режиме, настроенном производителем), код ответа изменился с ERROR на BILLING_UNAVAILABLE . Кроме того, в таких случаях BillingResult теперь отображает отладочное сообщение о блокировке Play Store .

  • Обновление параметра `@Nullable` для предоставляемых разработчиком платежей : метод ` DeveloperProvidedBillingDetails.getLinkUri() теперь имеет параметр @Nullable . Это изменение поддерживает сценарии, когда прямая ссылка URI для внешних платежей недоступна на этапе выбора способа оплаты.

    Для безопасной обработки этого изменения убедитесь, что ваш интеграционный код обрабатывает как значения null , так и пустые строковые значения ( "" ) из метода DeveloperProvidedBillingDetails.getLinkUri() перед анализом или запуском намерений браузера.

  • Обновлена ​​версия targetSdkVersion до 35.

  • Теперь вы можете использовать внутриигровые сообщения , чтобы уведомлять пользователей о предстоящем повышении цен, на которое они могут согласиться. Это позволяет пользователям подтвердить повышение цены, не покидая приложение. Сообщение о предстоящем повышении цен, на которое пользователь может согласиться, отображается начиная с первого дня, когда он может принять повышение цены, и отображается максимум один раз в 7 дней.

Выпуск библиотеки Google Play Billing 8.3.0 (23.12.2025)

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

Краткое описание изменений

Выпуск библиотеки Google Play Billing 8.2.1 (15.12.2025)

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

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

Выпуск библиотеки Google Play Billing 8.2.0 (09.12.2025)

Вышла версия 8.2.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Выпуск библиотеки Google Play Billing 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 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() , будет содержать поле с кодом подответа. Это поле будет заполняться только в некоторых случаях для указания более конкретной причины сбоя. Поле подответа может принимать следующие значения:

    • PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS - Возвращается, когда на счету пользователя меньше стоимости товара, который он пытается приобрести.
    • USER_INELIGIBLE — Возвращается, если пользователь не соответствует заданным требованиям для получения подписки.
    • NO_APPLICABLE_SUB_RESPONSE_CODE — значение по умолчанию, возвращаемое, если ни один другой код подответа не применим.
  • Удалён метод 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 7.1.1 (03.10.2024)

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

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

Выпуск библиотеки Google Play Billing 7.1.0 (19.09.2024)

Вышла версия 7.1.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

  • Улучшена безопасность потоков, связанных со состоянием и управлением соединениями.
  • Внесены частичные изменения в тестирование кодов ответов BillingResult , которые полностью включены в Play Billing Library 7.1.1. Для тестирования интеграции с использованием этой функции необходимо обновить Play Billing Library до версии 7.1.1. Существует ошибка, которая затронет только приложения с включенным тестированием переопределения платежей и не повлияет на обычное использование. Для получения дополнительной информации см. раздел «Тестирование кодов ответов BillingResult .

Выпуск библиотеки Google Play Billing 7.0.0 (14.05.2024)

Вышла версия 7.0.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Выпуск библиотеки Google Play Billing 6.2.1 (16.04.2024)

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

Краткое описание изменений

Выпуск библиотеки Google Play Billing 6.2.0 (06.03.2024)

Вышла версия 6.2.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Выпуск библиотеки Google Play Billing 6.1.0 (14.11.2023)

Вышла версия 6.1.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Выпуск библиотеки Google Play Billing 6.0.1 (22.06.2023)

Вышла версия 6.0.1 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Обновите библиотеку Play Billing для обеспечения совместимости с Android 14.

Выпуск библиотеки Google Play Billing 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 5.2.1 (22.06.2023)

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

Краткое описание изменений

Обновите библиотеку Play Billing для обеспечения совместимости с Android 14.

Выпуск библиотеки Google Play Billing 5.2 (06.04.2023)

Вышла версия 5.2.0 библиотеки Google Play Billing Library и расширений Kotlin.

Краткое описание изменений

Выпуск библиотеки Google Play Billing 5.1 (31.10.2022)

Вышла версия 5.1.0 библиотеки Google Play Billing Library и расширений Kotlin.

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

Краткое описание изменений

Выпуск библиотеки Google Play Billing 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 4.1 (23.02.2022)

Вышла версия 4.1.0 библиотеки Google Play Billing Library и расширений Kotlin.

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

Краткое описание изменений

Выпуск библиотеки Google Play Billing 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.

  • Обновлены 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 3.0.3 (12.03.2021)

Вышла версия 3.0.3 библиотеки Google Play Billing Library, расширения Kotlin и плагина Unity.

Исправлены ошибки в Java и Kotlin.

  • Исправлена ​​утечка памяти при вызове функции endConnection() .
  • Исправлена ​​ошибка, возникающая при использовании библиотеки Google Play Billing приложениями, работающими в режиме запуска одной задачи. При возобновлении работы приложения из лаунчера Android, если диалоговое окно оплаты было видно до приостановки, будет вызываться обратный вызов onPurchasesUpdated()

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

  • Обновление до версии Java 3.0.3 исправляет утечку памяти и устраняет проблему, препятствующую совершению покупок при возобновлении работы приложения из лаунчера Android, если диалоговое окно оплаты было видно до приостановки.

Выпуск библиотеки Google Play Billing 3.0.2 (24.11.2020)

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

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

  • Исправлена ​​ошибка в расширении Kotlin, из-за которой сопрограмма завершалась с ошибкой "Already resumed".
  • Исправлены неразрешенные ссылки при использовании расширения Kotlin с библиотекой kotlinx.coroutines версии 1.4 и выше.

Выпуск библиотеки Google Play Billing 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 2.2.1 (2020-05-20)

Вышла версия 2.2.1 библиотеки Google Play Billing.

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

  • Обновлена ​​версия библиотеки Java Play Billing по умолчанию, от которой зависит расширение Kotlin.

Выпуск библиотеки Google Play Billing версии 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 с Unity» .

Краткое описание изменений

Выпуск библиотеки Google Play Billing Library версии 2.1.0 и расширения Kotlin Extension версии 2.1.0 (10.12.2019)

Вышла версия 2.1.0 библиотеки Google Play Billing и новое расширение для Kotlin. Расширение Play Billing Library для Kotlin предоставляет идиоматические альтернативы API для использования в Kotlin, отличающиеся улучшенной защитой от нулевых значений и сопрограммами. Примеры кода см. в разделе «Использование библиотеки Google Play Billing» .

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

Краткое описание изменений

  • В BillingFlowParams setOldSku(String oldSku) объявлен устаревшим и заменен на setOldSku(String oldSku, String purchaseToken) , чтобы исключить неоднозначность в случаях, когда несколько учетных записей на устройстве владеют одним и тем же артикулом.

Выпуск библиотеки Google Play Billing 2.0.3 (05.08.2019)

Вышла версия 2.0.3 библиотеки Google Play Billing.

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

  • Исправлена ​​ошибка, из-за которой метод querySkuDetailsAsync() иногда завершался с ошибкой DEVELOPER_ERROR вместо возврата успешного результата.

Выпуск библиотеки Google Play Billing 2.0.2 (08.07.2019)

Вышла версия 2.0.2 библиотеки Google Play Billing. В этом релизе обновлена ​​справочная документация, но функциональность библиотеки не изменена.

Выпуск библиотеки Google Play Billing 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 поддерживает покупку товаров как внутри приложения (в приложении), так и вне его (вне приложения). Для обеспечения единообразного процесса покупки независимо от того, где пользователь приобретает ваш продукт, необходимо как можно скорее после предоставления пользователю права на покупку подтвердить все покупки, полученные через библиотеку платежей Google Play. Если вы не подтвердите покупку в течение трех дней, пользователь автоматически получит возврат средств, а Google Play аннулирует покупку. Для незавершенных транзакций (новинка версии 2.0) трехдневный срок начинается с момента перехода покупки в состояние PURCHASED и не применяется, пока покупка находится в состоянии PENDING .

При оформлении подписки необходимо подтвердить каждую покупку, для которой требуется новый токен покупки. Это означает, что все первоначальные покупки, изменения тарифных планов и повторные подписки должны быть подтверждены, но подтверждение последующих продлений не требуется. Чтобы определить, требуется ли подтверждение покупки, проверьте поле подтверждения в описании покупки.

Объект Purchase теперь включает метод isAcknowledged() , который указывает, была ли покупка подтверждена. Кроме того, API разработчиков Google Play включает логические значения подтверждения для объектов Purchases.products и Purchases.subscriptions . Перед подтверждением покупки обязательно воспользуйтесь этими методами, чтобы определить, была ли покупка уже подтверждена.

Подтвердить покупку можно одним из следующих способов:

  • Для расходуемых продуктов используйте consumeAsync() , доступный в клиентском API.
  • Для товаров, которые не были потреблены, используйте acknowledgePurchase() , доступную в клиентском API.
  • В API сервера также появился новый метод acknowledge() .

Метод BillingFlowParams.setSku() был удален.

В этом релизе удален ранее устаревший метод BillingFlowParams#setSku() . Теперь перед отображением товаров в процессе покупки необходимо вызвать BillingClient.querySkuDetailsAsync() , передав полученный объект SkuDetails в BillingFlowParams.Builder.setSkuDetails() .

Примеры кода см. в разделе «Использование библиотеки Google Play Billing» .

Поддерживается полезная нагрузка разработчика.

В версии 2.0 библиотеки Google Play Billing добавлена ​​поддержка полезной нагрузки разработчика — произвольных строк, которые можно прикреплять к покупкам. Вы можете прикрепить параметр полезной нагрузки разработчика к покупке, но только когда покупка подтверждена или совершена. Это отличается от полезной нагрузки разработчика в AIDL, где полезная нагрузка могла быть указана при запуске процесса покупки. Поскольку теперь покупки могут инициироваться извне вашего приложения , это изменение гарантирует, что у вас всегда будет возможность добавить полезную нагрузку к покупкам.

Для доступа к содержимому новой библиотеки объекты Purchase теперь включают метод getDeveloperPayload() .

Постоянные предложения

Теперь, когда вы предлагаете товар со скидкой, Google Play возвращает его первоначальную цену, чтобы вы могли показать пользователям, что они получают скидку.

SkuDetails появились два новых метода для получения исходной цены товара:

  • 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 для поддержки новых функций и уточнения существующей функциональности.

consumeAsync

Теперь consumeAsync() принимает объект ConsumeParams вместо purchaseToken . Объект ConsumeParams содержит purchaseToken , а также необязательную полезную нагрузку для разработчика.

В этом релизе удалена предыдущая версия функции consumeAsync() .

queryPurchaseHistoryAsync

Чтобы избежать путаницы, queryPurchaseHistoryAsync() теперь возвращает объект PurchaseHistoryRecord вместо объекта Purchase . Объект PurchaseHistoryRecord идентичен объекту Purchase , за исключением того, что он отражает только значения, возвращаемые методом queryPurchaseHistoryAsync() , и не содержит полей autoRenewing , orderId и packageName . Обратите внимание, что с возвращаемыми данными ничего не изменилось — метод queryPurchaseHistoryAsync() возвращает те же данные, что и раньше.

Возвращаемые значения BillingResult

API, которые ранее возвращали целочисленное значение BillingResponse теперь возвращают объект BillingResult . BillingResult содержит целочисленное значение BillingResponse , а также отладочную строку, которую можно использовать для диагностики ошибок. Отладочная строка использует локаль en-US и не предназначена для отображения конечным пользователям.

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

Выпуск библиотеки Google Play Billing 1.2.2 (07.03.2019)

Вышла версия 1.2.2 библиотеки Google Play Billing. Эта версия содержит следующие изменения.

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

  • Исправлена ​​проблема с многопоточностью, появившаяся в версии 1.2.1. Фоновые вызовы больше не блокируют основной поток.

Другие изменения

  • Хотя использование основного потока по-прежнему рекомендуется, теперь вы можете создавать экземпляры библиотеки Google Play Billing из фонового потока.
  • Процесс создания экземпляров полностью перенесен в фоновый поток, чтобы снизить вероятность возникновения ошибок ANR.

Play Billing Library 1.2.1 Release (2019-03-04)

Вышла версия 1.2.1 библиотеки Google Play Billing. Эта версия содержит следующие изменения.

Основные изменения

Другие изменения

  • Добавлены открытые конструкторы для PurchasesResult и SkuDetailsResult для упрощения тестирования.
  • Объекты SkuDetails могут использовать новый метод getOriginalJson() .
  • Теперь все вызовы сервисов AIDL обрабатываются фоновыми потоками.

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

  • Обработчики событий, возвращающие значение null, больше не передаются в публичные API.

Выпуск библиотеки Google Play Billing 1.2 (18.10.2018)

Вышла версия 1.2 библиотеки Google Play Billing. Эта версия содержит следующие изменения.

Краткое описание изменений

  • Библиотека Google Play Billing теперь распространяется под лицензией Android Software Development Kit License Agreement .
  • Добавлен API launchPriceChangeConfirmationFlow , который предлагает пользователям проверить ожидающее изменения изменение цены подписки.
  • Добавлена ​​поддержка нового режима пропорционального распределения, DEFERRED , при повышении или понижении уровня подписки пользователя.
  • В классе BillingFlowParams setSku() была заменена на setSkuDetails() .
  • Исправлены мелкие ошибки и оптимизирован код.

Подтверждение изменения цены

Теперь вы можете изменять цену подписки в Google Play Console и предлагать пользователям ознакомиться с новой ценой и принять её при входе в ваше приложение.

Для использования этого API создайте объект PriceChangeFlowParams , используя skuDetails продукта подписки, а затем вызовите метод launchPriceChangeConfirmationFlow() . Реализуйте PriceChangeConfirmationListener для обработки результата после завершения процесса подтверждения изменения цены, как показано в следующем фрагменте кода:

Котлин

val priceChangeFlowParams = PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build()

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        object : PriceChangeConfirmationListener() {
            override fun onPriceChangeConfirmationResult(responseCode: Int) {
                // Handle the result.
            }
        })

Java

PriceChangeFlowParams priceChangeFlowParams =
        PriceChangeFlowParams.newBuilder()
    .setSkuDetails(skuDetailsOfThePriceChangedSubscription)
    .build();

billingClient.launchPriceChangeConfirmationFlow(activity,
        priceChangeFlowParams,
        new PriceChangeConfirmationListener() {
            @Override
            public void onPriceChangeConfirmationResult(int responseCode) {
                // Handle the result.
            }
        });

В процессе подтверждения изменения цены отображается диалоговое окно с новой информацией о ценах, предлагающее пользователям принять новую цену. Этот процесс возвращает код ответа типа BillingClient.BillingResponse .

Новый режим пропорционального распределения

При повышении или понижении уровня подписки пользователя можно использовать новый режим пропорционального распределения — DEFERRED . В этом режиме подписка пользователя обновляется при следующем продлении. Подробнее о настройке этого режима пропорционального распределения см. в разделе «Настройка режима пропорционального распределения» .

Новый способ указания сведений об артикуле товара.

В классе BillingFlowParams метод setSku() объявлен устаревшим. Это изменение направлено на оптимизацию процесса оплаты в Google Play.

При создании нового экземпляра BillingFlowParams в вашем приложении для выставления счетов мы рекомендуем работать непосредственно с JSON-объектом, используя setSkuDetails() , как показано в следующем фрагменте кода:

В классе BillingFlowParams Builder метод setSku() устарел. Вместо него используйте метод setSkuDetails() , как показано в следующем фрагменте кода. Объект, передаваемый в setSkuDetails() поступает из метода querySkuDetailsAsync() .

Котлин

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()
}

Java

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)

Вышла версия 1.1 библиотеки Google Play Billing. Эта версия содержит следующие изменения.

Краткое описание изменений

  • Добавлена ​​возможность указания режима пропорционального распределения в BillingFlowParams при обновлении/понижении уровня существующей подписки.
  • Логический флаг replaceSkusProration в BillingFlowParams больше не поддерживается. Вместо него используйте replaceSkusProrationMode .
  • Теперь launchBillingFlow() запускает функцию обратного вызова для получения неудачных ответов.

Изменения в поведении

В версии 1.1 библиотеки Google Play Billing внесены следующие изменения в работу.

Разработчики могут установить replaceSkusProrationMode в классе BillingFlowParams

ProrationMode предоставляет более подробную информацию о типе пропорционального распределения при повышении или понижении уровня подписки пользователя.

Котлин

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build()

Java

BillingFlowParams.newBuilder()
    .setSku(skuId)
    .setType(billingType)
    .setOldSku(oldSku)
    .setReplaceSkusProrationMode(replaceSkusProrationMode)
    .build();

Google Play поддерживает следующие режимы пропорционального распределения:

IMMEDIATE_WITH_TIME_PRORATION Замена вступает в силу немедленно, а новый срок действия будет рассчитан пропорционально и зачислен или списан с пользователя. Это текущее поведение по умолчанию.
IMMEDIATE_AND_CHARGE_PRORATED_PRICE Замена вступает в силу немедленно, и расчетный период остается прежним. Будет взиматься плата за оставшийся период.

Примечание : Эта опция доступна только при переходе на платную подписку.

IMMEDIATE_WITHOUT_PRORATION Замена вступает в силу немедленно, и новая цена будет списана при следующем подключении. Расчетный период остается прежним.

replaceSkusProration больше не поддерживается в классе BillingFlowParams

Ранее разработчики могли установить логический флаг для пропорционального начисления платы за запрос на обновление подписки. В связи с тем, что мы поддерживаем ProrationMode , который содержит более подробные инструкции по пропорциональному начислению, этот логический флаг больше не поддерживается.

launchBillingFlow() теперь вызывает функцию обратного вызова для получения неудачных ответов.

Библиотека Billing всегда будет вызывать обратный вызов PurhcasesUpdatedListener и асинхронно возвращать объект BillingResponse . Синхронное возвращаемое значение BillingResponse также сохраняется.

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

  • Корректно завершает работу асинхронных методов при отключении сервиса.
  • Объекты параметров Builder больше не изменяют построенные объекты.
  • Проблема 68087141 : launchBillingFlow() теперь запускает обратный вызов для неудачных ответов.

Выпуск библиотеки Google Play Billing 1.0 (19.09.2017, анонс )

Вышла версия 1.0 библиотеки Google Play Billing. Эта версия содержит следующие изменения.

Важные изменения

  • Встроенное разрешение на выставление счетов в манифест библиотеки. Больше нет необходимости добавлять разрешение com.android.vending.BILLING в манифест Android.
  • В класс BillingClient.Builder добавлен новый конструктор.
  • Введен паттерн "построитель" для класса SkuDetailsParams , предназначенный для использования в методах, запрашивающих информацию о товарных позициях (SKU).
  • Для обеспечения единообразия были обновлены несколько методов API (те же имена и порядок возвращаемых аргументов).

Изменения в поведении

В версии 1.0 библиотеки Google Play Billing внесены следующие изменения в работу.

Класс BillingClient.Builder

Теперь BillingClient.Builder инициализируется с помощью шаблона newBuilder:

Котлин

billingClient = BillingClient.newBuilder(context).setListener(this).build()

Java

billingClient = BillingClient.newBuilder(context).setListener(this).build();

Метод launchBillingFlow теперь вызывается с использованием класса BillingFlowParams.

Для запуска процесса выставления счетов за покупку или подписку метод launchBillingFlow() получает экземпляр BillingFlowParams , инициализированный параметрами, специфичными для запроса:

Котлин

BillingFlowParams.newBuilder().setSku(skuId)
        .setType(billingType)
        .setOldSku(oldSku)
        .build()

// Then, use the BillingFlowParams to start the purchase flow
val responseCode = billingClient.launchBillingFlow(builder.build())

Java

BillingFlowParams.newBuilder().setSku(skuId)
                              .setType(billingType)
                              .setOldSku(oldSku)
                              .build();

// Then, use the BillingFlowParams to start the purchase flow
int responseCode = billingClient.launchBillingFlow(builder.build());

Новый способ запроса информации о доступных товарах.

Аргументы для методов queryPurchaseHistoryAsync() и querySkuDetailsAsync() были обернуты в шаблон проектирования Builder:

Котлин

val params = SkuDetailsParams.newBuilder()
params.setSkusList(skuList)
        .setType(itemType)
billingClient.querySkuDetailsAsync(params.build(), object : SkuDetailsResponseListener() {
    ...
})

Java

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList)
        .setType(itemType);
billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {...})

Для вашего удобства и обеспечения единообразия во всем нашем API результат теперь возвращается в виде кода результата и списка объектов SkuDetails вместо прежнего класса-обертки:

Котлин

fun onSkuDetailsResponse(@BillingResponse responseCode: Int, skuDetailsList: List<SkuDetails>)

Java

public void onSkuDetailsResponse(@BillingResponse int responseCode, List<SkuDetails> skuDetailsList)

Изменен порядок параметров в методе onConsumeResponse()

Порядок аргументов для onConsumeResponse из интерфейса ConsumeResponseListener был изменен для обеспечения единообразия во всем нашем API:

Котлин

fun onConsumeResponse(@BillingResponse responseCode: Int, outToken: String)

Java

public void onConsumeResponse(@BillingResponse int responseCode, String outToken)

Развернутый объект PurchaseResult

Для обеспечения единообразия во всем нашем API PurchaseResult был преобразован в условную оболочку:

Котлин

fun onPurchaseHistoryResponse(@BillingResponse responseCode: Int, purchasesList: List<Purchase>)

Java

void onPurchaseHistoryResponse(@BillingResponse int responseCode, List<Purchase> purchasesList)

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

Выпуск первой предварительной версии для разработчиков (12.06.2017, анонс )

Запущена предварительная версия для разработчиков, призванная упростить процесс разработки в части выставления счетов, позволяя разработчикам сосредоточить свои усилия на реализации логики, специфичной для Android-приложений, такой как архитектура приложения и структура навигации.

Библиотека включает в себя несколько удобных классов и функций, которые вы можете использовать при интеграции ваших Android-приложений с API Google Play Billing. Библиотека также предоставляет уровень абстракции поверх сервиса Android Interface Definition Language (AIDL), что упрощает разработчикам определение интерфейса между приложением и API Google Play Billing.