Flutter如何实现in_app_purchase苹果内购

在Flutter中集成in_app_purchase插件实现苹果内购时,遇到以下问题:1. 插件初始化后无法获取商品列表,控制台显示SKRequest报错;2. 支付流程完成后,苹果服务器验证收据总是返回invalid状态;3. 沙盒环境测试正常,但上架App Store后真实用户无法完成购买。请问该如何排查和解决这些具体问题?需要检查哪些关键配置?

2 回复

在Flutter中使用in_app_purchase插件实现苹果内购:

  1. 添加依赖:in_app_purchase: ^3.1.7
  2. 配置iOS内购权限
  3. 初始化连接:InAppPurchase.instance.isAvailable()
  4. 获取商品列表:queryProductDetails()
  5. 购买商品:buyConsumable()
  6. 处理交易监听:purchaseUpdatedStream

注意:需在App Store Connect配置内购项目并提交审核。

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


在Flutter中实现苹果内购,需要使用in_app_purchase插件。以下是基本实现步骤:

  1. 添加依赖pubspec.yaml中添加:
dependencies:
  in_app_purchase: ^3.1.7
  1. 配置iOS项目
  • 在App Store Connect中创建商品
  • 在Xcode中启用In-App Purchase功能
  • 添加StoreKit配置文件(可选)
  1. 基本代码实现
import 'package:in_app_purchase/in_app_purchase.dart';

class IAPManager {
  final InAppPurchase _iap = InAppPurchase.instance;
  
  // 初始化
  Future<void> initialize() async {
    // 检查是否可用
    final bool available = await _iap.isAvailable();
    if (!available) return;
    
    // 监听购买更新
    final Stream purchaseUpdated = _iap.purchaseStream;
    _subscription = purchaseUpdated.listen(
      _handlePurchaseUpdate,
      onDone: () => _subscription.cancel(),
      onError: (error) => print('Purchase error: $error'),
    );
  }
  
  // 获取商品
  Future<void> loadProducts() async {
    const Set<String> productIds = {'your_product_id'};
    final ProductDetailsResponse response = 
        await _iap.queryProductDetails(productIds);
    
    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> purchaseDetailsList) {
    purchaseDetailsList.forEach((PurchaseDetails purchaseDetails) async {
      if (purchaseDetails.status == PurchaseStatus.purchased) {
        // 验证收据并发放商品
        await _verifyAndDeliverProduct(purchaseDetails);
        
        // 完成交易
        await _iap.completePurchase(purchaseDetails);
      }
    });
  }
  
  Future<void> _verifyAndDeliverProduct(PurchaseDetails purchaseDetails) async {
    // 实现收据验证和商品发放逻辑
    // 建议在服务器端验证收据
  }
  
  void dispose() {
    _subscription?.cancel();
  }
}
  1. 重要注意事项
  • 必须在真机上测试,模拟器不支持内购
  • 需要有效的Apple开发者账号
  • 商品审核通过后才能正常测试
  • 建议在服务器端验证收据以确保安全
  1. 错误处理
  • 处理网络异常
  • 处理用户取消购买
  • 处理交易失败情况

记得在pubspec.yaml文件更新后运行flutter pub get,并在iOS项目的Info.plist中添加相应的权限描述。

回到顶部