1、前言
今年 WWDC 2020 苹果全球开发者大会,苹果宣布所有的内购品项类型,当用户退款成功时,开发者都能收到退款通知!!!退款通知!!!退款通知!!!
针对 App 内购买项目的退款通知现已可用
2020 年 06 月 24 日 App Store 服务器通知现在包含所有类型的 App 内购买项目的退款通知 (包括消耗型项目、非消耗型项目和非续期订阅)。这些信息能帮助您采取相应的行动,并告知他们相关的优惠更改,以及如何重新订阅。
2、处理退款
2.1 退款流程
在 2020 年 06 月 24 日之前,开发者完全不知道有用户退款了!(只有每月账单里看到退款的一个总数量 -。-):

2020 年 06 月 24 日开始,苹果新增流程:

2.2 退款通知
在苹果后台可以配置一个退款通知的回调地址(一个App配置一条链接):

配置的回调链接必须满足条件:
- 满足应用传输安全要求(使用
https) - URL 最长 255 字符
注意:这里的 https 是指苹果的 App Transport Security (ATS),其中有协议的要求,比如使用 Transport Layer Security (TLS) protocol 1.2 版本,具体见苹果文档: Preventing Insecure Network Connections | Apple Developer Documentation。
2.3 退款通知的类型
苹果把回调的通知分为2种类型:
- 退款通知类型
- 取消通知类型
其中新增加的退款通知类型是针对:
- 消耗型
- 非消耗型
- 非续期订阅
取消通知类型是针对:
- 自动续期订阅

2.4 退款通知的内容
苹果返回的通知内容为 JSON 对象数据,所有的退款订单的通知是在 unified_receipt 里的 latest_receipt_info 数组中:

| 字段 | 说明 |
|---|---|
| environment | 收据生成的环境。values: Sandbox, PROD。自动续订订阅是可以沙盒环境测试取消订阅。 |
| latest_receipt | Base64编码的最新交易收据。 |
| latest_receipt_info | 收据的列表 |
| notification_type | 通知类型,退款的值应该是:REFUND, 可参考:notification_type |
| password | 验证收据时的 password,App 专用共享密钥是用于接收此 App 自动续订订阅收据的唯一代码。如果您需要将此 App 转让给其他开发者,或者需要将主共享密钥设置为专用,可能需要使用 App 专用共享密钥。 |
| bid | App的 bundle id(包名) |
| bvrs | App的版本号 |
| unified_receipt | 退款的订单信息在这里 |
在 unified_receipt 里的 latest_receipt_info 是一个数组,其中包含的最近的100次应用内购买交易:

数据中每个退款订单的主要字段:

| 字段 | 说明 |
|---|---|
| original_transaction_id | 苹果订单的唯一标识 transaction_id |
| cancellation_data_ms | 退款的时间 |
| cancellation_reason | 用户退款的原因。(0或1,含义未知) |
| bid | 应用包名 bundle id |
| product_id | 商品唯一标识 id |
详细的返回字段见官方文档:
- responseBody | Apple Developer Documentation
- unified_receipt | Apple Developer Documentation
- responseBody.Latest_receipt_info | Apple Developer Documentation
2.5 退款通知的响应
您的服务器应发送HTTP状态代码,以指示服务器到服务器的通知接收是否成功:
- 如果回调接收成功,则发送 HTTP
200。您的服务器不需要返回数据。 - 如果回调接收不成功,请发送 HTTP
50x或40x让 App Store 重试该通知。App Store在一段时间内尝试重试该通知,但在连续失败尝试后最终停止(3次)。
注意事项:
- 当您使用包含退款交易的收据
transaction_data向苹果服务器校验 verifyReceipt 时,JSON响应中不存在退款交易,自动续订订阅除外。 - 收到
REFUND通知时,您有责任为每笔退款交易存储,监控并采取适当的措施。(因为苹果只通知一次,暂时无法在苹果后台查询退款的订单。也不能由开发者主动去苹果服务器查询。)
2.6 自动续订订阅通知
这个取消通知之前就一直有,所以这里不重复了,需要的自行搜索。
自动续订订阅的相关文档: