测试应用内月度订阅时为何按天收费且试用期仅1天?
结论
这是 Google Play 对测试订阅进行的时间压缩,通常不表示订阅配置有遗漏。
购买账号被识别为许可测试账号后,Google Play 会缩短订阅周期和免费试用期,方便开发者快速测试续订、取消、宽限期和到期等流程。因此,即使后台配置的是“每月续订、免费试用 30 天”,测试购买页面也可能显示“每天续订、试用 1 天”。正式用户购买时,仍以 Play Console 中实际生效的订阅方案为准。
为什么测试周期会缩短
如果每次测试订阅都要等待一个月才能续订,完整验证订阅生命周期会耗费很长时间。测试环境会加快这些状态的变化:
- 免费试用开始和结束
- 自动续订
- 用户取消后继续使用至当前周期结束
- 付款失败、宽限期和账号保留
- 订阅到期
- 恢复购买
“每天收费”表示测试订阅周期经过了压缩,不代表系统会按照正式价格每天持续扣款。测试购买通常会在确认页面标明这是一笔测试交易,具体文案可能因 Play Store、Play Console 配置和测试账号状态而不同。
应该检查什么
先确认 Play Console 中的正式订阅方案仍采用以下配置:
- 结算周期:每月
- 免费试用期:30 天
- 订阅方案和优惠处于有效状态
- 应用包名与创建订阅商品的应用一致
- 代码使用的 product ID 与后台配置完全一致
再检查当前的购买账号:
- 该账号已添加为许可测试账号。
- 该账号可以访问对应的内部测试、封闭测试或开放测试版本。
- Play Store 当前登录的购买账号确实是这个测试账号。
- 如果设备上登录了多个 Google 账号,需要确认付款页面选中的是哪个账号。
- Play Console 中的修改已经保存并发布。部分配置可能无法立即同步到 Play Store。
如果购买页面显示测试交易提示,订阅周期同时被压缩为一天,通常可以判断测试账号已被正确识别。
通过 API 核对商品信息
使用 In-app Billing API v3 时,可以通过 getSkuDetails() 获取 Google Play 返回的订阅信息。客户端不应自行写死“30 天”或“每月”等购买文案。
ArrayList<String> skuList = new ArrayList<>();
skuList.add("monthly_subscription");
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
Bundle skuDetails = billingService.getSkuDetails(
3,
getPackageName(),
"subs",
querySkus
);
int responseCode = skuDetails.getInt("RESPONSE_CODE");
if (responseCode == 0) {
ArrayList<String> detailsList =
skuDetails.getStringArrayList("DETAILS_LIST");
if (detailsList != null) {
for (String details : detailsList) {
try {
JSONObject json = new JSONObject(details);
String productId = json.optString("productId");
String price = json.optString("price");
String subscriptionPeriod =
json.optString("subscriptionPeriod");
String freeTrialPeriod =
json.optString("freeTrialPeriod");
Log.d("Billing", "productId=" + productId);
Log.d("Billing", "price=" + price);
Log.d("Billing", "subscriptionPeriod=" + subscriptionPeriod);
Log.d("Billing", "freeTrialPeriod=" + freeTrialPeriod);
} catch (JSONException e) {
Log.e("Billing", "Invalid SKU details", e);
}
}
}
}
周期通常使用 ISO 8601 格式,例如:
P1M // 一个月
P30D // 30天
P1D // 1天
API 返回的商品元数据和测试结算流程中的时间压缩是两个不同的概念。即使商品配置仍显示 P1M,测试购买的实际续订过程也可能被加速。最终购买条款以 Google Play 付款确认页面显示的内容为准。
如果非测试账号也显示每天续订
如果普通用户账号也看到按天续订,就不能只归因于测试机制,需要检查以下问题:
- 是否误建了按天计费的基础方案
- 当前购买的是否为另一个 product ID 或基础方案
- 月度方案是否已经发布,并向对应地区开放
- 旧配置、草稿配置和当前生效配置是否一致
- Play Store 是否仍在使用未更新的商品缓存
- 服务端是否选择了错误的 offer token 或订阅方案
可以换一台干净设备,或清除 Play Store 相关缓存,再使用另一个具备测试资格的账号验证。不要为了检查页面展示而让真实用户直接产生费用。
注意事项
测试环境的续订次数、时间压缩比例和状态流转规则,可能随着 Google Play Billing 版本及测试机制的调整而变化。因此,不能把“1 天”这样的等待时间写入业务逻辑。应用应根据购买状态、有效期和服务端校验结果授予权益,不能依赖本地定时器推算订阅是否有效。
新项目也不宜继续以旧版 In-app Billing API v3 为实现基础。应优先采用当前受支持的 Google Play Billing Library,并在服务端完成购买令牌校验、购买确认和订阅状态同步。无论使用哪种接口,测试页面出现“每天续订、试用 1 天”,通常都是测试订阅的正常表现。
备注:内容仅供参考。