FLUTTER PAIN --- Flutter in_app_purchase на Android: покупка прошла успешно (квитанция получена), но PurchaseStream выдаAndroid

Форум для тех, кто программирует под Android
Anonymous
FLUTTER PAIN --- Flutter in_app_purchase на Android: покупка прошла успешно (квитанция получена), но PurchaseStream выда

Сообщение Anonymous »

Мы используем in_app_purchase: ^3.2.3 (

Код: Выделить всё

in_app_purchase_android: 0.4.0+10
) на Flutter. На Android, когда пользователь совершает покупку:
  • Google Play обрабатывает ее правильно (получено тестовое письмо с квитанцией, создан идентификатор заказа, в песочнице отображается «Тестовая карта, всегда одобряется»)
  • Приложение на короткое время показывает «Покупка не завершена. Если вы отменили, просто попробуйте еще раз».
  • уровень остается неизменным
  • Наша серверная облачная функция (

    Код: Выделить всё

    verifyIAP
    ) никогда не вызывается — подтверждается журналами GCP.
При второй попытке: «Этот элемент уже принадлежит вам» — при подтверждении Google Play считает покупку завершенной, но не подтвержденной.
Наш обработчик потока покупок:

Код: Выделить всё

void _onPurchaseUpdate(List
 purchases) {
for (final purchase in purchases) {
if (purchase.productID != _pendingProductId) {
if (purchase.status != PurchaseStatus.pending) {
_iap.completePurchase(purchase);
}
continue;
}

switch (purchase.status) {
case PurchaseStatus.purchased:
case PurchaseStatus.restored:
_handlePurchased(purchase);
case PurchaseStatus.canceled:
_iap.completePurchase(purchase);
_resolvePending(IAPResult.cancelled);
case PurchaseStatus.error:
_iap.completePurchase(purchase);
_resolvePending(IAPResult.storeError);
case PurchaseStatus.pending:
break;
}
}
}
Появляется сообщение об ошибке «Покупка не завершена. Если вы отменили покупку, попробуйте еще раз». сопоставляется с IAPResult.storeError.
Вопрос: На Android может ли завершенная покупка в Google Play поступать в поток PurchaseStream как PurchaseStatus.error, а не PurchaseStatus.purchased? Если да, то при каких условиях? Или существует другой механизм, с помощью которого событие потока будет отброшено до достижения нашего обработчика?
Что мы уже исключили:
  • Путь отмены DidChangeAppLifecycleState защищен возвратом if (Platform.isAndroid);
  • 30-секундный тайм-аут не сработал (ошибка появилась быстро)
  • Код: Выделить всё

    _pendingProductIdНесоответствие 
    возможно, но неясно, почему оно будет нулевым во время доставки потока.
  • iOS корректно работает с тем же кодом.
    Любая помощь будет оценена по достоинству! Спасибо

Вернуться в «Android»