Billing Library 6.0订阅升级报错“user not eligible”求助
问题描述
配置了两个独立订阅产品,分别对应基础方案:
- SubsA -> 月度基础方案A
- SubsB -> 年度基础方案B
单独购买两个订阅均成功,但已购买月度订阅后,尝试升级为年度订阅时触发错误:User is not eligible for this product。
升级代码如下:
var billingFlowParams = BillingFlowParams.newBuilder() .setObfuscatedAccountId(UUID.randomUUID().toString()) .setProductDetailsParamsList( listOf(BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(productlist[productId]!!.productDetails!!) .setOfferToken(productlist[productId]!!.offerToken!!).build() ) ) .setSubscriptionUpdateParams( BillingFlowParams.SubscriptionUpdateParams.newBuilder() // purchaseToken can be found in Purchase#getPurchaseToken .setOldPurchaseToken(productlist["subscription_monthly"]!!.purchaseToken!!) .setSubscriptionReplacementMode(ReplacementMode.WITH_TIME_PRORATION) .build() ).build() val billingResult = billingClient.launchBillingFlow(this, billingFlowParams) if(billingResult.responseCode != BillingClient.BillingResponseCode.OK) { showBillingClientError(billingResult.responseCode) }
已确认:
- 新订阅的
offerToken和旧订阅的purchaseToken均正确,信息来自queryProductDetailsAsync()和queryPurchasesAsync()的返回结果并存储在productlist中。
排查方向
1. 两个订阅未归属同一订阅组
Google Play Billing的订阅升级/降级功能仅支持同一订阅组内的产品。如果SubsA和SubsB分属不同订阅组,系统会直接判定用户无升级资格,触发该错误。
解决操作:
- 登录Google Play控制台,进入应用的「商品」->「订阅」页面。
- 检查SubsA和SubsB的订阅组配置,确保两者属于同一个订阅组;若没有现成组,需新建订阅组并将两个产品关联进去。
2. 年度订阅的优惠方案限制了用户资格
如果年度订阅SubsB使用了带限制条件的优惠方案(比如仅新用户可享的首月折扣),已购买月度订阅的用户不符合优惠资格,也会触发错误。
解决操作:
- 检查SubsB的offer设置,确认是否存在「仅新用户」等限制规则。
- 升级场景下,优先使用年度订阅的基础方案令牌,而非优惠方案令牌;若需保留优惠,需调整优惠规则允许现有订阅用户使用。
3. 混淆账号ID未保持一致
代码中每次调用都生成随机UUID作为obfuscatedAccountId,但Google Play要求同一用户的该ID必须固定。前后购买时账号ID不一致,系统可能无法识别为同一用户,导致资格验证失败。
解决操作:
- 为同一用户固定使用同一个
obfuscatedAccountId,比如采用应用内用户的唯一标识(加密后),而非每次生成随机值。
4. 订阅替换模式的兼容性问题
WITH_TIME_PRORATION是常用替换模式,但部分地区或特定订阅组合可能存在兼容性问题。可尝试切换其他模式测试:
ReplacementMode.IMMEDIATE_WITH_PRORATIONReplacementMode.DEFERRED
解决操作:
- 修改
setSubscriptionReplacementMode的参数,切换模式后重新测试升级流程。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

