应用内购测试正常但App Store审核被拒问题求助
解决App Store内购审核因Guideline 2.1被拒的问题
我太懂这种测试全过、审核翻车的憋屈了——用测试账号测内购一切顺畅,结果提交审核就栽在收据验证上。核心问题其实很明确:你的生产服务器没处理好「带生产签名的App从Apple沙箱环境获取的收据」,毕竟审核团队是用沙箱环境测试内购的,而你的服务器大概率只对接了Apple的生产验证端点。
下面是Apple官方推荐的修复方案,照着调整就能解决这个问题:
1. 给服务器的收据验证逻辑加「动态环境切换」
Apple提供两个收据验证端点:
- 生产环境:
https://buy.itunes.apple.com/verifyReceipt - 沙箱环境:
https://sandbox.itunes.apple.com/verifyReceipt
你需要让服务器遵循这个流程:
- 先把用户提交的收据发送到生产验证端点
- 如果返回的状态码是
21007(这个码明确表示当前收据来自沙箱环境),立刻切换到沙箱端点重新发起验证 - 其他状态码按正常逻辑处理(比如
0代表验证成功,其他错误码对应处理失败场景)
2. 别再根据App构建类型硬编码验证环境
很多开发者会踩这个坑:Debug版本连沙箱端点,Release版本连生产端点。但审核时用的是Release签名的App,却在沙箱环境测内购,这时候硬编码的生产端点就会返回错误,直接导致验证失败。
正确的做法是完全抛弃「根据App环境选端点」的逻辑,只靠Apple返回的状态码来动态切换——这是Apple官方明确建议的方案,能覆盖所有场景。
3. 务必测试调整后的逻辑
改完服务器代码后,一定要验证这个流程:
- 打一个Release包,用测试账号完成内购,拿到沙箱收据
- 把这个收据发给你的生产服务器,确认它能正确识别
21007状态码,并自动切换到沙箱端点完成验证 - 同时也要测试正式生产收据的验证,确保正常购买流程不受影响
另外还要注意:发送给Apple的收据必须做Base64编码,请求体要符合Apple的要求(比如用JSON格式,包含receipt-data字段)。
内容的提问来源于stack exchange,提问作者Rahul Sharma




