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
相关产品推荐
相关产品推荐

