Я использую in_app_purchase Flutter plugin для Android покупок в моем приложении Flutter.
Я покупаю, используя _iap.buyConsumable(purchaseParam: purchaseParam)
(т.е. autoConsume = true
), и подключаюсь, используя _iap.purchaseUpdatedStream.listen
для входящих покупок. Если покупка имеет статус PurchaseStatus.purchased
, я отправляю ее на сервер и регистрирую эту покупку. Но если в покупке указано PurchaseStatus.pending
(это тест Google «Медленная тестовая карта. Снижается через несколько минут»), то я ничего не делаю и жду другого сообщения _iap
, но другого сообщения об этой покупке не приходит, но я вижу в Google консоль, что эта покупка отклонена.
Но это не главная проблема. Основная проблема заключается в том, что если пользователь пытается купить тот же товар после сообщения pending
о покупке, он не может его купить из-за ошибки BillingResponse.itemAlreadyOwned
. Итак, он застрял.
Я думал, что могу вызывать эту функцию после каждого перезапуска приложения:
final QueryPurchaseDetailsResponse response = await _iap.queryPastPurchases();
response.pastPurchases.forEach((pd) => _iap.consumePurchase(pd) );
это дает:
Ошибка при покупке с токеном. Код ответа: 8
После этого пользователь может снова купить тот же товар. Но я не уверен - это безопасный сценарий или просто грязное решение этой проблемы? Кроме того, как мне правильно дождаться этой незавершенной покупки?