使用Google Play Billing 4.0.0特定按比例计费模式升级降级订阅报错
我使用的是Google Play Billing library 4.0.0版本,已按照官方集成文档完成集成,且已在Google Play后台创建了订阅套餐。
现有两类月度订阅套餐:
- pro1_monthly(₹140.01)
- pro2_monthly(₹210.02)
我首先按如下方式正常购买pro1_monthly:
BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSkuDetails(pro1MonthlySkuDetails) .build(); // 启动支付流程 billingClient.launchBillingFlow(this, billingFlowParams);
后续我要购买pro2_monthly完成订阅升级,目前只有IMMEDIATE_AND_CHARGE_PRORATED_PRICE和IMMEDIATE_AND_CHARGE_FULL_PRICE两种按比例计费模式可以正常运行。
其他模式均返回支付响应码5,对应文档中的DEVELOPER_ERROR错误,升级/降级相关代码如下:
// 通过调用querySkuDetailsAsync()获取"skuDetails"参数值 BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder() .setSubscriptionUpdateParams(BillingFlowParams.SubscriptionUpdateParams.newBuilder() .setOldSkuPurchaseToken(pro1MonthlyPurchaseToken) .setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) .build()) .setSkuDetails(pro2MonthlySkuDetails) .build(); int responseCode = billingClient.launchBillingFlow(this, billingFlowParams).getResponseCode(); System.out.println("pro2_monthly: " + responseCode);
返回结果:
pro2_monthly: 5 // 支付响应码
我在印度地区测试,想知道为什么IMMEDIATE_AND_CHARGE_PRORATED_PRICE和IMMEDIATE_AND_CHARGE_FULL_PRICE模式可以正常弹出订阅变更弹窗、顺利完成升级,而IMMEDIATE_WITH_TIME_PRORATION、IMMEDIATE_WITHOUT_PRORATION、DEFERRED三种模式无法完成订阅升级/降级。
已排查内容
我已验证所有常见问题:应用版本名、版本号、APK签名、支付权限已开启、购买token验证、购买确认、订阅更新时使用queryPurchasesAsync获取oldSkuDetails(pro1MonthlySkuPurchaseToken)、已开启待处理支付功能。
关键调试信息
支付结果调试信息:The subscription can't have the first charge for free.
Play后台订阅配置
- 月度套餐无免费试用
- 宽限期7天
- 无介绍性定价
- 全量开启重新订阅功能
你遇到的报错完全匹配调试日志返回的The subscription can't have the first charge for free规则限制,三种失效模式的逻辑都会触发「订阅变更首次收费为0」的校验,再叠加印度地区的支付监管要求,最终返回DEVELOPER_ERROR:
各模式失效原因
IMMEDIATE_WITH_TIME_PRORATION:升级时会将pro1_monthly剩余周期按价格比例折算为pro2_monthly的可用时长,升级当下无需支付任何费用,新套餐首次扣费推迟到折算时长耗尽后,触发首次0元收费校验IMMEDIATE_WITHOUT_PRORATION:升级立即生效,但新套餐首次扣费需等到原pro1_monthly当前周期结束后,升级当下无费用产生,触发校验DEFERRED:订阅变更到原周期结束后才生效,当前周期无新费用产生,触发校验
而两种可用模式IMMEDIATE_AND_CHARGE_PRORATED_PRICE、IMMEDIATE_AND_CHARGE_FULL_PRICE在升级当下就会收取对应差价/新套餐全价,不会出现首次收费为0的情况,因此可以正常走通流程。
印度地区特殊限制
2022年起印度储备银行对自动续费类业务新增监管规则,谷歌Play针对印度地区的订阅额外增加了「首次交易金额不得为0」的校验规则,即便是正常的时长折算场景也不允许升级时无费用产生,这也是该问题仅在印度区域测试出现的核心原因。
解决方案
可根据业务场景二选一处理:
- 针对印度地区用户单独屏蔽上述三种失效的订阅变更模式,仅保留两种即时收费的变更模式
- 订阅升级时捆绑一个印度地区允许的最低金额一次性商品,抵消0元收费的校验规则
内容的提问来源于stack exchange,提问作者Rohan

