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

Google Play Billing 5中如何从ProductDetails获取订阅freeTrialPeriod

解决方案

Google Play Billing Library 5.x 版本用ProductDetails替代废弃的SkuDetails后,原顶层的freeTrialPeriod字段确实被移除,免费试用期信息没有做平级迁移,而是被整合到了订阅商品的定价阶段配置中,可以通过解析定价阶段列表拿到对应值,和旧版字段的返回格式完全兼容。

提取逻辑

免费试用期本质是订阅优惠中价格为0的特殊计费阶段,按以下步骤提取即可:

  • 先判断商品类型:仅SUBS(订阅)类型商品存在免费试用期可能,一次性内购商品直接跳过该逻辑
  • 从ProductDetails实例中取subscriptionOfferDetails字段,该字段是当前订阅下所有可用offer(基础计划、新用户优惠、召回优惠等)的列表
  • 遍历每个offer下pricingPhases.pricingPhaseList里的所有定价阶段,找到priceAmountMicros等于0、billingPeriod非空的阶段,该阶段的billingPeriod值就是免费试用期时长,格式遵循ISO 8601标准,比如P7D代表7天、P1M代表1个月,和旧版SkuDetails.freeTrialPeriod的返回规则完全一致

代码参考(Kotlin)

/**
 * 从ProductDetails中提取免费试用期时长
 * @return 免费试用期ISO 8601格式字符串,无免费试用时返回null
 */
fun fetchFreeTrialPeriod(productDetails: ProductDetails): String? {
    if (productDetails.productType != BillingClient.ProductType.SUBS) return null
    
    productDetails.subscriptionOfferDetails?.forEach { offer ->
        offer.pricingPhases.pricingPhaseList.forEach { pricingPhase ->
            if (pricingPhase.priceAmountMicros == 0L && pricingPhase.billingPeriod.isNotEmpty()) {
                return pricingPhase.billingPeriod
            }
        }
    }
    return null
}

注意事项:如果同一个订阅配置了多个带免费试用的差异化offer(比如新用户7天试用、流失召回用户14天试用),上述代码会返回第一个遍历到的免费时长。业务上如果需要匹配特定offer的试用时长,可以先根据offerId、offerTags或者用户资格判定逻辑筛选到目标offer,再提取对应定价阶段的信息即可,不需要遍历所有offer。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:39:03