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

Google Billing API 7.0 集成异常:未订阅用户可使用需订阅权限的应用功能

Google Billing API 7.0 集成异常:未订阅用户可使用需订阅权限的应用功能

嗨,我之前集成Billing API的时候也踩过类似的本地校验坑,咱先一步步拆解问题哈!你这个情况核心就是切换账号后,应用没正确获取当前登录用户的真实订阅状态,反倒复用了前一个订阅用户的缓存数据或者旧状态——毕竟你现在没有后端做兜底校验,全靠本地逻辑很容易出这种疏漏。

给你几个针对性的排查和解决办法:

  • 别依赖本地缓存的订阅状态
    你大概率是把abc用户的订阅状态存在了SharedPreferences或者本地数据库里,切换到xyz账号后没清空旧数据,直接复用了。咱得改:每次用户启动应用、完成Google账号切换后,必须主动调用BillingClient的queryPurchasesAsync拉取当前登录账号的最新订阅状态,完全信任这个实时返回的结果,别再用本地存的旧数据。
    给你贴个实际能用的代码片段(Kotlin):
    // 切换账号后立即查询当前用户的订阅状态
    billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder()
        .setProductType(BillingClient.ProductType.SUBS)
        .build()) { billingResult, purchases ->
        // 只判断当前账号的有效订阅
        val hasActiveSubscription = purchases.any { purchase ->
            purchase.purchaseState == Purchase.PurchaseState.PURCHASED && purchase.isAutoRenewing
        }
        // 更新应用内的功能权限开关
        updateAppFeatureAccess(hasActiveSubscription)
    }
    
  • 关键功能入口必须实时校验
    别只在启动时校验一次就完事!用户要打开付费专属功能、进入核心订阅模块前,都得再查一遍当前用户的订阅状态——毕竟账号切换可能发生在应用后台运行时,启动时的校验结果早就过期了。
  • 存储状态要和账号ID绑定(如果必须存的话)
    要是怕频繁调用API影响性能、非得本地存状态,那一定要和当前登录的Google账号ID绑定。比如存储的key设成"sub_status_${currentGoogleAccountId}",切换账号后,先根据新账号ID查对应的状态,查不到就立刻调用BillingClient拉取最新数据,绝对不能直接用旧账号的存储值。
  • 切换账号后重启BillingClient会话
    BillingClient默认会和当前设备的主Google账号绑定,要是你切换了账号但没重启BillingClient,它可能还拿着旧账号的会话查数据。所以切换账号后,先调用billingClient.endConnection()关掉旧连接,再重新初始化BillingClient,之后再执行订阅状态查询。

对了,还要提一句:现在没有后端的话,本地校验其实有安全风险(懂点技术的用户能篡改本地数据绕过),之后有条件一定要加后端,用Play Developer API校验Purchase的token,才能从根源上杜绝这类问题。

备注:内容来源于stack exchange,提问作者Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:04:42