flutter如何实现in_app_purchase功能

我正在开发一个Flutter应用,需要使用in_app_purchase插件实现应用内购买功能。目前遇到几个问题:1)如何正确配置Android和iOS端的应用内购买商品?2)如何处理购买流程中的错误和异常情况?3)有没有完整的代码示例演示购买流程?4)如何验证购买结果是否真实有效?希望有经验的朋友能分享一下具体实现方法。

2 回复

在Flutter中,使用in_app_purchase插件实现应用内购买功能。首先添加依赖到pubspec.yaml,然后配置iOS和Android的应用内购买项目。通过插件提供的API验证购买、处理交易和恢复购买。确保遵循各平台的应用内购买政策。

更多关于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

2. 配置应用商店

Android(Google Play)

  • 在Google Play Console中创建商品
  • android/app/src/main/AndroidManifest.xml添加权限:
<uses-permission android:name="com.android.vending.BILLING" />

iOS(App Store)

  • 在App Store Connect中创建应用内购买项目
  • 在Xcode中启用应用内购买功能

3. 基本实现代码

import 'package:in_app_purchase/in_app_purchase.dart';

class InAppPurchaseService {
  static final InAppPurchase _iap = InAppPurchase.instance;
  
  // 初始化
  static Future<void> init() async {
    final bool available = await _iap.isAvailable();
    if (!available) {
      // 处理不支持应用内购买的情况
      return;
    }
  }

  // 获取商品信息
  static Future<List<ProductDetails>> getProducts(List<String> productIds) async {
    final ProductDetailsResponse response = await _iap.queryProductDetails(productIds);
    return response.productDetails;
  }

  // 购买商品
  static Future<void> purchase(ProductDetails product) async {
    final PurchaseParam purchaseParam = PurchaseParam(
      productDetails: product,
    );
    await _iap.buyConsumable(purchaseParam: purchaseParam);
  }

  // 监听购买状态
  static Stream<List<PurchaseDetails>> get purchaseUpdates => _iap.purchaseStream;
}

4. 使用示例

class PurchasePage extends StatefulWidget {
  @override
  _PurchasePageState createState() => _PurchasePageState();
}

class _PurchasePageState extends State<PurchasePage> {
  List<ProductDetails> _products = [];
  
  @override
  void initState() {
    super.initState();
    _initialize();
    _listenToPurchase();
  }

  void _initialize() async {
    await InAppPurchaseService.init();
    _loadProducts();
  }

  void _loadProducts() async {
    final products = await InAppPurchaseService.getProducts(['product_id_1', 'product_id_2']);
    setState(() {
      _products = products;
    });
  }

  void _listenToPurchase() {
    InAppPurchaseService.purchaseUpdates.listen((purchases) {
      for (var purchase in purchases) {
        if (purchase.status == PurchaseStatus.purchased) {
          // 处理购买成功
          _verifyPurchase(purchase);
        }
      }
    });
  }

  void _verifyPurchase(PurchaseDetails purchase) {
    // 验证购买凭证(重要!)
    // 这里应该调用自己的服务器验证购买真实性
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: _products.length,
        itemBuilder: (context, index) {
          final product = _products[index];
          return ListTile(
            title: Text(product.title),
            subtitle: Text(product.price),
            trailing: ElevatedButton(
              onPressed: () => InAppPurchaseService.purchase(product),
              child: Text('购买'),
            ),
          );
        },
      ),
    );
  }
}

5. 重要注意事项

  • 服务器验证:务必在服务器端验证购买凭证,防止欺诈
  • 测试环境:使用沙盒环境进行测试
  • 错误处理:妥善处理网络错误和购买失败情况
  • 恢复购买:实现恢复购买功能(特别是iOS)

6. 测试

  • Android:使用测试许可证账户
  • iOS:使用Sandbox测试账户

这样就完成了Flutter应用内购买的基本实现。记得在实际发布前充分测试所有购买流程。

回到顶部