В этом документе описывается, как осуществить миграцию с Google Play Billing Library (PBL) 7 или 8 на PBL 9 и как интегрировать новые функции.
Полный список изменений в версии 9.0.0 см. в примечаниях к выпуску .
Обзор
В PBL 9 внесены улучшения в существующие API, а также удалены ранее устаревшие API. Эта версия библиотеки также предоставляет более полную информацию об ошибках благодаря новым кодам подответов.
Обратная совместимость для обновления PBL
Для перехода на PBL 9 необходимо обновить или удалить некоторые из существующих ссылок на API в вашем приложении, как описано в примечаниях к выпуску и далее в этом руководстве по миграции.
Обновление с PBL 7 или 8 до PBL 9
Для обновления с PBL 7 или 8 до PBL 9 выполните следующие действия:
Обновите версию зависимости Play Billing Library в файле
build.gradleвашего приложения.dependencies { def billing_version = "9.0.0" implementation "com.android.billingclient:billing:$billing_version" }Если вы используете Kotlin, модуль KTX библиотеки Google Play Billing содержит расширения Kotlin и поддержку сопрограмм, позволяющие писать идиоматические коды на Kotlin при использовании библиотеки Google Play Billing. Чтобы включить эти расширения в свой проект, добавьте следующую зависимость в файл
build.gradleвашего приложения, как показано ниже:dependencies { val billing_version = "9.0.0" implementation("com.android.billingclient:billing-ktx:$billing_version") }(Применимо только при обновлении с PBL 7 до PBL 9). Обновите реализацию метода
queryProductDetailsAsync.Произошло изменение сигнатуры метода
ProductDetailsResponseListener.onProductDetailsResponse, что требует внесения изменений в реализациюqueryProductDetailsAsyncв вашем приложении. Для получения дополнительной информации см. раздел «Показ товаров, доступных для покупки» .Обработайте удалённые API.
В таблице ниже перечислены удаленные API и соответствующие им альтернативные API, которые необходимо использовать в вашем приложении.
Обновить с
PBL 9 больше не поддерживает API, перечисленные в следующей таблице. Если в вашей реализации используются какие-либо из этих удаленных API, обратитесь к таблице для получения информации о соответствующих альтернативных API.
Удалён ранее устаревший API Альтернативный API для использования API queryPurchaseHistoryAsync См. раздел «История покупок» . Если вы использовали queryPurchaseHistoryAsync для определения права на бесплатные пробные периоды, теперь следует использовать ProductDetails.getSubscriptionOfferDetails() для определения того, на какие предложения пользователь имеет право. BillingClient.SkuType Константы типов продуктов INAPP и SUBS функционально аналогичны устаревшим константам типов SKU. SkuDetails ProductDetails . Это новая модель данных, поддерживающая разовые продукты. SkuDetailsParams Используйте QueryProductDetailsParams с queryProductDetailsAsync . SkuDetailsResponseListener Используйте ProductDetailsResponseListener с queryProductDetailsAsync . QueryPurchaseHistoryParams - Используйте queryPurchasesAsync для активных или ожидающих оформления покупок.
- Отслеживайте совершенные покупки на своих внутренних серверах.
- Для аннулирования или отмены покупок используйте серверный API для аннулированных покупок.
getSkuDetailsList и setSkuDetailsList Используйте BillingFlowParams.Builder.setProductDetailsParamsList querySkuDetailsAsync queryProductDetailsAsync enablePendingPurchases() (API без параметров) enablePendingPurchases(PendingPurchasesParams params)
Обратите внимание, что устаревшая функция enablePendingPurchases() функционально эквивалентна функцииenablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()).queryPurchasesAsync(String skuType, PurchasesResponseListener listener) queryPurchasesAsync Обновить с
В таблице ниже перечислены API, удаленные в PBL 9, и соответствующие альтернативные API, которые необходимо использовать в вашем приложении.
Удалён ранее устаревший API Альтернативный API для использования BillingClient.SkuType Константы типов продуктов INAPP и SUBS функционально аналогичны устаревшим константам типов SKU. SkuDetails ProductDetails . Это новая модель данных, поддерживающая разовые продукты. SkuDetailsParams Используйте QueryProductDetailsParams с queryProductDetailsAsync . SkuDetailsResponseListener Используйте ProductDetailsResponseListener с queryProductDetailsAsync . QueryPurchaseHistoryParams - Используйте queryProductDetailsAsync для активных или ожидающих оформления покупок.
- Отслеживайте совершенные покупки на своих внутренних серверах.
- Для аннулирования или отмены покупок используйте серверный API для аннулированных покупок.
getSkuDetailsList и setSkuDetailsList Используйте BillingFlowParams.Builder.setProductDetailsParamsList (Рекомендуется) Включить автоматическое переподключение к службе.
Библиотека Play Billing может попытаться автоматически восстановить соединение со службой, если вызов API выполняется во время отключения службы. Для получения дополнительной информации см. раздел «Включение автоматического переподключения к службе» .
Обработка новых кодов подответов.
Теперь объект BillingResult, возвращаемый функцией
launchBillingFlow(), будет содержать поле с кодом подответа. Это поле будет заполняться только в некоторых случаях для указания более конкретной причины сбоя. Поле подответа может принимать следующие значения:-
PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS- Возвращается, когда на счету пользователя меньше стоимости товара, который он пытается приобрести. -
USER_INELIGIBLE— Возвращается, если пользователь не соответствует заданным требованиям для получения подписки. -
NO_APPLICABLE_SUB_RESPONSE_CODE— значение по умолчанию, возвращаемое, если ни один другой код подответа не применим.
Этап миграции : Обновите обработчик результатов
PurchasesUpdatedListenerили аналогичный инструмент, чтобы он распознавал и обрабатывал эти конкретные коды подответов для улучшения пользовательского опыта. Например, предложите исправить способы оплаты или покажите конкретное сообщение об ошибке.-
Учет переклассификации кодов ошибок.
В случаях, когда приложение Play Store блокируется системой (например, в пользовательском детском режиме, настроенном производителем), код ответа от PBL изменился с
ERRORнаBILLING_UNAVAILABLE.Этап миграции : Убедитесь, что ваша логика обработки ошибок учитывает это изменение и не полагается на получение общей ошибки в этих конкретных сценариях.
Обработка возможности получения значения null при вызове
DeveloperProvidedBillingDetails.getLinkUri().Если вы используете
DeveloperProvidedBillingDetailsв рамках внешней интеграции платежей,getLinkUri()теперь имеет@Nullable.Этап миграции : Чтобы безопасно обработать это изменение, убедитесь, что ваш код интеграции обрабатывает как значения
null, так и пустые строковые значения ("") из методаDeveloperProvidedBillingDetails.getLinkUri()перед анализом или запуском намерений браузера. Например:Котлин
val linkUri = details.getLinkUri() if (!linkUri.isNullOrEmpty()) { val intent = Intent(Intent.ACTION_VIEW, Uri.parse(linkUri)) context.startActivity(intent) }Java
String linkUri = details.getLinkUri(); if (!android.text.TextUtils.isEmpty(linkUri)) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(linkUri)); context.startActivity(intent); }Дополнительные изменения по желанию.
Поддержка обработки незавершенных покупок для предоплаченных тарифных планов. Для получения дополнительной информации см. раздел «Обработка подписок и незавершенных транзакций» .
Виртуальные подписки в рассрочку. Для получения дополнительной информации см. раздел «Интеграция подписок в рассрочку» .