基于Google Play Billing Library 4.0的订阅免费试用管理问题
Google Play Billing Library 4.0 订阅问题解答
问题1:querySkuDetailsAsync返回的freeTrialPeriod为空
- 开发者决定资格的免费试用Offer不会填充到
SkuDetails的freeTrialPeriod字段中,该字段仅对应订阅基础方案配置的免费试用。 - 需通过
SkuDetails.getSubscriptionOfferDetails()获取所有可用订阅Offer(含你配置的免费试用Offer和基础方案),每个Offer会包含对应的offerToken及试用信息。 - Play控制台配置变更通常需1-2小时完全生效,若刚配置完成可等待一段时间后重试。
问题2:发起购买时指定是否应用免费试用
场景1:从未购买的客户A享受免费试用
- 从
SkuDetails.getSubscriptionOfferDetails()中筛选出免费试用Offer(可通过freeTrialPeriod或offerId识别),提取其offerToken。 - 构建
BillingFlowParams时传入该token:
// 筛选免费试用Offer的token val freeTrialOfferToken = skuDetails.subscriptionOfferDetails?.firstOrNull { offer -> !offer.freeTrialPeriod.isNullOrEmpty() }?.offerToken // 发起购买时指定试用Offer val flowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .apply { freeTrialOfferToken?.let { setSubscriptionOfferToken(it) } } .build() billingClient.launchBillingFlow(activity, flowParams)
- 需先通过
queryPurchasesAsync或后端接口验证客户A从未购买过该订阅,再应用此Offer。
场景2:从未购买的客户B直接按原价扣费
- 从
SkuDetails.getSubscriptionOfferDetails()中获取基础方案的offerToken(可通过自定义的offerId识别,如"base_plan")。 - 构建
BillingFlowParams时传入基础方案的token:
// 筛选基础方案的token val basePlanOfferToken = skuDetails.subscriptionOfferDetails?.firstOrNull { offer -> offer.offerId == "base_plan" }?.offerToken // 发起购买时指定基础方案 val flowParams = BillingFlowParams.newBuilder() .setSkuDetails(skuDetails) .apply { basePlanOfferToken?.let { setSubscriptionOfferToken(it) } } .build() billingClient.launchBillingFlow(activity, flowParams)
此方式会直接按基础方案原价扣费,不触发免费试用。
内容的提问来源于stack exchange,提问作者David Burgos Prieto
相关产品推荐
相关产品推荐

