【问题标题】:How to manage Google Billing subscription with free trial period?如何管理具有免费试用期的 Google Billing 订阅?
【发布时间】:2023-01-05 07:16:30
【问题描述】:
这是 Google Play 控制台中的当前测试设置:
- 测试产品1
- 订阅基础计划 1:持续时间 1 个月
- 订阅基础计划 2:持续时间 6 个月
queryProductDetailsAsync的结果是3个offer:
- 报价1
- 优惠2
- 定价阶段 1:P1W(免费)
- 定价阶段 2:P6M
- 优惠3
该应用程序动态地向用户展示所有可用的优惠,以便可以通过 Google Play 控制台远程管理优惠。
问题是要约 2 出现此外提供 3. 如果基本计划有报价并且用户有资格获得它,我想隐藏基本计划(报价 3),因为它有点多余,因为它不如 P1W (free) + P6M(报价 2)有吸引力。
另一方面,如果用户已经订阅P1W (free) + P6M并在免费试用期内取消,他们不应该获得P1W (free) + P6M,而只能获得基本计划P6M。我假设这已经由 Google Billing 管理,因为 queryProductDetailsAsync 应该只返回用户可用的优惠。
在 queryProductDetailsAsync 回复中,我看不到要约 2 正在使用要约 3 作为基本计划。它们显示为两个不相关的报价,这使得很难在应用程序中添加任何逻辑来隐藏基本报价。我能想到的唯一解决方案是使用offerTags,向基本计划添加一个唯一 ID,以便能够相互关联。
如果优惠 2 也可用,隐藏优惠 3 的最佳方法是什么?
【问题讨论】:
标签:
google-play-services
in-app-subscription
【解决方案1】:
根据docs,标签似乎是谷歌打算使用的:
标签是最多包含 20 个字符的可选标签,您可以使用它来标记或分组基本计划和报价,并在 API 中识别它们。标签可用于确定在用户有资格获得多个优惠时显示哪个优惠。您最多可以添加 20 个标签。用户看不到标签。
提示:我们建议使用标签来识别使用开发人员确定的资格创建的优惠,以帮助在显示可供用户使用的优惠集合时区分它们。
这似乎是将报价确定为基本计划的一部分的唯一方法。这是令人惊讶的,因为 Google Billing 已经知道该优惠是基本计划的一部分,为什么我们必须乱用自定义标签来获取该信息?更令人惊讶的是,Google Billing API 5.0 直到最近(2022 年 5 月)才进行了重新设计,但缺少这样的基本功能。
【解决方案2】:
2022 年 5 月,Google 重新设计了订阅。原始问题和我的回答与这些更改有关,更多详细信息here。
参考问题,最后有两种方法排除重复的基本报价.我们大多数人都会有兴趣应用这些解决方案中的一种,因为基本计划(根据定义)对用户的吸引力不如适用的优惠,对吗?
-
使用标签识别当前接受的答案中提到的计费 API 提供的报价并记录在here(搜索“标签”)。
-
使用优惠编号,在 Google Play 控制台中为任何配置的优惠设置的。基本计划没有它,而且在运行时检测起来很简单。记录here:
笔记:此字段仅为打折商品设置。对于常规基本计划,返回 null。
示例实现(基于 Billing Client 5.1.0):
- 通过
ProductDetails.getSubscriptionOfferDetails()获取订阅优惠列表(SubscriptionOfferDetails)
- 其中一个优惠代表订阅基本计划,
SubscriptionOfferDetails 的实例包含offerId/getOfferId() 方法下的null 值。
-
TLDR:要过滤掉基本计划,我建议检查返回的订阅报价列表是否大于一个,如果是,则从中删除基本计划报价(删除
offerId == null 所在的那个)。