App Store 退款:开发者能看到什么
作者:Mehdi Azizi
发布于 ,8分钟
App Store 退款由 Apple 单独决定。开发者收到 CONSUMPTION_REQUEST,可在 12 小时内回应,再通过 REFUND 得知结果。
在 App Store 上,批准还是拒绝退款,由 Apple 决定,从来不是开发者。 用户在 Apple 的网站上或在你的 app 里提交申请。如果你接入了 Apple 的服务器通知,用户提交申请时你会收到 CONSUMPTION_REQUEST 通知,做出决定时再收到 REFUND 或 REFUND_DECLINED。在这两者之间,你有 12 小时可以发送消耗数据和你的倾向,前提是用户同意了。
退款一旦批准,这笔购买就会从用户的有效权益中移除,并在你的销售报告里显示为负数。这篇指南会讲清楚每一步、你能发给 Apple 什么,以及面对恶意退款你能做什么。规则来自 Apple 的官方页面,我在 2026 年 11 月 3 日重新核对过。真实案例来自我 10 月给自己的 app 接上的一个提醒。
App Store 退款由谁决定?
Apple,只有 Apple。Apple 的支持页面描述了用户的流程:登录 reportaproblem.apple.com,选择“Request a refund”,填写原因,再选中对应的购买项目。Apple 会提示用户等待 24 到 48 小时获得答复。
用户也可以在你的 app 里申请退款。StoreKit 为此提供了一个退款申请面板,从 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 里有五种类型跟这里有关。它们会发到你在 App Store Connect 里填写的 HTTPS 地址,生产环境一个,沙盒环境一个。
| 通知 | 含义 | 你要做的 |
|---|---|---|
CONSUMPTION_REQUEST | 用户申请退款 | 在 12 小时内回应(需用户同意) |
REFUND | Apple 已经退款 | 收回已退款的内容或访问权限 |
REFUND_DECLINED | Apple 拒绝了申请 | 什么都不用做,访问权限继续有效 |
REFUND_REVERSED | 用户申诉后,Apple 撤销了退款 | 恢复你之前收回的内容 |
REVOKE | 通过家人共享获得的购买不再可用 | 收回该家庭成员的访问权限 |
你的服务器必须返回 200 到 206 之间的 HTTP 状态码。根据通知响应的说明页面,否则 Apple 会重试五次,分别在上一次尝试之后的 1、12、24、48 和 72 小时。沙盒环境只发送一次。
Consumption API:你能告诉 Apple 什么
收到申请后,你可以用 Send Consumption Information 回应。规则就是 Apple 的一句话:“Respond within 12 hours of receiving the CONSUMPTION_REQUEST notification.” API 第 2 版适用于所有产品类型,包括订阅。
请求的字段:
| 字段 | 必填 | 告诉 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。你可以从四种策略中选一种:倾向全额退款、倾向拒绝、只发送消耗数据,或者不回应。
开启数据共享,就等于确认你已经获得了用户的同意。RevenueCat 自己也这么说:“Enabling consumption data sharing confirms that you obtained consent from your Customers.” 它还建议只对特定用户群使用“Prefer no refund”,如果这个倾向覆盖了你大部分用户,它会给出提醒。
如果你还想在自己的服务器上收到通知,RevenueCat 在 app 设置里提供了“Apple Server Notification Forwarding URL”字段,说明见它关于 Apple 通知的页面。我用的就是这个。用 RevenueCat 搭建订阅的方法见 RevenueCat 与 iOS 应用内订阅。
对收入和订阅的影响
对访问权限。 根据 currentEntitlements 的文档,“Products that the App Store has refunded or revoked don't appear in the current entitlements”。如果你的 app 用 currentEntitlements 检查权益,已退款的访问权限会自动消失。交易里会带上撤销的日期和原因,分别在 revocationDate 和 revocationReason 中。
对报告。 根据销售报告的帮助页面,退款会以负的单位数和负的用户价格显示。对订阅来说,订阅数据页面会把全额和部分退款都算作事件,并从每日单位数中扣除。
对你的信誉。 Guideline 5.6.4 把过多的退款申请列为质量不达标的迹象之一。退款率高不只是损失钱:Apple 在判断你是否遵守行为准则时可能会考虑它。
我的案例:给自己的 app 接上的提醒
2026 年 10 月 12 日,我给自己的 app 接上了一个提醒。RevenueCat 把 Apple 的通知转发到 devoria.fr 的一个路由。它先验证 Apple 的签名,再给我发一条提醒,不带金额。我想在申请到来的那一刻就看到它,而不只是看到结果。
10 月 18 日,第一个真实申请来了,来自我的交易模拟器 TradaZen。一个年度订阅,在 7 天免费试用结束时扣的款。填写的原因:误购。三点教训:
- 同一个申请可能会来好几次。 同一天晚上我收到了三次一样的提醒。从那以后,每条提醒都按通知类型和交易 ID 去重。
- 决定不到一天就出来了。 Apple 在申请后大约 22 小时拒绝了。用户保留了访问权限。
- 被拒不代表结束。 同一个用户两天后又对同一笔交易提交了申请。
试用结束时以“误购”为由的申请,靠回应 Apple 是赢不了的。要在首次扣款之前,在付费墙上就预防。
在不违规的前提下减少恶意退款
允许的做法:
- 用户同意后,用准确的数据回应每一个申请。
- 表达有针对性的倾向,比如对已经消耗完的购买倾向拒绝,而不是对所有人一律拒绝。
- 把每个
REFUND关联到一个用户账户。 Apple 关于退款通知的页面建议这样做,以便发现重复退款。 - 购买前把用户买的是什么讲清楚。 Guideline 3.1.2(c) 要求在提供订阅之前,说明用户花这个价格能得到什么。
禁止的做法:
- 发送虚假数据让申请被拒,或者在没有同意的情况下回应。
- 通过广告追踪弹窗获取同意,Apple 已经明确排除了这一点。
- 设计诱导购买。 Guideline 5.6 禁止诱导用户做出非本意的购买,或对未交付的内容收费。
- 向申请退款的用户施压。 同一条规则要求客服保持尊重,不得恐吓。
最有效的手段还是在前面:付费墙上写清楚价格、首次扣款日期和取消方式。要避免的错误见付费墙常见错误,试用规则见 App Store 免费试用。
上线前先测试
根据退款申请测试页面,沙盒和 Xcode 的 StoreKit 测试都支持退款申请。在沙盒里,任何原因都会自动批准。要模拟拒绝,选择“Other”并输入 DECLINE。要模拟按比例退款,输入 GRANT_PRORATED。在沙盒里,你的消耗数据回应必须在五分钟内发出。
一个更少被退款的订阅
iOS & Android Kit 基于我自己 app 的代码,引导页、付费墙和订阅都已经写好,按四个步骤带你上架 App Store,节奏由你掌握。完整搭建方法见 iOS 应用内订阅页面,Apple 的订阅规则见 guideline 3.1.2。
上线付费墙之前,先做一次免费诊断:它会告诉你项目真正卡在哪里,并把我的 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 在判断你是否遵守行为准则时可能会考虑这一点。

