Примечания к выпуску библиотеки 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)

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

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

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

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

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

  • Значение targetSdkVersion изменено на 35.

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

Выпуск библиотеки 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 предзаказа для контента для однократных покупок.

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

  • Библиотека 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() позволяет разработчикам включить автоматическое повторное подключение к сервису. Это упрощает управление подключениями, поскольку повторные подключения к 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)

Выпущены библиотека Google Play Платежей версии 7.1.0 и расширения 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, которые ранее были помечены как устаревшие, удалены из Play Billing Library 6.0.0. Разработчикам следует использовать queryPurchasesAsync вместо queryPurchases. Альтернативные варианты для launchPriceConfirmationFlow описаны в разделе Изменение цен.

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

    Начиная с версии 6.0.0 библиотеки Play Платежей, добавлен новый код ответа на ошибку сети – NETWORK_ERROR. Этот код возвращается, когда ошибка возникает из-за проблем с сетевым подключением. Ранее эти ошибки сетевого подключения регистрировались как SERVICE_UNAVAILABLE.

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

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

    В более ранних версиях Play Billing Library поведение не изменится.

  • Удалено: SERVICE_TIMEOUT.

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

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

    В Play Billing Library 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.

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

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

Выпуск библиотеки 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 Платежей использовалась приложениями с режимом запуска singleTask. Обратный вызов onPurchasesUpdated() будет запущен, когда приложение возобновит работу из панели запуска Android, а диалоговое окно оплаты было видно до приостановки.

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

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

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

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

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

  • Исправлена ошибка в расширении Kotlin, из-за которой сопрограмма завершалась с ошибкой "Already resumed".
  • Исправлены неразрешенные ссылки, возникавшие при использовании расширения 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.03.2020)

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

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

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

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

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

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

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

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

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

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

Выпуск библиотеки Google Play Платежей 2.0.3 (05.08.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 (06.06.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.

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

Объект 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 Billing.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Изменения в API

В версии 2.0 библиотеки Google Play Billing Library есть несколько изменений 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 (04.03.2019)

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

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

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

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

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

  • Прослушиватели обратных вызовов Null больше не передаются в общедоступные API.

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

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

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

  • Теперь библиотека Google Play Billing лицензируется в соответствии с Лицензионным соглашением на использование пакета средств разработки ПО для 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 (07.05.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() теперь запускает обратный вызов для неудачных ответов.

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

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

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

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

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

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

  • Разрешение на встроенные платежи в манифесте библиотеки. Добавлять разрешение com.android.vending.BILLING в манифест Android больше не нужно.
  • В класс BillingClient.Builder добавлен новый конструктор.
  • В класс SkuDetailsParams добавлен шаблон Builder, который будет использоваться в методах для запроса 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)

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

Предварительная версия для разработчиков 1 (12 июня 2017 г., объявление)

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

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