You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Google Play Billing Library V8(Kotlin)本地获取订阅购买对应的基础方案信息

如何通过Google Play Billing Library V8(Kotlin)本地获取订阅购买对应的基础方案信息

嘿,这个问题我做订阅功能时也踩过坑!其实Billing Library V8已经把基础方案(Base Plan)和优惠方案(Offer)的信息直接存在订阅类型的Purchase对象里了,只是你需要先把它转换成对应的子类类型,就能直接读取到,完全不用麻烦服务器~

我给你改改你的代码,你一看就懂:

suspend fun queryCurrentPurchases() {
    val purchaseResult = billingClient.queryPurchasesAsync(
        QueryPurchasesParams.newBuilder().setProductType(ProductType.SUBS).build()
    )
    if (purchaseResult.billingResult.responseCode == BillingResponseCode.OK) {
        purchaseResult.purchasesList.forEach { purchase ->
            println("${purchase.purchaseToken}, ${purchase.isAcknowledged}")
            purchase.products.forEach { productId -> println(productId) }
            
            // 关键:把Purchase转换成订阅专属的Purchase.Subscription类型
            if (purchase is Purchase.Subscription) {
                // 直接获取基础方案ID
                val basePlanId = purchase.basePlanId
                // 如果用户买的是带优惠的Offer,这里能拿到优惠方案ID,否则为null
                val offerId = purchase.offerId
                
                println("用户购买的基础方案ID:$basePlanId")
                offerId?.let { println("用户使用的优惠方案ID:$it") }
            }
        }
    }
}

几个关键点说明:

  • 因为你查询的是ProductType.SUBS(订阅),所以返回的purchasesList里的所有Purchase实例都是Purchase.Subscription类型的,用is判断一下再转换是更安全的写法(避免万一出现非订阅类型的异常)。
  • basePlanId就是用户实际购买的那个基础方案的ID,和你在Google Play Console里配置的基础方案ID完全一致。
  • 如果用户是通过优惠Offer(比如免费试用、折扣)购买的,offerId会返回对应的优惠方案ID;如果是直接买的基础方案,offerId就是null。

要是你还需要这个基础方案的详细信息(比如订阅周期、价格),可以先调用queryProductDetailsAsync获取该订阅产品的详情,然后用basePlanId去匹配ProductDetails.SubscriptionOfferDetails里的对应项,但如果只是要知道用户买了哪个基础方案,上面的代码就完全够用啦!

火山引擎 最新活动