Android Google Billing Lib订阅优惠未生效问题及实现咨询
Google Play订阅优惠不生效问题排查与解决方案
一、订阅优惠生效核心流程
- 控制台创建并发布优惠,关联目标订阅
- Play服务器同步优惠配置(通常1-2小时,最长24小时)
- 客户端通过Billing库拉取商品详情时,获取包含优惠的订阅信息
- 客户端筛选并展示优惠价格,发起购买时传入优惠token
二、Play控制台正确设置步骤
- 进入Play控制台,选择目标应用,左侧菜单点击「Monetize」→「Subscriptions」
- 找到定价1200卢比的订阅,进入详情页
- 下滑到「Promotions」板块,点击「Create promotion」
- 选择优惠类型为「Percentage discount」,设置折扣比例50%
- 配置优惠规则:
- 自定义内部名称(用户不可见)
- 选择适用用户群体(如「New subscribers only」)
- 设置优惠时长(如「1 billing cycle」首月优惠)
- 开启印度地区的支持
- 在「Subscriptions」选项卡下,勾选要绑定的目标订阅
- 点击「Save」后,务必点击「Publish」(草稿状态优惠不会生效)
- 等待配置同步完成后再测试
三、Android端(Billing 6.0.1)实现代码
1. 初始化BillingClient
private lateinit var billingClient: BillingClient fun initBilling(context: Context) { billingClient = BillingClient.newBuilder(context) .setListener { _, purchases -> // 处理购买结果回调 } .enablePendingPurchases() .build() billingClient.startConnection(object : BillingClientStateListener { override fun onBillingSetupFinished(result: BillingResult) { if (result.responseCode == BillingClient.BillingResponseCode.OK) { querySubscriptionDetails() } } override fun onBillingServiceDisconnected() { billingClient.startConnection(this) } }) }
2. 查询订阅并获取优惠信息
private fun querySubscriptionDetails() { val params = QueryProductDetailsParams.newBuilder() .setProductList( listOf( QueryProductDetailsParams.Product.newBuilder() .setProductId("你的订阅ID") .setProductType(BillingClient.ProductType.SUBS) .build() ) ) .build() billingClient.queryProductDetailsAsync(params) { result, detailsList -> if (result.responseCode == BillingClient.BillingResponseCode.OK && detailsList.isNotEmpty()) { val subDetails = detailsList[0] displayDiscountedPrice(subDetails) } } } private fun displayDiscountedPrice(subDetails: ProductDetails) { // 获取基础套餐原价 val basePrice = subDetails.subscriptionOfferDetails?.firstOrNull { it.basePlanId == "你的基础套餐ID" // 可在控制台订阅详情页查看 }?.pricingPhases?.pricingPhaseList?.first()?.formattedPrice // 筛选你设置的50%优惠套餐 val discountOffer = subDetails.subscriptionOfferDetails?.firstOrNull { it.offerId == "你的优惠ID" // 控制台创建优惠时生成的ID } discountOffer?.let { offer -> val discountedPrice = offer.pricingPhases.pricingPhaseList.first()?.formattedPrice // 展示优惠价与原价对比 priceTv.text = "$discountedPrice(原价$basePrice)" } ?: run { priceTv.text = basePrice } }
3. 发起带优惠的购买流程
fun startPurchase(activity: Activity, subDetails: ProductDetails, discountOffer: ProductDetails.SubscriptionOfferDetails) { val flowParams = BillingFlowParams.newBuilder() .setProductDetailsParamsList( listOf( BillingFlowParams.ProductDetailsParams.newBuilder() .setProductDetails(subDetails) .setOfferToken(discountOffer.offerToken) // 传入优惠token是关键 .build() ) ) .build() billingClient.launchBillingFlow(activity, flowParams) }
四、常见排查点
- 优惠是否已发布:控制台创建后必须点击「Publish」,草稿状态不生效
- 用户资格:若设置新用户优惠,已订阅过该产品的用户无法享受
- 地区匹配:确认优惠开启了印度地区的支持
- 订阅关联:检查优惠是否绑定了正确的目标订阅
- 同步延迟:Play配置变更需要1-2小时同步,最长不超过24小时
- 客户端缓存:测试前可清除应用缓存或卸载重装
内容的提问来源于stack exchange,提问作者Nikul Vaghani
相关产品推荐
相关产品推荐

