Обзор Google Play Billing 4.0

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет, меня зовут Маша, я SDK Engineer в qonversion.io.

Qonversion — это платформа для работы с подписками в мобильных приложениях. Наши SDKs позволяют встраивать покупки в приложения; обрабатывать пуш-уведомления, инициированные событиями in-app покупок; анализировать бизнес подписок в собственных дашбордах и отправлять данные в маркетинговые платформы (такие как Appsflyer, Amplitude и прочие). Qonversion также позволяет проводить A/B тестирование для определения оптимальных продуктовых предложений: цен,  длительности подписки и триала и др.

Сегодня речь пойдет о библиотеке Google Play Billing Library 4.0.0, которая к концу этого года должна открыть новые возможности для приложений со встроенными покупками.

Согласно анонсу Google, четвертая версия Billing Library позволит оптимизировать покупки внутри приложений:

  • Появится возможность приобретать несколько расходуемых (consumable) in-app продуктов единовременно. На данный момент можно покупать только 1 единицу продукта за раз. 

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

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

Так как еще не все перешли на Billing Library v4, я бы хотела рассказать, на что стоит обратить внимание при миграции на новую версию.

Основные изменения в 4-й версии Google Play Billing Library

1. Background & Main: фоновый и главный потоки

Теперь callback-и методов вызываются в фоновом потоке (в предыдущей версии они вызывались из главного).  Чтобы убедиться в этом, например, можно вывести в лог название текущего потока в методе onBillingSetupFinished интерфейса BillingClientStateListener:

if (Looper.getMainLooper().thread == Thread.currentThread()) {
   Log.d("TestThread", "Main thread is running.")
} else {
   Log.d("TestThread", "${Thread.currentThread().name} thread is running.")
}

В логах можно будет увидеть следующий результат для разных версий библиотеки:

  • Billing Library v4: D/TestThread: PlayBillingLibrary-1 thread is running.

  • Billing Library v3: D/TestThread: Main thread is running.

Если требуется изменить пользовательский интерфейс прямо из callback-а, важно помнить, что взаимодействие с UI невозможно без переключения обратно в главный поток.

2. queryPurchasesAsync() для извлечения активных покупок пользователя
Метод queryPurchases() больше не актуален. Теперь, чтобы получить  информацию об активных подписках и нерасходуемых покупках (они же non-consumable) в приложении, нужно использовать метод queryPurchasesAsync():

private fun queryPurchasesAsync() {
   // Fetch active subscriptions and non-consumable in-app purchases
   billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, this)
   billingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP, this)
}

Чтобы получить ответ, необходимо реализовать интерфейс PurchasesResponseListener и переопределить его метод onQueryPurchasesResponse:

/**
* Callback that will be called when queryPurchasesAsync is called
*/
override fun onQueryPurchasesResponse(
   billingResult: BillingResult,
   purchases: MutableList<Purchase>
) {
   // process purchases
}

3. Новый способ для downgrade/upgrade подписок

Раньше для обновления подписки необходимо было предоставить значение SkuDetails, sku (он же идентификатор) и токен старой подписки, а также опционально ProrationMode:

private fun updatePurchase(skuDetails: SkuDetails) {
   val params = BillingFlowParams.newBuilder()
       .setSkuDetails(skuDetails)
       .setOldSku("oldSku", "oldPurchaseToken")
       .setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE)
       .build()
 
   billingClient.launchBillingFlow(this, params)
}

Теперь для выполнения downgrade или upgrade подписки нужно вызвать BillingFlowParams.Builder.setSubscriptionUpdateParams() и передать объект SubscriptionUpdateParams в качестве параметра. Метод setOldSku() был удален.

private fun updatePurchase(skuDetails: SkuDetails) {
   val updateParams = BillingFlowParams.SubscriptionUpdateParams.newBuilder()
       .setOldSkuPurchaseToken("oldPurchaseToken")
       .setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE)
       .build()
 
   val billingFlowParams = BillingFlowParams.newBuilder()
       .setSkuDetails(skuDetails)
       .setSubscriptionUpdateParams(updateParams)
       .build()
 
   billingClient.launchBillingFlow(this, billingFlowParams)
}

4. Multi-quantity purchases (пока недоступны, ждем релиза)

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

Это сильно упрощает процессы покупки и продажи. Теперь пользователи смогут купить несколько единиц расходуемого продукта  (они же consumable in-app продукты, например, монетки, мана) в один клик, а не покупать их многократно разными транзакциями. 

Чтобы получить количество купленного продукта, можно использовать новые методы Purchase.getQuantity() и PurchaseHistoryRecord.getQuantity().

5.Multi-line subscriptions (пока недоступны, ждем релиза)

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

Например, пользователь сможет купить курс по изучению Java, Kotlin, а потом дополнить этот набор Swift.

Чтобы получить идентификаторы продуктов покупки, используйте методы Purchase.getSkus() и PurchaseHistoryRecord.getSkus() (метод getSku() более недоступен). 

Что в итоге? 

Конечно, Google Play Billing Library 4.0.0 здорово оптимизирует процессы покупок внутри приложения. Если говорить о технических деталях, то новшества на мобильной стороне могут показаться не фундаментальными. Но нужно учитывать и изменения на сервере. Например, если вы собираете аналитику по покупкам, в запросе purchase появится новое поле quantity; в поле для идентификатора продукта теперь может передаваться массив ids. Также выглядит, что количество запросов на ваш сервер хоть и на малую долю, но уменьшится за счет единовременных покупок. Почитать о прочих изменениях в библиотеке можно в release notes.

Кто уже перешел на Google billing 4.0.0? Какие сложности вы заметили при переходе или использовании? Будет интересно обсудить.

Источник: https://habr.com/ru/post/584580/


Интересные статьи

Интересные статьи

При слове «тонометр» внутреннему взору предстает древний механический прибор с грушей, которому место в музее ретротехники, а не в XXI веке. Что же, умный монитор артериального давлен...
Маркетплейс – это сервис от 1С-Битрикс, который позволяет разработчикам делиться своими решениями с широкой аудиторией, состоящей из клиентов и других разработчиков.
На днях встала задача получения сообщений из стрима youtube. Статей по этому поводу не нашел, а есть лишь офф. документация гугл. С ней я разобрался (надеюсь) и готов поделиться с вами опытом. ...
Всем привет! Это мой первый пост на Хабре, надеюсь будет интересен сообществу. В Пермской группе пользователей Linux мы увидели нехватку обзорных материалов по новостям свободного и открыт...
Эта статья для тех, кто собирается открыть интернет-магазин, но еще рассматривает варианты и думает по какому пути пойти, заказать разработку магазина в студии, у фрилансера или выбрать облачный серви...