Как перейти на библиотеку Google Play Платежей версии 9 с версии 7 или 8

В этом документе описано, как перейти с библиотеки Google Play Платежей версии 7 или 8 на версию 9 и как интегрировать новые функции.

Полный список изменений в версии 9.0.0 приведен в примечаниях к выпуску.

Обзор

В PBL 9 улучшены существующие API и удалены устаревшие. В этой версии библиотеки также представлены новые коды дополнительных ответов, которые позволяют получить более подробную информацию об ошибках.

Обратная совместимость для обновления PBL

Чтобы перейти на PBL 9, вам нужно обновить или удалить некоторые ссылки на API в приложении, как описано в примечаниях к выпуску и далее в этом руководстве по переносу.

Как перейти с PBL 7 или 8 на PBL 9

Чтобы перейти с PBL 7 или 8 на PBL 9, выполните следующие действия:

  1. Обновите версию зависимости библиотеки Play Платежей в файле build.gradle приложения.

    dependencies {
      def billing_version = "9.1.0"
      implementation "com.android.billingclient:billing:$billing_version"
    }
    

    Если вы используете Kotlin, то модуль KTX библиотеки Google Play Платежей содержит расширения Kotlin и поддержку сопрограмм, которые позволяют писать идиоматический код Kotlin при использовании библиотеки Google Play Платежей. Чтобы включить эти расширения в проект, добавьте в файл build.gradle приложения следующую зависимость:

    dependencies {
      val billing_version = "9.1.0"
      implementation("com.android.billingclient:billing-ktx:$billing_version")
    }
    
  2. (Применимо только при обновлении с PBL 7 до PBL 9). Обновите реализацию метода queryProductDetailsAsync.

    Изменилась сигнатура метода ProductDetailsResponseListener.onProductDetailsResponse, поэтому вам нужно изменить реализацию queryProductDetailsAsync в приложении. Подробнее о наличии товаров, доступных для покупки…

  3. Обработайте удаленные API.

    В таблице ниже перечислены удаленные API и альтернативные API, которые нужно использовать в приложении.

    Переход с

    В PBL 9 больше не поддерживаются API, перечисленные в таблице ниже. Если в вашей реализации используются какие-либо из этих удаленных API, ознакомьтесь с таблицей, чтобы узнать, какие API можно использовать вместо них.

    Удален API, ранее признанный устаревшим Альтернативный API
    API queryPurchaseHistoryAsync Подробнее о запросе истории покупок… Если вы использовали queryPurchaseHistoryAsync, чтобы определить, имеет ли пользователь право на бесплатный пробный период, теперь вам нужно использовать ProductDetails.getSubscriptionOfferDetails().
    BillingClient.SkuType BillingClient.ProductType. Константы типов товаров INAPP и SUBS функционально аналогичны устаревшим константам типов SKU.
    SkuDetails ProductDetails. Это новая модель данных, которая поддерживает контент для однократных покупок.
    SkuDetailsParams Используйте QueryProductDetailsParams с queryProductDetailsAsync.
    SkuDetailsResponseListener Используйте ProductDetailsResponseListener с queryProductDetailsAsync.
    QueryPurchaseHistoryParams
    • Используйте queryPurchasesAsync для активных или незавершенных покупок.
    • Отслеживайте использованные покупки на своих серверах.
    • Используйте серверный Voided Purchases 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 BillingClient.ProductType. Константы типов товаров INAPP и SUBS функционально аналогичны устаревшим константам типов SKU.
    SkuDetails ProductDetails. Это новая модель данных, которая поддерживает контент для однократных покупок.
    SkuDetailsParams Используйте QueryProductDetailsParams с queryProductDetailsAsync.
    SkuDetailsResponseListener Используйте ProductDetailsResponseListener с queryProductDetailsAsync.
    QueryPurchaseHistoryParams
    • Используйте queryProductDetailsAsync для активных или незавершенных покупок.
    • Отслеживайте использованные покупки на своих серверах.
    • Используйте серверный Voided Purchases API для отмененных или аннулированных покупок.
    getSkuDetailsList и setSkuDetailsList Используйте BillingFlowParams.Builder.setProductDetailsParamsList.

  4. Включите автоматическое повторное подключение к сервису (рекомендуется).

    Библиотека Play Платежей может попытаться автоматически восстановить подключение к сервису, если вызов API выполняется, когда сервис отключен. Подробнее о том, как включить автоматическое повторное подключение сервиса…

  5. Обрабатывайте новые дополнительные коды ответов.

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

    • PAYMENT_DECLINED_DUE_TO_INSUFFICIENT_FUNDS – возвращается, если у пользователя недостаточно средств для покупки.
    • USER_INELIGIBLE – возвращается, если пользователь не соответствует требованиям для специального предложения.
    • NO_APPLICABLE_SUB_RESPONSE_CODE – значение по умолчанию, которое возвращается, если не подходит ни один другой код дополнительного ответа.

    Шаг переноса. Обновите обработку результатов PurchasesUpdatedListener или эквивалентных им, чтобы распознавать эти дополнительные коды ответов и реагировать на них. Это позволит повысить удобство для пользователей. Например, может появиться предложение исправить способ оплаты или сообщение об ошибке.

  6. Осведомленность о реклассификации кодов ошибок.

    В случаях, когда приложение Google Play заблокировано системой (например, в детском режиме, настроенном производителем), код ответа от PBL изменен с ERROR на BILLING_UNAVAILABLE.

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

  7. Обработка допустимости значения NULL для DeveloperProvidedBillingDetails.getLinkUri().

    Если вы используете DeveloperProvidedBillingDetails в рамках интеграции внешних платежей, getLinkUri() теперь называется @Nullable.

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

    Kotlin

    Java

    String linkUri = details.getLinkUri();
    if (!android.text.TextUtils.isEmpty(linkUri)) {
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(linkUri));
      context.startActivity(intent);
    }
    
  8. Необязательные изменения.