Flutter中如何使用in_app_purchase插件实现iOS和Android支付

我在Flutter项目中需要集成应用内支付功能,尝试使用in_app_purchase插件时遇到几个问题:1) 如何正确配置iOS的App Store Connect和Android的Google Play Console?2) 能否提供完整的订阅型商品购买代码示例?3) 处理支付结果时如何区分沙盒环境和生产环境?4) 遇到"无法连接到iTunes Store"的错误该如何排查?目前文档比较分散,希望有经验的朋友能分享具体实现步骤和注意事项。

2 回复

在Flutter中使用in_app_purchase插件实现支付:

  1. 添加依赖:in_app_purchase: ^5.0.0
  2. 初始化:InAppPurchase.instance.isAvailable()
  3. 获取商品:queryProductDetails()
  4. 购买:buyConsumable()buyNonConsumable()
  5. 监听购买状态:purchaseStream

iOS需配置App Store Connect,Android需配置Google Play Console。

更多关于Flutter中如何使用in_app_purchase插件实现iOS和Android支付的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用in_app_purchase插件实现跨平台支付(iOS和Android)的步骤如下:

1. 添加依赖

pubspec.yaml中添加:

dependencies:
  in_app_purchase: ^3.1.15

运行flutter pub get


2. 配置平台

Android

  • 在Google Play Console中设置应用内商品。
  • android/app/src/main/AndroidManifest.xml中添加权限(通常自动添加)。

iOS

  • 在App Store Connect中创建商品。
  • 在Xcode中启用应用内购买功能:Signing & Capabilities+ CapabilityIn-App Purchase

3. 初始化支付连接

import 'package:in_app_purchase/in_app_purchase.dart';

// 检查支付是否可用
bool available = await InAppPurchase.instance.isAvailable();
if (!available) {
  // 处理设备不支持支付的情况
}

4. 获取商品信息

// 定义商品ID
const Set<String> _productIds = {'com.example.product1', 'com.example.product2'};

// 获取商品详情
ProductDetailsResponse response = await InAppPurchase.instance.queryProductDetails(_productIds);
if (response.notFoundIDs.isNotEmpty) {
  print("未找到商品: ${response.notFoundIDs}");
}
List<ProductDetails> products = response.productDetails;

5. 购买商品

// 发起购买
final PurchaseParam purchaseParam = PurchaseParam(
  productDetails: productDetails, // 从queryProductDetails获取
);
InAppPurchase.instance.buyConsumable(purchaseParam: purchaseParam);

// 监听购买结果
StreamSubscription<List<PurchaseDetails>> subscription = InAppPurchase.instance.purchaseStream.listen(
  (purchaseDetailsList) {
    for (var purchaseDetails in purchaseDetailsList) {
      _verifyPurchase(purchaseDetails); // 验证购买
    }
  },
);

6. 验证和完成交易

void _verifyPurchase(PurchaseDetails purchaseDetails) async {
  if (purchaseDetails.status == PurchaseStatus.purchased) {
    // 向服务器验证收据(推荐)
    bool valid = await _validateWithServer(purchaseDetails.verificationData);
    
    if (valid) {
      // 交付商品
      _deliverProduct(purchaseDetails.productID);
      // 完成交易
      InAppPurchase.instance.completePurchase(purchaseDetails);
    }
  }
}

7. 恢复购买(仅iOS)

InAppPurchase.instance.restorePurchases();

注意事项

  • 测试
    • Android使用内部测试轨道,iOS使用Sandbox环境。
  • 安全:务必通过服务器验证收据,防止伪造。
  • 订阅商品:使用buyNonConsumable处理非消耗型商品。

通过以上步骤,即可在Flutter中实现iOS和Android的支付功能。

回到顶部