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

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

Выпуск библиотеки Google Play Платежей версии 9.1.0 (18.06.2026)

Доступны версия 9.1.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 9.0.0 (19.05.2026)

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

Обзор изменений

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

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

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

  • Значение параметра "targetSdkVersion" изменено на 35.

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

Выпуск библиотеки Google Play Платежей версии 8.3.0 (23.12.2025)

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

Обзор изменений

Выпуск библиотеки Google Play Платежей 8.2.1 (15.12.2025)

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

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

Выпуск библиотеки Google Play Платежей версии 8.2.0 (09.12.2025)

Теперь доступны версия 8.2.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

Выпуск библиотеки Google Play Платежей 8.1.0 (06.11.2025)

Теперь доступны версия 8.1.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

  • Приостановленные подписки

    В метод BillingClient.queryPurchasesAsync() добавлен новый параметр, позволяющий включать приостановленные подписки при запросе подписок. Приостановленные подписки по-прежнему связаны с пользователем, но неактивны, поскольку пользователь приостановил подписку или способ оплаты для ее продления был отклонен.

    Объект Purchase, возвращаемый в прослушивателе, будет возвращать isSuspended() = true для всех приостановленных подписок. В этом случае не предоставляйте доступ к купленной подписке, а перенаправьте пользователя в центр подписок, где он сможет изменить способы оплаты или приостановить подписку, чтобы активировать ее повторно.

  • Изменения в подписках:

    • В объект BillingFlowParams.ProductDetailsParams добавлен метод setSubscriptionProductReplacementParams(), с помощью которого можно указать информацию о замене на уровне товара.

    • У объекта SubscriptionProductReplacementParams есть два метода установки:

      • setOldProductId: старый товар, который нужно заменить товаром из текущего объекта ProductDetails.
      • setReplacementMode – режим замены на уровне товара. Эти режимы по сути аналогичны SubscriptionUpdateParams, но сопоставление значений было обновлено. Добавлен новый режим замены KEEP_EXISTING, который позволяет сохранить существующий график платежей для товара.
    • SubscriptionUpdateParams setSubscriptionReplacementMode будет объявлен устаревшим. Вместо него используйте SubscriptionProductReplacementParams.setReplacementMode.

  • Обновлено minSdkVersion до версии 23.

  • Включены API для предзаказа контента, оплачиваемого однократно.

    Теперь можно использовать ProductDetails.oneTimePurchaseOfferDetails.getPreorderDetails() API, чтобы получать информацию о предзаказах.

  • Библиотека Google Play Платежей теперь поддерживает Kotlin версии 2.2.0.

Выпуск библиотеки Google Play Платежей версии 8.0.0 (30.06.2025)

Теперь доступны версия 8.0.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

  • Контент для продажи через приложение теперь называется контентом для однократных покупок.

  • Несколько способов покупки и предложений для товаров, оплачиваемых однократно.

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

  • Улучшен метод queryProductDetailsAsync().

    До версии PBL 8.0.0 метод queryProductDetailsAsync() не возвращал товары, которые не удалось получить. Это может быть связано с тем, что товар не найден или пользователю недоступны предложения. В версии PBL 8.0.0 для товаров, которые не были получены, возвращается новый код статуса на уровне товара, содержащий информацию о таких товарах. Обратите внимание, что подпись ProductDetailsResponseListener.onProductDetailsResponse() изменилась, поэтому вам нужно внести изменения в приложение. Подробнее о том, как обрабатывать результат…

  • Автоматическое восстановление подключения к сервису.

    Новый параметр BillingClient.Builder.enableAutoServiceReconnection() builder позволяет разработчикам включить автоматическое повторное подключение к сервису Play Платежи. Это упрощает управление подключением, поскольку в случае его разрыва не нужно вручную вызывать startConnection(). Подробнее о том, как автоматически восстановить подключение…

  • Коды дополнительных ответов для метода launchBillingFlow().

    BillingResult, возвращаемый из launchBillingFlow(), теперь будет включать поле кода подзапроса. Это поле заполняется только в некоторых случаях, чтобы указать более точную причину ошибки. Поле sub-response может иметь следующие значения:

    • 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 Платежей версии 7.1.1 (03.10.2024)

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

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

