Flutter in_app_purchase安卓端:订阅续费PurchaseDetails未被purchaseStream捕获
Android IAP订阅续期事件未被purchaseStream监听的解决方案
升级Play Billing Library版本
旧版本的Play Billing Library存在订阅续期事件监听的兼容性问题,建议使用最新稳定版(6.0+)。在安卓项目的build.gradle中确认依赖配置:dependencies { implementation 'com.android.billingclient:billing:6.0.1' }确保purchaseStream持续监听
避免仅在App初始化时订阅一次purchaseStream,需在App从后台恢复、启动时重新建立监听。以Flutter的in_app_purchase插件为例:late StreamSubscription<List<PurchaseDetails>> _subscription; @override void initState() { super.initState(); _setupPurchaseListener(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { _setupPurchaseListener(); } super.didChangeAppLifecycleState(state); } void _setupPurchaseListener() { _subscription?.cancel(); _subscription = InAppPurchase.instance.purchaseStream.listen( _handlePurchaseEvents, onError: (err) => // 处理监听错误, onDone: () => _subscription?.cancel(), ); } void _handlePurchaseEvents(List<PurchaseDetails> purchases) { for (var purchase in purchases) { if (purchase.status == PurchaseStatus.purchased) { // 处理订阅(包括续期)逻辑 } } }主动查询订阅状态作为兜底
即使purchaseStream未捕获到续期事件,也要定期主动查询用户的订阅状态,比如在App启动、进入订阅管理页面时执行:Future<void> _checkCurrentSubscriptions() async { final response = await InAppPurchase.instance.queryPurchaseDetails(PurchaseType.subscription); if (response.error != null) return; for (var purchase in response.purchaseDetails) { if (purchase.status == PurchaseStatus.purchased || purchase.status == PurchaseStatus.restored) { // 更新本地订阅状态 } } }验证测试环境配置
使用Google Play Console的测试工具手动触发续期事件,而非依赖自动的5分钟测试推送——测试环境的自动续期可能存在延迟。同时确认测试账号已正确添加到许可测试列表中。检查实时开发者通知配置
在Google Play Console中开启实时开发者通知,该通知可以触发App主动刷新订阅状态,作为purchaseStream监听的补充机制。
内容的提问来源于stack exchange,提问作者madz
相关产品推荐
相关产品推荐

