如何在 Android 中测试 IAB v3 自动续订订阅?
结论
如果所使用的 Google Play Billing 文档明确写着:
Test purchases are only supported for in-app products, not for in-app subscriptions.
那么按照该版本当时的测试机制,IAB v3 的自动续订订阅无法通过 android.test.* 这类静态测试商品来模拟。API v3 支持订阅,是指它支持真实的订阅交易,并不表示静态测试购买也适用于订阅。
这种情况下,需要创建真实的订阅商品,将应用发布到 Google Play 测试轨道,再使用测试账号购买。测试是否收费、续订周期是否加速,取决于当前 Google Play Console 提供的许可测试机制。旧文档中的限制不一定适用于现在的 Play Billing 环境。
为什么静态测试商品无法测试订阅
Google Play 早期提供过以下静态商品 ID:
android.test.purchased
android.test.canceled
android.test.refunded
android.test.item_unavailable
这些商品主要用于测试一次性购买流程,包括:
- 应用能否正常发起购买;
- 能否正确处理购买成功、取消和商品不可用等状态;
- 能否解析返回的购买数据。
自动续订订阅还包含订阅周期、续订、取消、宽限期和到期等状态变化。静态测试商品没有真实的订阅生命周期,无法用来验证这些行为。
测试步骤
1. 在 Play Console 创建订阅商品
在应用中创建订阅及其基础方案,并记录对应的商品 ID,例如:
premium_monthly
商品需要处于可购买状态。基础方案、优惠和地区等具体配置,以当前 Play Console 页面为准。
2. 上传正式签名的构建
使用正式签名证书构建 APK 或 AAB,然后上传到内部测试、封闭测试或其他适用的测试轨道。
随意安装到本地的调试包经常无法正常调用 Play 购买流程,因为以下信息必须与 Play Console 中的应用配置一致:
- package name;
- 签名证书;
- version code;
- Play Console 中配置的应用和商品。
建议通过 Google Play 提供的测试链接安装应用。
3. 配置并使用测试账号
将测试用的 Google 账号加入对应的测试轨道。如果当前 Play Console 支持许可测试,还需要将该账号配置为 license tester。
购买前,应确认设备上的 Google Play 商店使用了正确的测试账号。如果设备同时登录了多个 Google 账号,购买界面实际使用的账号可能不容易判断。
4. 查询并发起订阅购买
下面是 IAB v3 时代的简化示例,用于说明订阅商品类型必须使用 subs,并非完整的生产实现:
Bundle skuDetails = billingService.getSkuDetails(
3,
getPackageName(),
"subs",
querySkus
);
Bundle buyIntentBundle = billingService.getBuyIntent(
3,
getPackageName(),
"premium_monthly",
"subs",
developerPayload
);
PendingIntent pendingIntent =
buyIntentBundle.getParcelable("BUY_INTENT");
startIntentSenderForResult(
pendingIntent.getIntentSender(),
REQUEST_CODE_SUBSCRIPTION,
new Intent(),
0,
0,
0
);
查询用户已拥有的订阅时,也要使用 subs:
Bundle purchases = billingService.getPurchases(
3,
getPackageName(),
"subs",
null
);
处理返回结果时,至少要读取以下内容:
int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
String signature = data.getStringExtra("INAPP_DATA_SIGNATURE");
在生产环境中,不能只根据客户端返回值开通权益。还需要校验购买签名,并尽可能通过服务端确认订阅状态。
如果当前环境仍不支持订阅测试
如果 Play Console 没有提供订阅测试、免收费测试或加速续订功能,只能按以下方式测试:
- 创建价格尽可能低且符合平台规则的真实订阅;
- 使用专门的测试账号购买;
- 验证首次购买和恢复购买;
- 在 Play 商店中取消订阅;
- 等待实际订阅周期结束,验证续订或到期逻辑;
- 测试完成后,根据实际情况退款或撤销购买。
退款、撤销和取消的含义不同。取消通常只会阻止下一次续订,用户权益可能一直保留到当前计费周期结束。退款或撤销则可能导致不同的权益终止结果。
需要覆盖的测试场景
自动续订订阅至少需要测试以下场景:
- 首次购买成功;
- 用户取消购买界面;
- 已拥有该订阅时再次购买;
- 应用重装或更换设备后的权益恢复;
- 自动续订成功;
- 用户关闭自动续订;
- 当前周期结束后订阅到期;
- 支付失败、宽限期和账号保留状态;
- 退款或撤销;
- 网络异常及购买结果延迟;
- 重复回调和幂等处理。
注意事项
android.test.purchased不能代替订阅商品,也无法模拟完整的续订生命周期。- “IAB v3 支持 subscriptions”和”静态 test purchases 支持 subscriptions”是两种不同的能力。
- 后续的 Google Play Billing Library 已经取代旧版 IAB v3。维护老项目时,可以按照 IAB v3 的接口排查问题;开发新应用或改造现有应用时,应使用当前受支持的 Billing Library。
- Google Play 的订阅测试规则曾多次调整。测试续订周期、最大续订次数、是否收费以及测试账号要求,都应以当前 Play Console 和对应 Billing Library 文档为准。
备注:内容仅供参考。
