Swift获取Apple IAP收据数据错误,验证返回21002求助
Apple IAP沙箱收据验证21002错误排查方法
检查收据编码与传输格式
StoreKit2获取的收据是Data类型,转Base64字符串时要避免额外格式干扰:- 使用
data.base64EncodedString(options: .withoutEndLineBreak)生成无换行的Base64字符串,不要手动添加换行或空格; - 提交时务必将Base64字符串放入JSON的
receipt-data字段,确保JSON格式无语法错误,不要对字符串做二次转义。
- 使用
确认验证服务器地址
沙箱环境必须使用专属验证地址:https://sandbox.itunes.apple.com/verifyReceipt,误用到生产地址会直接返回21002错误。核对StoreKit2收据获取逻辑
确保获取收据的代码无异常,示例正确逻辑如下:Task { do { let receipt = try await AppStore.sync() let receiptData = receipt.data let base64Receipt = receiptData.base64EncodedString(options: .withoutEndLineBreak) // 将base64Receipt传递给验证逻辑 } catch { print("获取收据失败:\(error.localizedDescription)") } }同时要确认设备已登录沙箱测试账号,无网络故障导致收据不完整。
排查Python验证代码的请求处理
- 确保请求为POST方法,Content-Type设为
application/json; - 确认
receipt-data字段值为App端获取的原始Base64字符串,无截断、修改或多余字符; - 参考Python验证代码示例:
import requests def verify_sandbox_receipt(receipt_base64): url = "https://sandbox.itunes.apple.com/verifyReceipt" payload = {"receipt-data": receipt_base64} response = requests.post(url, json=payload) return response.json()
不要用form-data格式提交请求,苹果仅接受JSON格式。
- 确保请求为POST方法,Content-Type设为
检查设备与测试账号状态
- 确保设备登录的是沙箱测试账号(非普通Apple ID),避免普通账号与沙箱账号冲突;
- 重启设备后重新获取收据测试,沙箱环境的收据缓存偶尔会导致异常。
验证收据数据完整性
将App端获取的Base64字符串解码,确认能正常还原为二进制数据(可通过Python的base64.b64decode测试),如果解码失败,说明编码过程存在错误。
内容的提问来源于stack exchange,提问作者Shouheng Wang
相关产品推荐
相关产品推荐

