PAYATHON 2026

MAUI Android Billing 如何获取订阅的 base plan?

数据小陈

结论

base1 和 base12 是订阅商品 liuannual1 下的 base plan ID,不是独立商品 ID。查询时应传入 liuannual1 和 BillingClient.ProductType.Subs,再从返回的 ProductDetails 中读取用户可用的订阅选项。Google Play Billing 查询订阅时,会返回订阅商品详情,以及符合用户条件的 base plan 和 offer 信息。Google Play Billing:查询商品详情

查询后读取 base plan

查询代码的方向是对的:SetProductId(product.Id) 应使用 liuannual1,而不是 base1 或 base12。查询结果中的 SubscriptionOfferDetails 条目会提供 BasePlanId、可能存在的 OfferId,以及发起购买所需的 OfferToken。例如,在 Android 原生 Billing API 中,可以按 base plan ID 查找对应条目:

val productDetails = /* queryProductDetailsAsync 返回的 liuannual1 */

val plans = productDetails.subscriptionOfferDetails.orEmpty()
for (plan in plans) {
    val basePlanId = plan.basePlanId
    val offerId = plan.offerId // 仅促销 offer 有值;纯 base plan 通常为空
    val offerToken = plan.offerToken

    // 根据 basePlanId 选择 base1 或 base12,保存对应 offerToken
}

在 MAUI 项目中,实际调用的属性或方法名取决于使用的 Google Play Billing .NET/Xamarin 绑定。关键是遍历 ProductDetails 的订阅 offer 详情,并比较其中的 BasePlanId。如果绑定没有暴露这些字段,需要检查项目使用的绑定版本及其 API 映射。

发起购买时使用对应的 offer token

选定 base plan 后,用对应条目的 OfferToken 构造购买参数。查询商品时不要把 base plan ID 当作商品 ID,也不要自行拼接 token。订阅购买需要使用查询得到的 ProductDetails 和所选订阅选项的 token。Google Play Billing:订阅与购买流程

如果结果里没有某个 base plan

查询结果只包含当前用户符合购买条件的订阅选项,不会列出 Play Console 中配置的全部计划。确认 base1 和 base12 已激活,且适用于当前测试账号、国家/地区及测试环境;同时检查查询回调中未获取到的商品信息和错误状态。Google 文档说明,订阅查询会返回用户有资格购买的 offers,每个订阅最多返回 50 个。Google Play Billing:集成与查询结果

备注:内容仅供参考。