Код ошибки разработчика библиотеки Google Play Billing 5, если я хочу использовать или подтвердить покупку - PullRequest
0 голосов
/ 25 июня 2019

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

Но как я могу потреблять или подтверждать покупку, если они не позволят мне сделать это сразу после совершения покупки?

  1. У меня нет сервера, потребление / подтверждение должно быть сделано на мобильном телефоне
  2. Я не могу удержать пользователя с диалоговым окном / просмотром процесса загрузки в приложении, пока покупка будет подтверждена (получение состояния 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? Это должно быть мгновенным.

Как вы справляетесь с покупками в приложении?

1 Ответ

1 голос
/ 24 июля 2019

Ответ прост.Сообщите пользователю, что запрос на покупку произошел, но платеж или запрос еще не были подтверждены или обработаны.

Эта ситуация должна и должна быть асинхронной, поскольку она может происходить в некоторых сценариях и именно так и происходит в реальной жизни.Например, когда пользователь использует не мгновенный способ оплаты.Некоторые способы оплаты могут занять несколько дней - не все используют кредитные / дебетовые или подарочные карты для онлайн-платежей, и не каждый может!Например, в Бразилии существует платежная система Boleto, за которую легко платить, но на обработку которой уходит много времени.Люди платят за свой товар, распечатывают квитанцию ​​и стоят в очереди в определенных местах, чтобы заплатить за вещи.Это сделано так, потому что получить международную онлайн-карту очень сложно, особенно среди очень бедных.

Итак, вам нужно получить новую покупку.Проверьте его статус.Если это УСПЕХ, то ваш платеж завершен и сообщите пользователю.Если он находится в состоянии ожидания, сообщите пользователю, что запрос на оплату выполнен и ожидает подтверждения от Google.

Если вы получаете покупку в состоянии ОЖИДАНИЯ, когда платеж очищается, вы получите новый запрос на покупку через поток вашего приложения, но на этот раз он скажет, что покупка была УСПЕХА.

Если это не соответствует вашей текущей архитектуре, вы должны изменить свою архитектуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...