Flutter使用in_app_purchase插件未收到Play Store退款后的PurchaseStatus.cancel通知
Flutter in_app_purchase: 获取Google Play非消耗型产品退款通知的方案(无后端)
核心背景说明
Google Play的退款事件不会通过InAppPurchase.instance.purchase流推送——这个流仅处理购买流程中的实时操作(比如购买成功、中途取消、支付失败),退款属于事后状态变更,不在该流的触发范围内。你遇到的情况是正常的,需要通过主动查询+本地校验来检测退款。
具体实现步骤
- 持久化购买记录:当用户购买成功时,将非消耗型产品的ID、购买凭证等关键信息保存到本地(比如用
shared_preferences或本地数据库),标记该产品为"已拥有"。 - 主动查询购买历史:在关键场景触发购买记录查询,比如:
- App启动时
- 用户进入高级功能页面时
- 用户主动点击"恢复购买"按钮时
查询代码示例:
final QueryPurchaseDetailsResponse response = await InAppPurchase.instance.queryPastPurchases(); if (response.error != null) { // 处理查询错误 return; } // 提取当前有效的已购买产品ID列表 final activePurchases = response.pastPurchases.map((p) => p.productID).toSet(); - 对比本地记录检测退款:将本地保存的"已拥有"产品ID列表,和查询到的
activePurchases对比。如果本地存在某个产品ID,但activePurchases中没有,说明该产品已被退款,此时执行取消高级功能的逻辑,并更新本地记录。
测试注意事项
- Google Play测试用户的退款状态同步可能有延迟,退款获批后需要等待5-10分钟再查询,才能看到购买记录的变化。
- 测试时不要重复购买已退款的产品后立刻查询,建议等待状态同步完成后再操作。
进阶方案(需原生开发)
如果需要更实时的通知,可以在Android端直接对接Google Play Billing Library:
- 在Android项目中注册
PurchasesUpdatedListener,同时监听com.android.vending.billing.PURCHASES_UPDATED系统广播。 - 当收到退款相关的状态变更时,通过MethodChannel将事件传递到Flutter层,触发本地逻辑更新。
内容的提问来源于stack exchange,提问作者Khamidjon Khamidov
相关产品推荐
相关产品推荐