Выпуск библиотеки Google Play Платежей версии 7.1.0 (19.09.2024)

Теперь доступны версия 7.1.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

  • Улучшена безопасность потоков, связанных со статусом подключения и управлением.
  • Внедрены частичные изменения для тестирования кодов ответа BillingResult, которые полностью реализованы в библиотеке Play Платежей версии 7.1.1. Чтобы протестировать интеграцию с помощью этой функции, вам нужно обновить библиотеку Play Платежей до версии 7.1.1. Обнаружена ошибка, которая влияет только на приложения с включенным тестированием переопределений платежей и не затрагивает обычное использование. Подробнее BillingResult о кодах ответов…

Выпуск библиотеки Google Play Платежей 7.0.0 (14.05.2024)

Теперь доступны версия 7.0.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 6.2.1 (16.04.2024)

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

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 6.2.0 (06.03.2024)

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

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 6.1.0 (14.11.2023)

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

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 6.0.1 (22.06.2023)

Теперь доступны версия 6.0.1 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

Обновите библиотеку Play Платежей, чтобы она была совместима с Android 14.

Выпуск библиотеки Google Play Платежей версии 6.0 (10.05.2023)

Теперь доступны версия 6.0.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

  • Добавлен новый перечисляемый тип ReplacementMode, который заменит ProrationMode.

    Обратите внимание, что ProrationMode по-прежнему доступен для обеспечения обратной совместимости.

  • Удален идентификатор заказа для покупок PENDING.

    Раньше идентификатор заказа создавался всегда, даже если покупка была в ожидании. Начиная с версии 6.0.0, идентификатор заказа не будет создаваться для покупок, находящихся в состоянии ожидания. Для таких покупок идентификатор заказа будет заполняться после того, как покупка перейдет в состояние PURCHASED.

  • Удалены методы queryPurchases и launchPriceConfirmationFlow.

    Методы queryPurchases и launchPriceConfirmationFlow, ранее отмеченные как устаревшие, теперь удалены из библиотеки платежей Google Play версии 6.0.0. Разработчикам следует использовать queryPurchasesAsync вместо queryPurchases. Альтернативы для launchPriceConfirmationFlow описаны в разделе Изменение цен.

  • Добавлен новый код ответа на ошибку сети.

    В версии PBL 6.0.0 и более поздних добавлен новый код ошибки сети: NETWORK_ERROR. Этот код возвращается, когда возникает ошибка из-за проблем с подключением к сети. Ранее ошибки подключения к сети обозначались как SERVICE_UNAVAILABLE.

  • Обновлено SERVICE_UNAVAILABLE и SERVICE_TIMEOUT.

    Начиная с версии 6.0.0, ошибки, связанные с истечением времени ожидания при обработке, будут возвращаться как SERVICE_UNAVAILABLE вместо SERVICE_TIMEOUT.

    В более ранних версиях PBL поведение не меняется.

  • Удалено:SERVICE_TIMEOUT.

    Начиная с версии 6.0.0, SERVICE_TIMEOUT больше не будет возвращаться. Предыдущие версии библиотеки Google Play Платежей также будут возвращать этот код.

  • Добавлены дополнительные журналы.

    В библиотеке Play Платежей версии 6 добавлено ведение журнала, которое позволяет отслеживать использование API (например, успешные и неудачные вызовы) и проблемы с подключением к сервису. Эта информация будет использоваться для повышения эффективности библиотеки Play Платежей и улучшения поддержки при возникновении ошибок.

Выпуск библиотеки Google Play Платежей 5.2.1 (22.06.2023)

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

Обзор изменений

Обновите библиотеку Play Платежей, чтобы она была совместима с Android 14.

Выпуск библиотеки Google Play Платежей версии 5.2 (06.04.2023)

Теперь доступны версия 5.2.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 5.1 (31.10.2022)

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

В этой версии внесены следующие изменения:

Обзор изменений

Выпуск библиотеки Google Play Платежей версии 5.0 (11.05.2022)

Теперь доступны версия 5.0.0 библиотеки Google Play Платежей и расширения Kotlin.

