Flutter中flutter_inapp_purchase插件处理Play Store订阅确认及购买完成问题
处理Play Store续订过期订阅后的应用内购买流程
针对你遇到的场景,需要在应用启动时初始化并监听flutter_inapp_purchase的购买回调,具体实现步骤如下:
1. 启动时绑定购买事件监听器
在应用入口(比如main.dart的initState或全局初始化逻辑)中,完成插件初始化并注册购买更新监听:
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart'; void initInAppPurchase() async { await FlutterInappPurchase.instance.initialize(); // 监听所有购买状态更新,包括从Play Store跳转回来的续订请求 FlutterInappPurchase.instance.purchaseUpdated.listen((purchase) { switch (purchase.status) { case PurchaseStatus.purchased: case PurchaseStatus.verified: // 验证订阅凭证并更新用户状态 _handleValidPurchase(purchase); break; case PurchaseStatus.canceled: // 处理用户取消购买的逻辑 break; case PurchaseStatus.error: // 处理购买错误,比如网络问题、凭证无效等 break; default: break; } }); }
2. 处理应用唤醒/启动后的未完成购买
当用户从Play Store确认界面点击打开应用时,需主动拉取未处理的购买记录,防止事件丢失:
void checkPendingPurchases() async { List<PurchaseDetails> pendingPurchases = await FlutterInappPurchase.instance.getAvailablePurchases(); for (var purchase in pendingPurchases) { if (purchase.status == PurchaseStatus.purchased || purchase.status == PurchaseStatus.verified) { _handleValidPurchase(purchase); } } }
将该方法放在初始化逻辑之后调用,确保所有遗留的购买请求都被处理。
3. 订阅凭证验证与状态更新
收到有效购买事件后,必须向你的后端服务器发送凭证进行验证,避免本地篡改:
void _handleValidPurchase(PurchaseDetails purchase) async { // 将购买凭证发送到后端验证合法性 bool isValid = await _verifyPurchaseWithBackend(purchase.verificationData.serverVerificationData); if (isValid) { // 更新本地用户订阅状态(比如存入SharedPreferences或数据库) _updateUserSubscriptionStatus(true); // 标记购买完成,避免重复处理 await FlutterInappPurchase.instance.finishPurchase(purchase); } }
4. 关键注意事项
finishPurchase必须在后端验证通过后调用,否则可能导致购买状态异常- 使用Google Play测试账号模拟过期订阅续订场景,验证全流程是否正常
- 同时监听
purchaseError事件,处理网络故障、凭证无效等异常情况
内容的提问来源于stack exchange,提问作者shilpa vania
相关产品推荐
相关产品推荐

