iOS 沙盒票据校验返回21003解决方案

在最新版本的APP测试中,发现iOS内购订阅和消耗项目购买后权益未下发,问题源于苹果的21003错误码,即系统无法验证票据。分析发现,即使对于非自动续订项目,生成共享秘钥后,票据校验也需要包含此秘钥。解决方案是服务端在验证时通过password参数传递共享秘钥,确保所有票据验证通过。
摘要由CSDN通过智能技术生成

背景

最近APP发版前,测试用沙盒账号回归iOS内购项目时,发现订阅项目及消耗类型项目购买成功后并没有下发相应的权益。随即通过接口日志发现是苹果票据校验的接口,返回21003错误码。

{"environment":"Sandbox", "status":21003}

翻阅苹果文档 ,可以看到21003错误码的解释:

21003
The system couldn’t authenticate the receipt.(系统无法验证票据)

追因

通过分析,最近唯一对内购方面的改动是在做自动续订,因为自动续订,需要生成共享秘钥
在这里插入图片描述

主共享密钥是用于接收你所有自动续期订阅收据的唯一代码。要测试或提供自动续期订阅,你必须拥有主共享密钥或为每个 App 生成 App 专用共享密钥。

但是苹果明明说的是对自动续订项目,需要共享秘钥,所以我们潜意识认为消耗性项目和非续期订阅项目是不需要共享秘钥验证的。但是通过测试我们发现。一但我们生成了共享秘钥之后,你新打出来的 iPA 包,或者新运行的包,如果服务端在与苹果服务器校验票据时,没有传共享秘钥,那么,内购中的所有票据都是无法通过验证的。

解决

通过苹果文档 我们服务端在与苹果服务器校验票据时,需要将共享秘钥通过password参数传递过去,以便苹果服务器校验。
在这里插入图片描述
加上共享秘钥之后,所有票据校验均通过。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
iOS 上,应用的沙盒目录是私有的,其他应用无法直接访问。因此,要从 JS 中获取 iOS 沙盒内的文件,需要通过 Native Bridge 的方式,即将 JS 中的请求传递给原生代码,由原生代码来实现文件读取并返回结果给 JS。 以下是一个简单的示例,假设你要获取沙盒内的一个名为 `example.txt` 的文件: 1. 在原生代码中实现文件读取逻辑,例如使用 `NSFileManager` 类读取文件内容: ```objc - (NSString *)readFileContentsAtPath:(NSString *)path { NSFileManager *fileManager = [NSFileManager defaultManager]; NSData *data = [fileManager contentsAtPath:path]; return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } ``` 2. 在 JS 中定义一个函数,用于调用原生代码并获取文件内容: ```js function getExampleFileContents() { // 调用 Native Bridge 方法,传递路径参数 const path = 'path/to/example.txt'; const contents = NativeBridge.readFileContentsAtPath(path); return contents; } ``` 3. 在原生代码中实现 Native Bridge 方法,并将其暴露给 JS 环境: ```objc - (void)registerNativeBridgeMethods { [self.bridge registerNativeMethod:@"readFileContentsAtPath" handler:^(NSString *path) { NSString *contents = [self readFileContentsAtPath:path]; // 将结果返回给 JS 环境 [self.bridge callHandler:@"onFileContentsReceived" withArguments:@[contents]]; }]; } ``` 4. 在 JS 中注册 `onFileContentsReceived` 回调函数,用于接收原生代码返回的文件内容: ```js function onFileContentsReceived(contents) { // 处理文件内容 console.log(contents); } NativeBridge.registerEventHandler('onFileContentsReceived', onFileContentsReceived); ``` 注意:以上示例仅为演示 Native Bridge 的基本用法,具体实现方式可能因框架、平台、业务需求等因素而异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装自己很用心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值