Flutter无登录应用内购:重新安装后如何从Play Store拉取购买记录?
Flutter 一次性应用内购:删除重装后的购买恢复方案
核心问题解答:删除重装后能否拉取购买记录?
可以。只要用户使用同一个Google账号登录Google Play商店,Play后台会永久保存用户的一次性内购记录(除非用户申请退款并成功),你可以通过代码查询这些记录来恢复用户的解锁状态。
具体恢复流程
- 应用启动时,调用内购插件的「查询历史购买记录」接口
- 接口返回用户所有有效的已购项目(排除已退款、已过期的,一次性内购不会过期)
- 遍历返回的购买记录,匹配你的目标内购商品ID
- 如果存在有效记录,直接在本地数据库标记用户已解锁(移除广告、开放功能)
- 如果没有记录,保持默认的未解锁状态
关于in_app_purchase包的适用性
完全够用,这是Flutter官方维护的内购插件,支持Google Play和App Store的内购逻辑,没必要更换其他第三方包。
具体操作步骤
配置内购商品
先在Google Play开发者后台创建你的一次性内购商品,记录好商品ID(比如remove_ad_unlock_feature)。集成in_app_purchase包
在pubspec.yaml中添加依赖,执行flutter pub get完成安装。初始化并查询购买记录
在应用启动的初始化逻辑(比如main函数或者首页的initState)中,初始化插件并查询历史购买:import 'package:in_app_purchase/in_app_purchase.dart'; final InAppPurchase _inAppPurchase = InAppPurchase.instance; List<String> _productIds = ['remove_ad_unlock_feature']; // 你的商品ID @override void initState() { super.initState(); _initPurchase(); } Future<void> _initPurchase() async { // 检查是否支持内购 bool isAvailable = await _inAppPurchase.isAvailable(); if (!isAvailable) return; // 查询历史购买记录 QueryPurchaseDetailsResponse response = await _inAppPurchase.queryPastPurchases(); if (response.error != null) { // 处理查询错误,比如提示用户检查Play商店状态 return; } // 遍历购买记录,验证是否存在有效购买 for (PurchaseDetails purchase in response.pastPurchases) { if (purchase.productID == _productIds[0] && purchase.status == PurchaseStatus.purchased) { // 标记本地状态:已解锁 await _localDatabase.setUnlockStatus(true); // 执行移除广告、开放功能的逻辑 _applyUnlockFeatures(); break; } } } void _applyUnlockFeatures() { // 这里写移除广告、解锁功能的代码 }处理实时购买后的状态同步
用户购买成功后,除了立即更新本地状态,也要确保购买记录被Play后台同步,后续重装时能查询到:// 监听购买更新 StreamSubscription<List<PurchaseDetails>>? _subscription; @override void initState() { super.initState(); _subscription = _inAppPurchase.purchaseStream.listen((List<PurchaseDetails> purchases) { _handlePurchaseUpdates(purchases); }); } void _handlePurchaseUpdates(List<PurchaseDetails> purchases) { for (PurchaseDetails purchase in purchases) { if (purchase.status == PurchaseStatus.purchased) { // 验证购买(可选但推荐,防止伪造) if (await _verifyPurchase(purchase)) { await _localDatabase.setUnlockStatus(true); _applyUnlockFeatures(); // 向Play确认购买完成(一次性内购需要调用) await _inAppPurchase.completePurchase(purchase); } } else if (purchase.status == PurchaseStatus.refunded) { // 用户退款,重置本地解锁状态 await _localDatabase.setUnlockStatus(false); _restoreLockedState(); } } } // 可选:购买验证,防止客户端伪造 Future<bool> _verifyPurchase(PurchaseDetails purchase) { // 无后端的情况下,可以简单检查purchase的status和productID return Future.value(purchase.productID == _productIds[0]); } void _restoreLockedState() { // 恢复广告、锁定功能的代码 }注意事项
- 必须确保用户登录了Google Play账号,否则无法查询购买记录
- 不要依赖本地存储的解锁状态作为唯一凭证,每次启动都要查询Play后台
- 若用户退款成功,Play会更新购买状态为
PurchaseStatus.refunded,需同步重置本地解锁状态
内容的提问来源于stack exchange,提问作者Osman
相关产品推荐
相关产品推荐

