При полной покупке я получаю ошибку разработчика, такую как ответ (при покупке приложения )

#flutter #dart #in-app-purchase

Вопрос:

BillingResponse.Ошибка разработчика I/flutter ( 5091): Покупка находится в недопустимом состоянии.

Иногда я получаю эту ошибку, но у меня бывают случаи, когда ответ на выставление счета в порядке (BillingResponse.ok). В чем может быть проблема? Мой код следует официальному примеру flutter.dev, который является https://pub.dev/packages/in_app_purchase Все хорошо до этого фрагмента кода

 var completePurchase = await InAppPurchaseConnection.instance
              .completePurchase(purchaseDetails);
 

который возвращает BillingResponse.developerError или иногда magic возвращает BillingResponse.ok

В виджете я просто называю buyNonConsumable

   instance.buyNonConsumable(prod);
 

Есть ли шанс быть, потому что он не находится в производстве или что-то еще, что связано с внутренним тестированием, потому что приложение находится на внутреннем тестировании?
Вкратце, код выглядит следующим образом

      _subscription = getPurchaseStream.listen(
        (purchaseDetailsList) {
          _listenToPurchaseUpdated(purchaseDetailsList);
        }, onDone: () {
      _subscription.cancel();
      }, onError: (error) {
        // handle error here.
        print('Subscription error: $error');
      });

    _isAvailable = await _connection.isAvailable();
    if(!_isAvailable) {
      print('The store is not available, try again later..');
      return;
    }
    _myProductsIds = await _categoryRepository.getCategoriesGoogleProductsIds(); 
    await _getProducts();
    await _getPastPurchases();
    for (PurchaseDetails purchase in _purchases) {
      verifyPurchase(purchase.productID);
      if (_isPurchased) {  //Check if product is purchased
        await deliverProduct(); // Give the products on the user
      } else {
         _handleInvalidPurchase(purchase);
      }
    }
 
  purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
      if (purchaseDetails.status == PurchaseStatus.pending) { 
        print('Pending..');
      } else {
        if (purchaseDetails.status == PurchaseStatus.error) {
         print('To purchases status error: ${purchaseDetails.error}');
        } else if (purchaseDetails.status == PurchaseStatus.purchased) {
          verifyPurchase(purchaseDetails.productID); // change value of _isPurchased
          if (_isPurchased) {
            _purchases.add(purchaseDetails);
     
            for(String id in _myProductsIds) {
              if (purchaseDetails.productID == id) {
                await deliverProduct(); // Give the products on the user
              }
            }
          } else {
            _handleInvalidPurchase(purchaseDetails);
            return;
          }
        }
        if (Platform.isAndroid) {
          for(String id in _myProductsIds) {
            if (purchaseDetails.productID == id) {
              await InAppPurchaseConnection.instance
                  .consumePurchase(purchaseDetails);
            }
          }
        }
        if (purchaseDetails.pendingCompletePurchase) {
          var completePurchase = await InAppPurchaseConnection.instance
              .completePurchase(purchaseDetails);
        }
      }
 

Ответ №1:

Я не знаю, почему в официальном примере есть consumePurchase, если платформа Android, но из-за этого фрагмента кода мое приложение выходило из строя, и оно возвращало ошибку «Разработчик.ошибка» в важных строках, и они

 var completePurchase = await InAppPurchaseConnection.instance
              .completePurchase(purchaseDetails);
 

Я прочитал документацию по методу completePurchase и увидел важный комментарий, который гласит:

   /// The [consumePurchase] acts as an implicit [completePurchase] on Android.
  Future<BillingResultWrapper> completePurchase(PurchaseDetails purchase);
 

Возможно, было обновление версии покупок в приложении, и после этого определенный пример не был обновлен.

Ссылка на пример: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase/in_app_purchase/example