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

如何检查iOS付费应用用户是否退款?验证方案正确性咨询

关于苹果应用退款检测及权限限制的正确方案

你计划通过检查AppStoreReceiptUrl是否为空来判断用户是否退款的方法并不正确,也不可靠,原因及正确实现方式如下:

为什么检查AppStoreReceiptUrl为空不可靠

  • AppStoreReceiptUrl为空的场景不止退款:用户设备离线、本地收据文件被意外删除、应用首次安装未完成购买验证等情况,都会导致该字段为空,无法直接关联到用户退款行为。
  • 用户退款后,苹果不会主动删除本地收据文件,也不会将AppStoreReceiptUrl置空,因此这个判断逻辑完全不成立。

正确的退款检测方式:收据服务器端验证

唯一可靠的方式是将用户的收据提交到苹果官方验证服务器,通过返回的响应判断交易是否已退款:

具体步骤

  1. 获取本地收据数据
    通过AppStoreReceiptUrl读取本地收据文件,将其转换为Base64编码的字符串(注意即使Url存在,也要进行服务器验证,本地收据可能被篡改或过期)。

  2. 提交验证请求
    向苹果验证服务器发送POST请求,请求体为JSON格式:

    {
      "receipt-data": "你的Base64编码收据字符串",
      "password": "你的应用共享密钥(如果有自动续期订阅则必填)"
    }
    
    • 生产环境:苹果官方生产环境验证服务器
    • 沙箱测试环境:苹果官方沙箱测试环境验证服务器
  3. 解析响应判断退款状态
    服务器返回的JSON响应中,查看latest_receipt_info或in_app数组内的交易条目:

    • 如果某条交易存在cancellation_date字段(格式为ISO 8601时间戳),说明该交易已被用户退款。
    • 同时注意响应状态码:
      • 0:收据验证成功
      • 21006:收据有效但订阅已过期(非退款)
      • 21007:收据来自沙箱环境,需切换到沙箱验证地址重试

额外注意事项

  • 必须在你的后端服务器发起验证请求,禁止在客户端直接验证(客户端验证容易被逆向篡改,导致权限控制失效)。
  • 处理服务器返回的错误状态,比如21005(服务器暂时不可用)需要设置重试机制,避免误判。
  • 对于订阅类应用,退款后可能需要立即终止用户的订阅权限,并清理相关数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:57:21