В этой версии внесены следующие изменения:

Обзор изменений

  • Добавлена новая модель подписок, включающая новые объекты, которые позволяют создавать несколько предложений для одного продукта с подпиской. Подробную информацию об этом вы найдете в руководстве по переходу.
  • Добавлен параметр BillingClient.queryProductDetailsAsync() вместо BillingClient.querySkuDetailsAsync().
  • Добавлен метод setIsOfferPersonalized() для требований о раскрытии информации о персонализированных ценах в ЕС. Подробнее о том, как указать персонализированную цену…
  • Удален метод queryPurchases(), который ранее был признан устаревшим и заменен на метод queryPurchasesAsync, добавленный в библиотеку Google Play Платежей версии 4.0.0.
  • launchPriceChangeFlow больше не поддерживается и будет удален. Подробнее о подтверждении изменения цены…
  • Удален метод setVrPurchaseFlow(), который ранее использовался при инициализации процесса покупки. В предыдущих версиях этот метод перенаправлял пользователя для завершения покупки на устройство Android. После удаления этого метода пользователи будут совершать покупки в рамках стандартного процесса покупки.

Выпуск библиотеки Google Play Платежей версии 4.1 (23.02.2022)

Теперь доступны версия 4.1.0 библиотеки Google Play Платежей и расширения Kotlin.

В этой версии внесены следующие изменения:

Обзор изменений

  • Добавлен параметр BillingClient.showInAppMessages(), который помогает обрабатывать отклоненные платежи за подписку. Подробнее о том, как использовать сообщения в приложении для обработки отклоненных платежей за подписку, рассказывается в статье Обработка отклоненных платежей.

Выпуск библиотеки Google Play Платежей версии 4.0 (18.05.2021)

Теперь доступны версия 4.0.0 библиотеки Google Play Платежей и расширения Kotlin.

Обзор изменений

  • Добавлено правило BillingClient.queryPurchasesAsync() вместо правила BillingClient.queryPurchases(), которое будет удалено в будущем выпуске.

  • Добавлен новый режим замены подписки: IMMEDIATE_AND_CHARGE_FULL_PRICE.

  • Добавлен метод BillingClient.getConnectionState() для получения статуса подключения библиотеки Play Платежей.

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

Теперь доступны версии 3.0.3 библиотеки Google Play Платежей, расширения Kotlin и плагина Unity.

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

  • Устранена утечка памяти при вызове endConnection().
  • Исправлена проблема, при которой библиотека Google Play Платежей использовалась приложениями с режимом запуска одной задачи. A onPurchasesUpdated() Обратный вызов будет активирован, когда приложение будет возобновлено из панели запуска Android и платежное диалоговое окно было видно до приостановки.

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

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

Выпуск библиотеки Google Play Платежей версии 3.0.2 (24.11.2020)

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

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

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

Выпуск библиотеки Google Play Платежей 3.0.1 (30.09.2020)

Теперь доступны версия 3.0.1 библиотеки Google Play Платежей и расширение Kotlin.

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

  • Исправлена ошибка, из-за которой при закрытии и восстановлении приложения во время процесса оплаты функция PurchasesUpdatedListener могла не вызываться с результатом покупки.

Выпуск библиотеки Google Play Платежей 3.0 (8 июня 2020 г.)

Теперь доступны версии 3.0.0 библиотеки Google Play Платежей, расширения Kotlin и плагина Unity.

Обзор изменений

  • Удалена поддержка SKU с вознаграждением.
  • Удалены параметры ChildDirected и UnderAgeOfConsent.
  • Удалены устаревшие методы для работы с данными разработчика.
  • Удалены устаревшие методы BillingFlowParams.setAccountId() и BillingFlowParams.setDeveloperId().
  • Удалены устаревшие методы BillingFlowParams.setOldSkus(String oldSku) и BillingFlowParams.addOldSku(String oldSku).
  • Добавлены аннотации о допустимости значения NULL.

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

  • SkuDetails.getIntroductoryPriceCycles() теперь возвращает int вместо String.
  • Исправлена ошибка, из-за которой платежный процесс считался имеющим дополнительные параметры, даже если они не были заданы.

