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
相关产品推荐
相关产品推荐

