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

Android应用内订阅promo code验证及首单折扣实现咨询

Google Play订阅首周期折扣+后续原价续订实现方案

一、验证并应用优惠码调整订阅价格

官方推荐方案(基于Google Play Billing Library)

Google Play内置订阅促销功能,可直接实现首周期折扣,步骤如下:

  1. 在Play Console配置促销活动

    • 进入应用后台 → 变现 → 订阅 → 选择目标订阅ID
    • 创建新促销,设置类型为「折扣」,折扣力度50%,应用范围限定为「第一个计费周期」
    • 生成促销代码,可设置使用次数、有效期等限制
  2. 客户端实现优惠码验证与应用
    使用BillingClient的verifyPromoCode接口验证用户输入的优惠码,通过后获取对应优惠Offer的token,发起订阅时传入该token即可享受折扣:

// 初始化BillingClient(已集成可跳过)
private val billingClient = BillingClient.newBuilder(context)
    .setListener { _, purchaseResult -> /* 处理购买结果逻辑 */ }
    .enablePendingPurchases()
    .build()

// 验证用户输入的优惠码
fun validatePromoCode(subscriptionSku: String, promoCode: String) {
    val verifyParams = VerifyPromoCodeParams.newBuilder()
        .setSku(subscriptionSku)
        .setPromoCode(promoCode)
        .build()

    billingClient.verifyPromoCode(verifyParams) { result ->
        when (result.responseCode) {
            BillingClient.BillingResponseCode.OK -> {
                // 获取有效优惠Offer
                result.subscriptionOfferDetails?.firstOrNull()?.let { offer ->
                    val offerToken = offer.offerToken
                    // 更新UI显示折扣价(取首周期定价)
                    val firstPhasePrice = offer.pricingPhases.pricingPhaseList.first().formattedPrice
                    updateSubscriptionPriceDisplay(firstPhasePrice)
                    // 发起带折扣的订阅请求
                    launchDiscountedSubscription(subscriptionSku, offerToken)
                } ?: showError("该优惠码不适用于此订阅")
            }
            else -> showError("优惠码无效或已过期")
        }
    }
}

// 发起带折扣的订阅请求
fun launchDiscountedSubscription(sku: String, offerToken: String) {
    val skuParams = SkuDetailsParams.newBuilder()
        .setSkusList(listOf(sku))
        .setType(BillingClient.SkuType.SUBS)
        .build()

    billingClient.querySkuDetailsAsync(skuParams) { _, skuDetailsList ->
        skuDetailsList.firstOrNull()?.let { skuDetails ->
            val billingParams = BillingFlowParams.newBuilder()
                .setSkuDetails(skuDetails)
                .setOfferToken(offerToken) // 指定优惠token
                .build()
            billingClient.launchBillingFlow(activity, billingParams)
        }
    }
}

二、确保折扣周期结束后按原价续订

此逻辑无需额外开发,Google Play会自动处理:

  • 在Play Console配置促销活动时,确认选择「折扣应用范围」为「第一个计费周期」
  • 用户完成首周期折扣订阅后,后续自动续订将按照订阅的默认原价($200)计费
  • 可通过queryPurchasesAsync接口或实时开发者通知,监听订阅状态更新以确认续订价格

三、非Google Play内购的替代方案

若不想依赖Google Play促销系统,可采用「自有服务器+双SKU」方案:

  1. 创建两个订阅SKU

    • 折扣SKU:sub_200_50off,首周期定价$100(临时SKU)
    • 原价SKU:sub_200,长期续订定价$200
  2. 服务器管理优惠码

    • 服务器维护优惠码数据库,记录有效性、使用次数、绑定用户ID等信息
    • 用户输入优惠码后,客户端请求服务器验证,验证通过后返回购买折扣SKU的权限
  3. 订阅切换逻辑

    • 用户购买折扣SKU后,服务器监听订阅到期时间
    • 在折扣订阅到期前,推送通知引导用户升级到原价SKU;或通过Google Play订阅升级API自动完成切换(需用户确认)

注意:此方案需额外维护服务器逻辑和订阅状态同步,复杂度高于官方方案,仅在特殊场景下使用

内容的提问来源于stack exchange,提问作者Abhi Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:28:29