从原理到实操的权威指南
目录导读
为什么需要测试应用内购买恢复
应用内购买(In-App Purchase,IAP)的恢复功能是用户体验的核心保障,当用户更换设备、重装应用或误删购买记录时,恢复机制能自动找回历史购买内容(如订阅、去广告、解锁关卡等)。约30%的IAP相关投诉源于恢复失败,导致用户流失率增加,测试恢复功能不仅是App Store/Google Play商店的审核强制要求,更是维护用户信任的关键环节。

核心恢复机制解析:iOS与Android的差异
iOS(App Store)
- 使用
SKPaymentQueue.default().restoreCompletedTransactions()方法 - 恢复时会弹出Apple ID认证弹窗,需用户输入密码/面容ID
- 测试必须在 沙盒环境 中进行,使用沙盒测试账号
Android(Google Play)
- 通过
PurchasesUpdatedListener监听恢复结果 - 调用
queryPurchases()或queryPurchaseHistory()方法 - 测试需使用 许可测试账号 并在Google Play Console中配置
关键差异:iOS需要显式调用恢复方法,Android则通过查询已购列表实现被动恢复;iOS包含“消费型商品”和“非消费型商品”的恢复逻辑不同,而Android所有购买均默认可查询。
测试前的环境准备清单
- 测试设备:至少2台不同系统版本的真机(模拟器可能无法完整模拟支付回调)
- 账号准备:
- iOS:在App Store Connect创建 沙盒测试账号(非真实Apple ID)
- Android:在Google Play Console白名单中添加测试邮箱
- 网络环境:关闭VPN,确保能直接连接沙盒/测试服务器
- 代码状态:确保应用的支付SDK版本已升级至最新(常用库:iOS的StoreKit 2,Android的Billing Library 5+)
分步测试方法:沙盒/测试账号/代码级验证
步骤1:模拟首次购买
在沙盒环境下完成一次真实购买(iOS使用沙盒账号,Android使用许可账号),确保支付成功回调中purchaseState为purchased。
步骤2:模拟恢复场景
-
iOS:
- 卸载应用,重装后点击“恢复购买”按钮
- 在代码中添加断点,确认
restoreCompletedTransactions被调用 - 验证恢复的订单ID与原始购买一致(检查
originalTransactionIdentifier)
-
Android:
- 使用同一Google账号在另一台设备登录,打开应用
- 应用启动时自动调用
queryPurchases() - 检查返回的
Purchase对象中的purchaseToken是否与首次购买相同
步骤3:边界测试
- 网络中断:在恢复过程中断开网络,检查是否触发重试逻辑
- 账号切换:用未购买过商品的账号尝试恢复,应提示“无历史购买”
- 跨平台:如果应用支持iOS+Android,恢复需独立测试(不同平台的购买记录不互通)
常见问题与QA问答
Q1:测试时恢复成功,但线上用户反映恢复失败,可能原因是什么?
A:常见原因包括:
- 线上环境与沙盒环境的签名验证差异(如iOS的生产证书未包含StoreKit功能)
- 用户未登录正确的Apple ID/Google账号
- 购买记录被清空(例如用户自行取消订阅后,非消耗型商品依然可恢复,消耗型商品则不能)
Q2:如何模拟“购买后立即恢复”的极端情况?
A:在首次购买回调成功后,立即调用恢复方法,iOS需注意SKPaymentTransaction的状态机顺序,建议在回调中延迟1秒后再执行恢复,避免竞争条件。
Q3:安卓恢复时出现“Item already owned”错误怎么办?
A:这通常是因为应用尝试二次消费同一个消耗型商品,对于非消耗型商品,应直接返回本地缓存;消耗型商品需在服务端标记已消耗,避免客户端重复查询。
Q4:测试时是否需要覆盖“恢复中途退出”的场景?
A:是的,用户可能在输入密码或弹窗时强制退出应用,应用应在启动时检查本地是否存储了未完成的恢复任务,并提示用户重新操作。
测试报告模版与自动化工具推荐
测试报告关键字段:
| 测试场景 | 设备/OS版本 | 账号类型 | 恢复结果 | 错误码 | 日志截图 |
|----------|-------------|----------|----------|--------|----------|
| 标准恢复 | iPhone 14 Pro/iOS 17.1 | 沙盒 | 成功 | 无 | - |
| 网络中断恢复 | Pixel 7/Android 14 | 许可账号 | 超时重试 | 3 | 见附件 |
自动化工具推荐:
- iOS:使用Xcode的
StoreKit Test(可编写Swift脚本模拟沙盒购买) - Android:借助
Robolectric或MockK模拟Google Play Billing响应 - 跨平台:如果使用Flutter或React Native,可集成
in_app_purchase_test库
应用内购买恢复测试是支付功能完整性的最后一道防线,只有通过严谨的沙盒验证、边界覆盖和自动化回归,才能确保用户在任何场景下都能无缝取回自己的购买资产,建议团队将恢复测试纳入CI/CD流水线,每次发布前至少执行一次完整用例集。
标签: 收据查询