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

基于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享受免费试用

  1. 从SkuDetails.getSubscriptionOfferDetails()中筛选出免费试用Offer(可通过freeTrialPeriod或offerId识别),提取其offerToken。
  2. 构建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)
  1. 需先通过queryPurchasesAsync或后端接口验证客户A从未购买过该订阅,再应用此Offer。

场景2:从未购买的客户B直接按原价扣费

  1. 从SkuDetails.getSubscriptionOfferDetails()中获取基础方案的offerToken(可通过自定义的offerId识别,如"base_plan")。
  2. 构建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:55:16