Выпуск библиотеки Google Play Платежей 2.2.1 (20.05.2020)

Доступна версия 2.2.1 библиотеки Google Play Платежей.

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

  • Обновлена версия библиотеки Google Play Платежей для Java, от которой зависит расширение Kotlin.

Выпуск библиотеки Google Play Платежей 2.2.0 и поддержка Unity (23 марта 2020 г.)

Версия 2.2.0 Google Play Платежей позволяет разработчикам связывать покупки с нужными пользователями. Эти изменения позволяют отказаться от создания специальных решений на основе полезной нагрузки разработчика. В рамках этого обновления функция полезной нагрузки разработчика была признана устаревшей и будет удалена в будущем выпуске. Подробнее о полезной нагрузке разработчика…

Библиотека Google Play Платежей 2 для Unity

Помимо текущих версий библиотеки Google Play Платежей 2 на Java и Kotlin, мы выпустили версию для Unity. Разработчики игр, использующие API для покупок в приложении Unity, могут перейти на библиотеку Google Play Платежей версии 2, чтобы воспользоваться всеми ее функциями и упростить переход на будущие версии.

Подробнее о том, как использовать Google Play Платежи с Unity…

Обзор изменений

Выпуск библиотеки Google Play Платежей 2.1.0 и расширения Kotlin 2.1.0 (10 декабря 2019 г.)

Теперь доступны версия 2.1.0 библиотеки Google Play Платежей и новое расширение Kotlin. Расширение Kotlin для библиотеки платежей Play предоставляет идиоматические альтернативы API для использования в Kotlin, отличающиеся более высоким уровнем безопасности при работе с нулевыми значениями и сопрограммами. Примеры кода можно найти в разделе Как использовать библиотеку Google Play Платежей.

В этой версии внесены следующие изменения:

Обзор изменений

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

Выпуск библиотеки Google Play Платежей 2.0.3 (5 августа 2019 г.)

Доступна версия 2.0.3 библиотеки Google Play Платежей.

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

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

Выпуск библиотеки Google Play Платежей 2.0.2 (08.07.2019)

Доступна версия 2.0.2 библиотеки Google Play Платежей. В этой версии обновлена справочная документация. Функциональность библиотеки не изменилась.

Выпуск библиотеки Google Play Платежей 2.0.1 (6 июня 2019 г.)

Доступна версия 2.0.1 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

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

  • Исправлена ошибка, из-за которой в некоторых случаях отладочные сообщения возвращались как null.
  • Устранена потенциальная утечка памяти.

Выпуск библиотеки Google Play Платежей версии 2.0 (07.05.2019)

Теперь доступна версия 2.0 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

Подтверждать покупки нужно в течение трех дней

В Google Play поддерживаются покупки товаров как в приложении, так и за его пределами. Чтобы обеспечить единообразный процесс покупки независимо от того, где пользователь приобретает ваш продукт, вы должны подтверждать все покупки, совершенные через библиотеку Google Play Платежей, как можно скорее после предоставления пользователю доступа к контенту. Если вы не подтвердите покупку в течение трех дней, средства будут автоматически возвращены пользователю, а Google Play отменит покупку. Для ожидающих транзакций (новая функция версии 2.0) трехдневный период начинается, когда покупка переходит в состояние PURCHASED, и не применяется, пока она находится в состоянии PENDING.

Для подписок необходимо подтверждать все покупки с новым токеном покупки. Это означает, что вам нужно подтверждать все первоначальные покупки, смены тарифного плана и повторные регистрации, но не нужно подтверждать последующие продления. Чтобы узнать, нужно ли подтверждение покупки, проверьте поле acknowledgement в объекте Purchase.

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

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

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

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

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

Примеры кода можно найти в разделе Как использовать библиотеку Google Play Платежей.

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

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

Чтобы получить доступ к полезной нагрузке в новой библиотеке, объекты Purchase теперь включают метод getDeveloperPayload().

Соответствие предложений

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

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

  • getOriginalPriceAmountMicros()
    • возвращает исходную цену SKU без скидки.
  • getOriginalPrice()
    • возвращает исходную цену с дополнительным форматированием валюты.

