You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用in_app_purchase:^1.0.8如何获取Android端过往内购记录

in_app_purchase 1.0.8版本获取过往购买记录实现方案

1.0.8版本废弃了直接返回购买列表的queryPastPurchases方法,改为「触发恢复动作+监听全局购买流接收数据」的逻辑,restorePurchases仅负责向应用商店发起恢复请求,所有恢复的购买数据都会走purchaseStream回调返回,具体实现步骤如下:

  • 第一步:提前注册purchaseStream监听,该监听需要在调用恢复接口前完成注册,避免漏掉返回的购买数据
// 建议在页面初始化、IAP实例初始化完成后就注册监听
final Stream<List<PurchaseDetails>> purchaseUpdated = _iap.purchaseStream;
// 用变量保存订阅,页面销毁时记得取消避免内存泄漏
_subscription = purchaseUpdated.listen((purchaseDetailsList) async {
  // 所有新购买、恢复购买的订单都会进入这个回调
  for (final purchaseDetails in purchaseDetailsList) {
    if (purchaseDetails.status == PurchaseStatus.purchased || 
        purchaseDetails.status == PurchaseStatus.restored) {
      // 可在此处加服务端验签逻辑,校验通过后存入本地购买列表
      _purchases.add(purchaseDetails);
      // 必须调用completePurchase完成订单交付,否则iOS端可能触发自动退款
      if (purchaseDetails.pendingCompletePurchase) {
        await _iap.completePurchase(purchaseDetails);
      }
    } else if (purchaseDetails.status == PurchaseStatus.error) {
      // 自行处理购买/恢复错误逻辑
    }
  }
  setState(() {});
}, onError: (error) {
  // 处理流报错逻辑
});
  • 第二步:在需要校验购买记录的时机调用restorePurchases触发恢复,不需要接收返回值
// 可以放在用户主动点击「恢复购买」按钮、或者用户登录后的权限校验节点调用
await _iap.restorePurchases();
  • 补充校验逻辑:如果需要确认用户是否购买了指定产品,直接在本地维护的_purchases列表中过滤对应productID的有效订单即可。

注意事项

  • 不要每次冷启动都自动调用restorePurchases,苹果审核要求恢复购买必须有用户主动触发的入口,无感知自动调用可能导致过审被拒
  • 恢复回来的订单状态标记为PurchaseStatus.restored,需要和正常购买的PurchaseStatus.purchased状态一起处理
  • 同一个账号的重复购买订阅类、非消耗品不会重复回调,仅会返回一次有效购买记录

内容的提问来源于stack exchange,提问作者draxex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:27:07