Flutter如何接入苹果支付

在Flutter项目中如何正确接入苹果支付(IAP)?需要哪些配置步骤和依赖库?有没有详细的实现示例或常见问题解决方案?

2 回复

Flutter接入苹果支付需使用in_app_purchase插件。步骤如下:

  1. 配置App Store Connect,添加内购项目。
  2. 在Flutter项目中引入插件并初始化。
  3. 查询商品、发起购买并处理交易结果。
  4. 在iOS项目中开启In-App Purchase功能。

注意遵守苹果审核规则。

更多关于Flutter如何接入苹果支付的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中接入苹果支付(In-App Purchase)主要通过 in_app_purchase 官方插件实现。以下是详细步骤和示例代码:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  in_app_purchase: ^3.1.7

2. 配置iOS项目

  • 在苹果开发者后台创建App ID并启用In-App Purchase功能
  • 在Xcode中为项目添加支付能力:Signing & Capabilities+ CapabilityIn-App Purchase

3. 创建商品

在App Store Connect中添加商品:

  • 进入App Store Connect → 我的App → 功能 → App内购买项目
  • 创建消耗型/非消耗型/订阅型商品,记录商品ID

4. 实现支付逻辑

import 'package:in_app_purchase/in_app_purchase.dart';

class IAPManager {
  final InAppPurchase _iap = InAppPurchase.instance;
  late StreamSubscription<List<PurchaseDetails>> _subscription;

  void initialize() {
    // 监听购买状态
    _subscription = _iap.purchaseStream.listen(
      _handlePurchaseUpdate,
      onDone: () => _subscription.cancel(),
    );
  }

  Future<void> loadProducts() async {
    const Set<String> _kIds = {'your_product_id'}; // 替换为你的商品ID
    final ProductDetailsResponse response = 
        await _iap.queryProductDetails(_kIds);
    
    if (response.notFoundIDs.isNotEmpty) {
      print('未找到商品: ${response.notFoundIDs}');
    }
    
    List<ProductDetails> products = response.productDetails;
    // 显示商品列表
  }

  Future<void> buyProduct(ProductDetails product) async {
    final PurchaseParam purchaseParam = PurchaseParam(
      productDetails: product,
    );
    
    await _iap.buyConsumable(purchaseParam: purchaseParam);
  }

  void _handlePurchaseUpdate(List<PurchaseDetails> purchases) {
    for (PurchaseDetails purchase in purchases) {
      if (purchase.status == PurchaseStatus.purchased) {
        // 验证收据并发放商品
        _verifyAndDeliver(purchase);
      }
    }
  }

  void _verifyAndDeliver(PurchaseDetails purchase) async {
    // 向服务器验证收据(推荐)
    // 本地验证(仅基础验证)
    if (purchase.pendingCompletePurchase) {
      await _iap.completePurchase(purchase);
    }
  }

  void dispose() {
    _subscription.cancel();
  }
}

5. 服务器端验证(推荐)

  • 获取收据数据:purchase.verificationData.serverVerificationData
  • 发送到服务器验证真实性
  • 苹果验证接口:https://buy.itunes.apple.com/verifyReceipt

6. 测试注意事项

  • 使用沙盒环境测试
  • 创建测试账号时不要使用真实邮箱
  • 在真机上测试,模拟器不支持支付

关键点:

  1. 商品状态需要先在App Store Connect配置为"准备提交"
  2. 必须使用真机测试
  3. 建议实现服务器端收据验证
  4. 正确处理各种购买状态(成功/失败/待处理)

完整实现建议参考官方文档:https://pub.dev/packages/in_app_purchase

回到顶部