Flutter订阅内购沙箱StoreKit收据校验持续返回Apple 21002错误的排查求助
Flutter订阅内购沙箱StoreKit收据校验持续返回Apple 21002错误的排查求助
大家好,我最近在做一个基于Flutter的订阅内购项目,用Node.js后端对接Apple的收据校验API,结果一直卡在沙箱环境的21002错误上,快愁死了,想请教下有没有朋友遇到过类似的情况,给点排查思路?
先说说核心问题:
- 我从Flutter的
purchaseDetails.verificationData.serverVerificationData拿到的是base64编码的收据数据,原封不动传给后端后,后端会先调用Apple生产环境的校验接口,遇到21007错误(收据来自沙箱)再自动切换到沙箱接口——但不管怎么试,返回的都是21002错误。根据Apple的文档,这个错误表示收据格式有问题,要么结构无效,要么编码不正确。
我已经做了一堆排查,但都没解决:
- 确认了共享密钥(Shared Secret)和App Store Connect里的配置完全一致,没有输错
- 核对了APP的Bundle ID,和项目配置、App Store Connect里的完全匹配
- 检查了收据字符串的长度,确实超过了60字符,也加了日志看收据开头的内容(为了可读性做了截断),看起来是标准的base64格式
- 试过部署全新的TestFlight构建、重置测试设备、用从未用过的全新测试账号,结果还是一样的21002
- 甚至删除了所有旧的TestFlight构建和测试人员,重新提交了构建,问题依旧
还有个更摸不着头脑的细节:
这个测试设备之前装过另一个Bundle ID的旧版本APP(早期的MFA测试版),虽然早就把旧APP删掉了,甚至连TestFlight都卸载重装了,但TestFlight里居然还能看到旧构建的痕迹,感觉设备上好像残留了之前的状态,会不会这个遗留状态导致收据校验出问题了?
想请教下:有没有朋友遇到过看起来完全合法的沙箱收据,却持续被Apple返回21002的情况?或者对我这个场景里的TestFlight遗留状态问题有什么排查建议?万分感谢!
内容来源于stack exchange




