背景
最近APP发版前,测试用沙盒账号回归iOS内购项目时,发现订阅项目及消耗类型项目购买成功后并没有下发相应的权益。随即通过接口日志发现是苹果票据校验的接口,返回21003
错误码。
{
"environment":"Sandbox", "status":21003}
翻阅苹果文档 ,可以看到21003
错误码的解释:
21003
The system couldn’t authenticate the receipt.(系统无法验证票据)
追因
通过分析,最近唯一对内购方面的改动是在做自动续订,因为自动续订,需要生成共享秘钥
主共享密钥是用于接收你所有自动续期订阅收据的唯一代码。要测试或提供自动续期订阅,你必须拥有主共享密钥或为每个 App 生成 App 专用共享密钥。
但是苹果明明说的是对自动续订项目,需要共享秘钥
,所以我们潜意识认为消耗性项目和非续期订阅项目是不需要共享秘钥
验证的。但是通过测试我们发现。一但我们生成了共享秘钥
之后,你新打出来的 iPA 包,或者新运行的包,如果服务端在与苹果服务器校验票据时,没有传共享秘钥
,那么,内购中的所有票据都是无法通过验证的。
解决
通过苹果文档 我们服务端在与苹果服务器校验票据时,需要将共享秘钥
通过password
参数传递过去,以便苹果服务器校验。
加上共享秘钥
之后,所有票据校验均通过。