Flutter 无法恢复购买

问题描述 投票:0回答:1

这已经可以工作了,但我将软件包更新到了最新版本: https://pub.dev/packages/in_app_purchase

我可以付款并检查我购买的商品,但刷新后它不会恢复。如果我尝试再次购买相同的版本,它会说我已经拥有它:

Future<void> initStore() async {
    final bool isAvailableTemp = await inAppPurchase.isAvailable();
    if (!isAvailable) {
      isAvailable = isAvailableTemp;
      products = [];
      purchases = [];
      notFoundIds = [];
      purchasePending = false;
      loading = false;
      return;
    }

    if (Platform.isIOS) {
      final InAppPurchaseStoreKitPlatformAddition iosPlatformAddition =
          inAppPurchase
              .getPlatformAddition<InAppPurchaseStoreKitPlatformAddition>();
      await iosPlatformAddition.setDelegate(PaymentQueueDelegate());
    }

    final ProductDetailsResponse productDetailResponse =
        await inAppPurchase.queryProductDetails(_androidProductIds.toSet());

    if (productDetailResponse.error != null) {
      queryProductError = productDetailResponse.error!.message;
      isAvailable = isAvailable;
      products = productDetailResponse.productDetails;
      purchases = <PurchaseDetails>[];
      notFoundIds = productDetailResponse.notFoundIDs;
      purchasePending = false;
      loading = false;
      return;
    }
  }

  Future<List<ProductDetails>> getProducts() async {
    if (products.isEmpty) {
      final ProductDetailsResponse products =
          await inAppPurchase.queryProductDetails(
        Platform.isAndroid
            ? _androidProductIds.toSet()
            : _iOSProductIds.toSet(),
      );
      if (products.productDetails.isNotEmpty) {
        // double check the order of the products
        if (Helpers.containsInStringIgnoreCase(
            products.productDetails[0].title, "plus")) {
          this.products.addAll(products.productDetails);
        } else {
          // pro comes first
          this.products.add(products.productDetails[1]);
          this.products.add(products.productDetails[0]);
        }
      }
    }
    return products;
  }

Future<List<PurchaseDetails>> getPastPurchases(BuildContext context) async {
    if (purchases.isEmpty) {
      final Stream<List<PurchaseDetails>> purchaseUpdated =
          inAppPurchase.purchaseStream;

      _subscription = purchaseUpdated.listen((purchaseDetailsList) {
        if (purchaseDetailsList.isEmpty) {
          detectProVideo(context);
        } else {
          // this.purchases.addAll(purchaseDetailsList);
          listenToPurchaseUpdated(context, purchaseDetailsList);
        }
        _subscription.cancel();
      }, onDone: () {
        _subscription.cancel();
      }, onError: (error) {
        // handle error here.
        _subscription.cancel();
      });

      await inAppPurchase.restorePurchases();

      if (Platform.isIOS) {
        Map<String, PurchaseDetails> purchases =
            Map.fromEntries(this.purchases.map((PurchaseDetails purchase) {
          if (purchase.pendingCompletePurchase) {
            inAppPurchase.completePurchase(purchase);
          }
          return MapEntry<String, PurchaseDetails>(
              purchase.productID, purchase);
        }));
        if (purchases.isEmpty) {
          Provider.of<AdState>(context, listen: false).toggleAds(context, true);
        } else {
          Provider.of<AdState>(context, listen: false)
              .toggleAds(context, false);
        }
      }
    }
    return purchases;
  }

所以这总是

true
:

if (purchaseDetailsList.isEmpty) {

在 Android 模拟器上进行本地测试

flutter in-app-purchase flutter-dependencies
1个回答
0
投票

让我们在 Play 控制台的订单管理中对购买进行退款。

© www.soinside.com 2019 - 2024. All rights reserved.