IOS订阅功能实现代码篇(Flutter)(二)

472 阅读1分钟

由于我们的项目IOS 端使用Flutter 进行实现,所以可以使用flutter官方的内购插件flutter_in_app_purchase plugin pub dev 地址: pub.dev/packages/in…

  1. 安装插件
dependencies:
  in_app_purchase: ^3.2.1
  1. 代码使用 获取InAppPurchase 实例:
final InAppPurchase _inAppPurchase = InAppPurchase.instance;

List<ProductDetails> _products = [];

bool _isAvailable = false;

void _listenToPurchaseUpdated() {
  _inAppPurchase.purchaseStream
      .listen((List<PurchaseDetails> purchaseDetailsList) {
    _handlePurchaseUpdates(purchaseDetailsList);
  });
}

Future<void> _initialize() async {
  _isAvailable = await _inAppPurchase.isAvailable();
  if (_isAvailable) {
    await _loadProducts();
    _listenToPurchaseUpdated();
  }
}
void _verifyPurchase(PurchaseDetails purchaseDetails) {
  // 在这里验证购买凭证,通常需要将凭证发送到服务器进行验证
  final receiptData = purchaseDetails.verificationData.serverVerificationData;
  print('Receipt data: $receiptData');
  const passwd = "你们后台自定义的password";
  if (orderId == null) {
    _buyProduct(_products[selectIndex]);
    return;
  }
  // 后台写的接口,调用以下接口
//生产环境:https://buy.itunes.apple.com/verifyReceipt
//沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt
  controller.verifyReceipt(
    receiptData: receiptData,
    password: passwd,
    orderId: orderId!,
    onSucceedDeal: (m) {
      // 支付成功,刷新状态
      if (m == 0) {
        toast("支付成功");
      // 执行后续逻辑
      } else {
        toast("会员购买失败,请联系客服,苹果支付错误码:$m");
      }
    },
  );
}
void _handlePurchaseUpdates(List<PurchaseDetails> purchaseDetailsList) {
  purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
    dismissLoading();
    if (purchaseDetails.status == PurchaseStatus.purchased) {
      // 处理购买成功逻辑
      _verifyPurchase(purchaseDetails);
    } else if (purchaseDetails.status == PurchaseStatus.error) {
      // 处理购买失败逻辑
      toast("购买失败");
    }
    if (purchaseDetails.pendingCompletePurchase) {
      await _inAppPurchase.completePurchase(purchaseDetails);
    }
  });
}

Future<void> _loadProducts() async {
  showLoading();
  // 购买项目
  const Set<String> _kProductIds = {
    'com.test_subscription',// 购买项目,订阅对应的productId(自定义)
  
  };
  ProductDetailsResponse response =
      await _inAppPurchase.queryProductDetails(_kProductIds);
  setState(() {
  // 产品根据价格排序展示
    _products = response.productDetails
      ..sort((pre, current) => pre.rawPrice.compareTo(current.rawPrice));
  });
  dismissLoading();
}

//触发购买
void _buyProduct(ProductDetails productDetails) {
  controller.createApplePayOrder(
    appleProductId: productDetails.id,
    onSucceedDeal: (m) {
      orderId = m.id;
      final PurchaseParam purchaseParam =
          PurchaseParam(productDetails: productDetails);
      _inAppPurchase.buyNonConsumable(purchaseParam: purchaseParam);
    },
  );
}