Flutter如何实现in_app_purchase苹果内购
在Flutter中集成in_app_purchase插件实现苹果内购时,遇到以下问题:1. 插件初始化后无法获取商品列表,控制台显示SKRequest报错;2. 支付流程完成后,苹果服务器验证收据总是返回invalid状态;3. 沙盒环境测试正常,但上架App Store后真实用户无法完成购买。请问该如何排查和解决这些具体问题?需要检查哪些关键配置?
        
          2 回复
        
      
      
        在Flutter中实现苹果内购,需要使用in_app_purchase插件。以下是基本实现步骤:
- 添加依赖
在pubspec.yaml中添加:
dependencies:
  in_app_purchase: ^3.1.7
- 配置iOS项目
- 在App Store Connect中创建商品
- 在Xcode中启用In-App Purchase功能
- 添加StoreKit配置文件(可选)
- 基本代码实现
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();
  }
}
- 重要注意事项
- 必须在真机上测试,模拟器不支持内购
- 需要有效的Apple开发者账号
- 商品审核通过后才能正常测试
- 建议在服务器端验证收据以确保安全
- 错误处理
- 处理网络异常
- 处理用户取消购买
- 处理交易失败情况
记得在pubspec.yaml文件更新后运行flutter pub get,并在iOS项目的Info.plist中添加相应的权限描述。
 
        
       
             
             
            


