You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter无登录应用内购:重新安装后如何从Play Store拉取购买记录?

Flutter 一次性应用内购:删除重装后的购买恢复方案

核心问题解答:删除重装后能否拉取购买记录?

可以。只要用户使用同一个Google账号登录Google Play商店,Play后台会永久保存用户的一次性内购记录(除非用户申请退款并成功),你可以通过代码查询这些记录来恢复用户的解锁状态。

具体恢复流程

  • 应用启动时,调用内购插件的「查询历史购买记录」接口
  • 接口返回用户所有有效的已购项目(排除已退款、已过期的,一次性内购不会过期)
  • 遍历返回的购买记录,匹配你的目标内购商品ID
  • 如果存在有效记录,直接在本地数据库标记用户已解锁(移除广告、开放功能)
  • 如果没有记录,保持默认的未解锁状态

关于in_app_purchase包的适用性

完全够用,这是Flutter官方维护的内购插件,支持Google Play和App Store的内购逻辑,没必要更换其他第三方包。

具体操作步骤

  1. 配置内购商品
    先在Google Play开发者后台创建你的一次性内购商品,记录好商品ID(比如remove_ad_unlock_feature)。

  2. 集成in_app_purchase包
    在pubspec.yaml中添加依赖,执行flutter pub get完成安装。

  3. 初始化并查询购买记录
    在应用启动的初始化逻辑(比如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() {
      // 这里写移除广告、解锁功能的代码
    }
    
  4. 处理实时购买后的状态同步
    用户购买成功后,除了立即更新本地状态,也要确保购买记录被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() {
      // 恢复广告、锁定功能的代码
    }
    
  5. 注意事项

    • 必须确保用户登录了Google Play账号,否则无法查询购买记录
    • 不要依赖本地存储的解锁状态作为唯一凭证,每次启动都要查询Play后台
    • 若用户退款成功,Play会更新购买状态为PurchaseStatus.refunded,需同步重置本地解锁状态

内容的提问来源于stack exchange,提问作者Osman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:17:21