Я добавил последнюю версию биллинговой библиотеки Google Play:
implementation 'com.android.billingclient:billing:2.0.1'
Если я совершаю покупку с «медленной картой тестирования, которая всегда будет подтверждена через пару минут» (это карта тестирования от Google для проверки покупок в приложении):
val params = BillingFlowParams
.newBuilder()
.setSkuDetails(skuId)
.build()
billingClient.launchBillingFlow(activity, params)
Все идет хорошо, пока я не попытаюсь подтвердить или потреблять продукт:
val consumeParams = ConsumeParams
.newBuilder()
.setPurchaseToken(purchase.purchaseToken)
.build()
billingClient.consumeAsync(consumeParams, this)
Я получаю следующую ошибку в обратном вызове:
/**
* Invalid arguments provided to the API. This error can also indicate that the application was
* not correctly signed or properly set up for In-app Billing in Google Play, or does not have
* the necessary permissions in its manifest
*/
int DEVELOPER_ERROR = 5;
Я также получаю отладочное сообщение о том, что покупка имеет недопустимое состояние (PENDING). Возможно, я не могу потреблять / подтверждать покупки, которые не имеют состояния "УСПЕХ".
По данным Google, у меня есть 3 дня, чтобы потребить или подтвердить покупку, в противном случае она будет возвращена.
Но как я могу потреблять или подтверждать покупку, если они не позволят мне сделать это сразу после совершения покупки?
- У меня нет сервера, потребление / подтверждение должно быть сделано на мобильном телефоне
- Я не могу удержать пользователя с диалоговым окном / просмотром процесса загрузки в приложении, пока покупка будет подтверждена (получение состояния
SUCCESS
. С тестовой учетной записью, в течение 5-6 минут я получаю новый Состояние "SUCCESS
" через onPurchasesUpdated(billingResult: BillingResult?, purchases: MutableList<Purchase>?)
)
Я использую архитектуру MVVM
(Activity - ViewModel
) и в Activity
я храню библиотеку Billing Client (потому что для библиотеки требуется Context
), а в бизнес-логике ViewModel
.
Похоже, что Google не хочет, чтобы мы "привязывали" клиентскую библиотеку биллинга к модели действия / представления, а вместо этого использовали ее в Service
и создавали ее экземпляр в классе Application
. Вероятно, общение с Observers
или BroadcastReceivers
и прослушивание обновлений покупки. И как только Purchase
будет подтвержден или отклонен, я должен обновить профиль пользователя. Это уже может вызвать проблему, потому что я не могу запустить Service
, не имея непоправимого липкого уведомления, потому что это служба переднего плана, и я должен уведомить пользователя, что приложение работает в фоновом режиме. Это пугает пользователей до чертиков.
Этот новый поток покупок ломает несколько вещей Это не должно быть асинхронным. В реальной ситуации, когда я что-то покупаю, я отдаю деньги кассиру, после чего получаю свой продукт / услугу не через 5 минут! Как я должен иметь дело с этим? Пользователь совершает покупку, а я уведомляю пользователя, что он / она получит продукт в течение 5 минут после подтверждения от Google? Это должно быть мгновенным.
Как вы справляетесь с покупками в приложении?