# App Store 退款：开发者能看到什么

> App Store 退款由 Apple 单独决定。开发者收到 CONSUMPTION_REQUEST，可在 12 小时内回应，再通过 REFUND 得知结果。

原始页面：[App Store 退款：开发者能看到什么](https://devoria.fr/zh-hans/blog/app-store-refund-what-developer-sees)
作者：[Mehdi Azizi](https://devoria.fr/zh-hans/mehdi-azizi)
发布：2026-11-04
内容最后修订：2026-11-04


在 App Store 上，**批准还是拒绝退款，由 Apple 决定，从来不是开发者。** 用户在 Apple 的网站上或在你的 app 里提交申请。如果你接入了 Apple 的服务器通知，用户提交申请时你会收到 `CONSUMPTION_REQUEST` 通知，做出决定时再收到 `REFUND` 或 `REFUND_DECLINED`。在这两者之间，你有 12 小时可以发送消耗数据和你的倾向，前提是用户同意了。

退款一旦批准，这笔购买就会从用户的有效权益中移除，并在你的销售报告里显示为负数。这篇指南会讲清楚每一步、你能发给 Apple 什么，以及面对恶意退款你能做什么。规则来自 Apple 的官方页面，我在 2026 年 11 月 3 日重新核对过。真实案例来自我 10 月给自己的 app 接上的一个提醒。

## App Store 退款由谁决定？

Apple，只有 Apple。[Apple 的支持页面](https://support.apple.com/en-us/118223)描述了用户的流程：登录 reportaproblem.apple.com，选择“Request a refund”，填写原因，再选中对应的购买项目。Apple 会提示用户等待 24 到 48 小时获得答复。

用户也可以在你的 app 里申请退款。StoreKit 为此提供了[一个退款申请面板](https://developer.apple.com/documentation/storekit/transaction/beginrefundrequest%28in%3A%29-9k0pj)，从 iOS 15 开始可用。Apple 建议从账户设置或帮助菜单里调用它。面板会显示购买项目和一组原因选项，Apple 最多需要 48 小时做出决定。

**两种情况下，你都不需要审批任何东西。** 你只能提供信息和倾向，它们只是 Apple 决策时参考的多个因素之一。

## 每一步双方各自看到什么

| 步骤         | 用户端                    | 开发者端                                 |
| ------------ | ------------------------- | ---------------------------------------- |
| 提交申请     | Apple 的表单或 app 内面板 | `CONSUMPTION_REQUEST` 通知               |
| 12 小时内    | 等待                      | 可以发送消耗数据                         |
| 48 小时内    | 收到 Apple 的答复         | `REFUND` 或 `REFUND_DECLINED` 通知       |
| 批准之后     | 钱退回原支付方式          | 购买从有效权益中移除，单位数为负         |
| 用户申诉之后 | Apple 撤销退款            | `REFUND_REVERSED` 通知，需要恢复访问权限 |

App Store Connect 只会在 Sales and Trends 里显示已经批准的退款。**退款申请本身只能通过服务器通知得知。** 没有通知，你只能事后才发现退款。

## 退款相关的服务器通知

[App Store Server Notifications V2](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype) 里有五种类型跟这里有关。它们会发到你在 App Store Connect 里填写的 HTTPS 地址，生产环境一个，沙盒环境一个。

| 通知                  | 含义                           | 你要做的                       |
| --------------------- | ------------------------------ | ------------------------------ |
| `CONSUMPTION_REQUEST` | 用户申请退款                   | 在 12 小时内回应（需用户同意） |
| `REFUND`              | Apple 已经退款                 | 收回已退款的内容或访问权限     |
| `REFUND_DECLINED`     | Apple 拒绝了申请               | 什么都不用做，访问权限继续有效 |
| `REFUND_REVERSED`     | 用户申诉后，Apple 撤销了退款   | 恢复你之前收回的内容           |
| `REVOKE`              | 通过家人共享获得的购买不再可用 | 收回该家庭成员的访问权限       |

你的服务器必须返回 200 到 206 之间的 HTTP 状态码。根据[通知响应的说明页面](https://developer.apple.com/documentation/appstoreservernotifications/responding-to-app-store-server-notifications)，否则 Apple 会重试五次，分别在上一次尝试之后的 1、12、24、48 和 72 小时。沙盒环境只发送一次。

## Consumption API：你能告诉 Apple 什么

收到申请后，你可以用 [Send Consumption Information](https://developer.apple.com/documentation/appstoreserverapi/send-consumption-information) 回应。规则就是 Apple 的一句话：“Respond within 12 hours of receiving the `CONSUMPTION_REQUEST` notification.” API 第 2 版适用于所有产品类型，包括订阅。

[请求](https://developer.apple.com/documentation/appstoreserverapi/consumptionrequest)的字段：

| 字段                    | 必填 | 告诉 Apple 的内容                                     |
| ----------------------- | ---- | ----------------------------------------------------- |
| `customerConsented`     | 是   | 用户同意共享其数据                                    |
| `deliveryStatus`        | 是   | 购买已交付且正常可用，或者没交付的原因                |
| `sampleContentProvided` | 是   | 购买前是否提供了试用、片段或说明                      |
| `consumptionPercentage` | 否   | 已消耗的比例，0 到 100 000 对应 0 到 100%             |
| `refundPreference`      | 否   | 你的倾向：`DECLINE`、`GRANT_FULL` 或 `GRANT_PRORATED` |

有两点要注意。如果 `deliveryStatus` 不是 `DELIVERED`，消耗比例必须为零。如果是订阅按比例退款，不要填消耗比例：Apple 会自己计算。

**用户同意是一切的前提。** Apple 写道：“You must obtain valid consent from the customer before sharing their personal data with Apple in the Send Consumption Information API.” 没有同意，就不要回应。Apple 也禁止用广告追踪弹窗来获取这份同意：“Don't use the AppTrackingTransparency prompt to obtain consent”。

## 如果你用 RevenueCat

用 RevenueCat 的话，接收 Apple 通知并回应申请的是它，功能叫 [Refund Control](https://www.revenuecat.com/docs/customers/refund-control)。你可以从四种策略中选一种：倾向全额退款、倾向拒绝、只发送消耗数据，或者不回应。

开启数据共享，就等于确认你已经获得了用户的同意。RevenueCat 自己也这么说：“Enabling consumption data sharing confirms that you obtained consent from your Customers.” 它还建议只对特定用户群使用“Prefer no refund”，如果这个倾向覆盖了你大部分用户，它会给出提醒。

如果你还想在自己的服务器上收到通知，RevenueCat 在 app 设置里提供了“Apple Server Notification Forwarding URL”字段，说明见[它关于 Apple 通知的页面](https://www.revenuecat.com/docs/platform-resources/server-notifications/apple-server-notifications)。我用的就是这个。用 RevenueCat 搭建订阅的方法见 [RevenueCat 与 iOS 应用内订阅](https://devoria.fr/zh-hans/blog/revenuecat-ios-in-app-subscription-setup)。

## 对收入和订阅的影响

**对访问权限。** 根据 [`currentEntitlements` 的文档](https://developer.apple.com/documentation/storekit/transaction/currententitlements)，“Products that the App Store has refunded or revoked don't appear in the current entitlements”。如果你的 app 用 `currentEntitlements` 检查权益，已退款的访问权限会自动消失。交易里会带上撤销的日期和原因，分别在 `revocationDate` 和 `revocationReason` 中。

**对报告。** 根据[销售报告的帮助页面](https://developer.apple.com/help/app-store-connect/reference/reporting/summary-sales-report)，退款会以负的单位数和负的用户价格显示。对订阅来说，[订阅数据页面](https://developer.apple.com/help/app-store-connect/measure-app-performance/view-subscription-data)会把全额和部分退款都算作事件，并从每日单位数中扣除。

**对你的信誉。** [Guideline 5.6.4](https://developer.apple.com/app-store/review/guidelines/#5.6.4) 把过多的退款申请列为质量不达标的迹象之一。退款率高不只是损失钱：Apple 在判断你是否遵守行为准则时可能会考虑它。

## 我的案例：给自己的 app 接上的提醒

2026 年 10 月 12 日，我给自己的 app 接上了一个提醒。RevenueCat 把 Apple 的通知转发到 devoria.fr 的一个路由。它先验证 Apple 的签名，再给我发一条提醒，不带金额。我想在申请到来的那一刻就看到它，而不只是看到结果。

10 月 18 日，第一个真实申请来了，来自我的交易模拟器 TradaZen。一个年度订阅，在 7 天免费试用结束时扣的款。填写的原因：误购。三点教训：

1. **同一个申请可能会来好几次。** 同一天晚上我收到了三次一样的提醒。从那以后，每条提醒都按通知类型和交易 ID 去重。
2. **决定不到一天就出来了。** Apple 在申请后大约 22 小时拒绝了。用户保留了访问权限。
3. **被拒不代表结束。** 同一个用户两天后又对同一笔交易提交了申请。

> 试用结束时以“误购”为由的申请，靠回应 Apple 是赢不了的。要在首次扣款之前，在付费墙上就预防。

## 在不违规的前提下减少恶意退款

**允许的做法：**

- **用户同意后，用准确的数据回应每一个申请。**
- **表达有针对性的倾向**，比如对已经消耗完的购买倾向拒绝，而不是对所有人一律拒绝。
- **把每个 `REFUND` 关联到一个用户账户。** [Apple 关于退款通知的页面](https://developer.apple.com/documentation/storekit/handling-refund-notifications)建议这样做，以便发现重复退款。
- **购买前把用户买的是什么讲清楚。** [Guideline 3.1.2(c)](https://developer.apple.com/app-store/review/guidelines/#3.1.2) 要求在提供订阅之前，说明用户花这个价格能得到什么。

**禁止的做法：**

- **发送虚假数据**让申请被拒，或者在没有同意的情况下回应。
- **通过广告追踪弹窗获取同意**，Apple 已经明确排除了这一点。
- **设计诱导购买。** [Guideline 5.6](https://developer.apple.com/app-store/review/guidelines/#5.6) 禁止诱导用户做出非本意的购买，或对未交付的内容收费。
- **向申请退款的用户施压。** 同一条规则要求客服保持尊重，不得恐吓。

最有效的手段还是在前面：付费墙上写清楚价格、首次扣款日期和取消方式。要避免的错误见[付费墙常见错误](https://devoria.fr/zh-hans/blog/ios-paywall-beginner-mistakes)，试用规则见 [App Store 免费试用](https://devoria.fr/zh-hans/blog/introductory-offer-app-store-connect-ios-free-trial)。

## 上线前先测试

根据[退款申请测试页面](https://developer.apple.com/documentation/storekit/testing-refund-requests)，沙盒和 Xcode 的 StoreKit 测试都支持退款申请。在沙盒里，任何原因都会自动批准。要模拟拒绝，选择“Other”并输入 `DECLINE`。要模拟按比例退款，输入 `GRANT_PRORATED`。在沙盒里，你的消耗数据回应必须在五分钟内发出。

## 一个更少被退款的订阅

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios) 基于我自己 app 的代码，引导页、付费墙和订阅都已经写好，按四个步骤带你上架 App Store，节奏由你掌握。完整搭建方法见 [iOS 应用内订阅](https://devoria.fr/zh-hans/expertise/ios-in-app-subscription)页面，Apple 的订阅规则见 [guideline 3.1.2](https://devoria.fr/zh-hans/blog/guideline-3-1-2-subscription-rejection-paywall)。

上线付费墙之前，[先做一次免费诊断](https://devoria.fr/zh-hans/diagnostic)：它会告诉你项目真正卡在哪里，并把我的 Apple 防拒审清单发给你。

## 常见问题

### 开发者能拒绝 App Store 退款吗？

不能。由 Apple 单独决定。你可以发送消耗数据和倾向，比如 `DECLINE`，它们只是多个因素之一。最终决定权在 Apple。

### 开发者会收到退款申请的通知吗？

会，前提是接入了 App Store Server Notifications V2。用户提交申请时 Apple 发送 `CONSUMPTION_REQUEST`，做出决定时再发送 `REFUND` 或 `REFUND_DECLINED`。没有通知的话，你只能在报告里看到已批准的退款。

### Apple 处理退款申请需要多久？

Apple 告诉用户是 24 到 48 小时。StoreKit 文档说最多 48 小时。你这边有 12 小时发送消耗数据。

### 退款后访问权限会怎样？

已退款的购买会从用户的有效权益中移除：StoreKit 2 不会再在 `currentEntitlements` 里返回它。如果 Apple 之后撤销了退款，你会收到 `REFUND_REVERSED`，需要恢复访问权限。

### 回应 Apple 需要用户同意吗？

需要。通过 Consumption API 共享任何数据之前，Apple 要求获得有效的同意。没有同意，就不要回应通知。也不能用广告追踪弹窗来获取同意。

### 退款会对我的 app 不利吗？

有可能。Guideline 5.6.4 把过多的退款申请列为质量不达标的迹象之一，Apple 在判断你是否遵守行为准则时可能会考虑这一点。


## 你的项目

[iOS & Android Kit](https://devoria.fr/zh-hans/kits/ios)：用 Claude Code 打造你的 iPhone 和 Android 应用：我自己应用的起步代码、上架商店的完整流程，以及全部工具包。¥739。

[诊断：你离自己的 iPhone 应用还差什么](https://devoria.fr/zh-hans/diagnostic)：7 个问题，60 秒：看清真正阻碍你发布 iPhone 应用的原因，拿到你的 4 步路线和适合你的套件。
