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

Delphi集成Google Play Billing:取消订阅到期后无需重启APP如何获取更新的订阅状态?

Delphi集成Google Play Billing:取消订阅到期后无需重启APP如何获取更新的订阅状态?

我之前在做Delphi安卓订阅功能的时候也碰到过一模一样的问题,当时折腾了好一阵才找到靠谱的解决办法,正好可以给你分享下经验:

  • 别只靠SetupInAppPurchase刷新状态!这个方法只是完成组件初始化,不会主动向Google Play服务器拉取最新的订阅数据,大概率用的是本地缓存的旧状态。你需要主动调用RestorePurchases方法,它会直接请求Google Play返回当前用户的所有有效/失效订阅记录,完全绕开本地缓存。
    调用代码很简单:

    InAppPurchase.RestorePurchases;
    

    然后一定要在OnRestorePurchasesComplete事件里处理返回的结果:

    procedure TMainForm.InAppPurchaseRestorePurchasesComplete(Sender: TObject;
      const Purchases: array of TPurchase);
    var
      SubPurchase: TPurchase;
    begin
      for SubPurchase in Purchases do
      begin
        // 核心判断:既要检查过期时间,也要确认取消原因
        if (SubPurchase.ExpirationDate < Now) or (SubPurchase.CancelReason <> crNone) then
        begin
          // 订阅已过期或主动取消,执行失效逻辑
          UpdateSubscriptionStatus(false);
        end
        else
        begin
          // 订阅仍在有效期内
          UpdateSubscriptionStatus(true);
        end;
      end;
      // 如果没有返回任何订阅记录,说明用户没有有效订阅
      if Length(Purchases) = 0 then
        UpdateSubscriptionStatus(false);
    end;
    
  • 要搞对订阅状态的判断逻辑:很多人会误以为只要取消订阅就立刻失效,但实际上Google Play是允许用户用到已付费周期结束的。只有当ExpirationDate小于当前时间,并且CancelReason不是crNone的时候,才代表订阅真正失效了。

  • 定时主动刷新状态:如果你的APP需要实时感知订阅变化,可以在APP切换到前台时、或者每隔30分钟左右(别太频繁,避免被服务器限流)自动调用一次RestorePurchases,这样不用用户重启APP,就能保证状态是最新的。

  • 避开缓存坑:TInAppPurchase的本地缓存有时候会“顽固”地保留旧状态,所以任何需要确认订阅有效性的场景(比如解锁付费功能、检查权限),都要走RestorePurchases的流程,别依赖之前保存的本地数据。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:05:30