如何通过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里的对应项,但如果只是要知道用户买了哪个基础方案,上面的代码就完全够用啦!




