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

Android Google Billing Lib订阅优惠未生效问题及实现咨询

Google Play订阅优惠不生效问题排查与解决方案

一、订阅优惠生效核心流程

  1. 控制台创建并发布优惠,关联目标订阅
  2. Play服务器同步优惠配置(通常1-2小时,最长24小时)
  3. 客户端通过Billing库拉取商品详情时,获取包含优惠的订阅信息
  4. 客户端筛选并展示优惠价格,发起购买时传入优惠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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:20