You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式。

  • 检查设备与测试账号状态

    • 确保设备登录的是沙箱测试账号(非普通Apple ID),避免普通账号与沙箱账号冲突;
    • 重启设备后重新获取收据测试,沙箱环境的收据缓存偶尔会导致异常。
  • 验证收据数据完整性
    将App端获取的Base64字符串解码,确认能正常还原为二进制数据(可通过Python的base64.b64decode测试),如果解码失败,说明编码过程存在错误。

内容的提问来源于stack exchange,提问作者Shouheng Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:04:58