Транзакции, ожидающие подтверждения

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

Чтобы включить ожидающие покупки, вызовите метод enablePendingPurchases() при инициализации приложения.

Используйте параметр Purchase.getPurchaseState(), чтобы определить, является ли статус покупки PURCHASED или PENDING. Обратите внимание, что предоставлять право на просмотр следует только в том случае, если статус имеет значение PURCHASED. Чтобы проверить статус Purchase, выполните следующие действия:

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

Кроме того, в Google Play Developer API для Purchases.products предусмотрено состояние PENDING. Транзакции, ожидающие подтверждения, не поддерживаются для подписок.

В этом выпуске также добавлен новый тип уведомлений для разработчиков в режиме реального времени – OneTimeProductNotification. Уведомление этого типа содержит одно сообщение со значением ONE_TIME_PRODUCT_PURCHASED или ONE_TIME_PRODUCT_CANCELED. Уведомления этого типа отправляются только при покупках, оплаченных способами с отложенным платежом, например наличными.

При обработке покупок, ожидающих подтверждения, убедитесь, что вы подтверждаете только покупки со статусом PURCHASED, а не PENDING.

Изменения в API

В версии 2.0 библиотеки платежей Google Play внесены изменения в 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 Платежей 1.2.2 (07.03.2019)

Доступна версия 1.2.2 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

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

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

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

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

Выпуск библиотеки Play Платежей 1.2.1 (4 марта 2019 г.)

Теперь доступна версия 1.2.1 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

Значительные изменения

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

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

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

  • В общедоступные API больше не передаются прослушиватели обратного вызова со значением null.

Выпуск библиотеки Google Play Платежей 1.2 (18 октября 2018 г.)

Доступна версия 1.2 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

Обзор изменений

  • Теперь библиотека Google Play Платежей лицензируется в соответствии с Лицензионным соглашением на пакет средств разработки ПО для Android.
  • Добавлен API launchPriceChangeConfirmationFlow, который предлагает пользователям проверить отложенное изменение цены подписки.
  • Добавлена поддержка нового режима пропорционального распределения DEFERRED при переходе на более дорогой или дешевый тарифный план.
  • В классе BillingFlowParams заменили setSku() на setSkuDetails().
  • Исправлены незначительные ошибки и оптимизирован код.

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

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

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

Kotlin

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. В этом режиме подписка пользователя будет обновлена при следующем продлении. Подробнее о том, как задать режим пропорционального распределения…

Новый способ указания сведений о SKU

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

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

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

Kotlin

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 Платежей 1.1 (7 мая 2018 г.)

Доступна версия 1.1 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

Обзор изменений

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

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

Версия 1.1 библиотеки Google Play Платежей содержит следующие изменения в поведении:

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

ProrationMode – это дополнительная информация о типе пропорционального расчета при переходе на более дорогой или дешевый тарифный план.

Kotlin

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() теперь вызывает обратный вызов для ответов с ошибками

Библиотека Платежей всегда вызывает обратный вызов PurhcasesUpdatedListener и асинхронно возвращает BillingResponse. Также сохраняется синхронное возвращаемое значение BillingResponse.

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

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

Выпуск библиотеки Google Play Платежей 1.0 (19 сентября 2017 г., анонс)

Доступна версия 1.0 библиотеки Google Play Платежей. В этой версии внесены следующие изменения:

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

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

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

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

Класс BillingClient.Builder

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

Kotlin

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

Java

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

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

Чтобы запустить сценарий оплаты покупки или подписки, метод launchBillingFlow() получает экземпляр BillingFlowParams, инициализированный с помощью параметров, относящихся к запросу:

Kotlin

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:

Kotlin

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

Теперь результат возвращается с помощью кода результата и списка объектов SkuDetails, а не предыдущего класса-оболочки. Это сделано для удобства и единообразия API.

Kotlin

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

Java

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

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

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

Kotlin

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

Java

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

Объект PurchaseResult без обертки

PurchaseResult был развернут, чтобы обеспечить единообразие в нашем API:

Kotlin

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

Java

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

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

Версия Developer Preview 1 (12 июня 2017 г., анонс)

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

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