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
相关产品推荐
相关产品推荐

