所有文章
Deep dive阅读需 8 分钟

付费应用的退款永远不会通知你的服务器,所以只能由应用自己发现

买断制付费应用的退款会绕过你的服务器监听的所有通知。Google 给买家两小时的退货期并卸载应用,Apple 可依据你签署的协议在 90 天内退款,两者都不会向你索取证据。本文说明每个商店会告诉你什么、退款让你损失什么,以及如何在应用内检测。

木桌上的一部智能手机,旁边是一张撕破的商店收据和几枚硬币,示意付费应用退款

要点

  • 付费应用退款针对的是应用下载本身的价格,而不是应用内购买。Apple 和 Google 都没有为它记载任何服务器通知。
  • Google Play Console 帮助文档称,买家购买付费应用后有最多两小时可以退货并获得全额退款,同一款应用只能退一次。
  • Google Play 的退款政策称,应用会在退款过程中被卸载,买家再次购买同一应用后不能再次退款。
  • Apple 的 App Store Server Notifications V2 中的 REFUND 类型涵盖消耗型项目、非消耗型项目、自动续期订阅和非续期订阅。应用本身的购买不在这个列表中。
  • Apple 开发者计划许可协议 Schedule 2 第 6.3 条允许 Apple 为下载后 90 天内取消购买的买家退款,并由开发者向 Apple 偿付这笔款项。
  • Apple 的 StoreKit 文档在 AppTransaction(应用购买的签名记录)上列出了 revocationDate,应用可以在设备上检查它。
  • CONSUMPTION_REQUEST 和 Google Play 的 orders.reviewrefund 都没有记载适用于应用下载购买,因此付费应用退款在没有开发者证据的情况下就被裁定。

买断制付费应用的退款走的是一扇侧门,大多数退款工具从不盯着它。当买家退掉的是应用本身,而不是在应用内买的东西时,Apple 和 Google 会直接从你的收入中扣回这笔钱,却不会向你的服务器发送任何通知。Google 至少会卸载应用。在 iOS 上,Apple 官方论坛里的开发者反映,退款后的买家仍在继续使用应用。如果你销售付费应用,付费应用退款是唯一一种你只能在报表里看到一行负数的退款,除非应用在设备上主动检查。

Google Play 和 App Store 上的付费应用退款规则

两个商店都把下载购买视为一种独立商品,适用各自的规则。以下是各商店文档中的说法。

规则Google PlayApp Store
快速自助退货购买后最多两小时内,全额退款无文档记载
更长的申请窗口买家可在 48 小时内申请,之后需联系开发者依据开发者协议 Schedule 2,Apple 可在下载后 90 天内退款
可退次数每款应用一次。再次购买后不能再退无文档记载
应用会怎样在退款过程中被卸载无文档记载。开发者反映退款买家仍可使用
开发者能否退款可以,仅限全额退款,在 Play Console 中操作不能
发给你的服务器通知无文档记载无文档记载
向你索取证据无文档记载无文档记载

Google Play 的两小时退货如何运作

Google 的 Play Console 帮助文档说得很直白。购买付费应用后,用户有最多两小时可以退货并获得全额退款,而且同一款应用只能退一次。Google 面向消费者的退款政策还补充说,在 48 小时内,买家可能可以根据购买情况获得退款,应用会在退款过程中被卸载,再次购买同一应用的人不能再为它退款。超过 48 小时后,Google 会让买家去找开发者。

Apple 如何为付费应用退款

在 App Store 上,买家通过 reportaproblem.apple.com 向 Apple 提出申请,选择原因,然后选中该应用。Apple 表示预计会在 24 到 48 小时内给出处理结果。你无法自行为 App Store 购买退款。你的合同设定了最长期限。Apple 开发者计划许可协议 Schedule 2 第 6.3 条规定,如果买家希望在下载后九十天内取消,或者应用不符合你的规格说明或适用法律,Apple 可以全额退款,而你需要向 Apple 偿付该金额或给予等额抵扣。

为什么你的服务器永远收不到付费应用退款的消息

两个商店发出的所有退款信号都是为应用内购买设计的。Apple 将 notificationType 描述为触发通知的应用内购买或外部购买事件。它的 REFUND 类型涵盖消耗型项目、非消耗型项目、自动续期订阅或非续期订阅。Get Refund History 返回的是客户已退款的应用内购买。应用下载不在其中任何一个列表里。

Google 也是一样。实时开发者通知涵盖订阅、一次性商品和作废购买,而作废购买的 productType 只能是订阅或一次性购买。Voided Purchases API 说明它适用于一次性应用内订单和订阅,而且只能回溯 30 天。

付费应用退款会触发 CONSUMPTION_REQUEST 吗?

不会。Apple 的文档称,当客户为消耗型应用内购买或自动续期订阅申请退款时,它会发送 CONSUMPTION_REQUEST。这是两个商店中仅有的两种会向开发者索取证据的退款流程之一。另一种是 Google Play 的退单审核,需在 24 小时内通过 orders.reviewrefund 回应,它同样经由应用内购买的通知流到达。两者都没有记载适用于应用下载。付费应用退款的裁定,不会参考你能提供的任何东西。

退款后的买家还能继续使用应用吗?

在 Google Play 上,政策规定应用会被卸载。在 iOS 上,Apple 论坛里有开发者正是在问这个问题。2025 年 3 月的一个帖子写道:“当用户对买断制付费应用退款后,他们仍然可以访问该应用。”另一个 2022 年的帖子怀疑有买家购买、安装、退款后继续使用。第三个帖子发于 2025 年 6 月,询问 App Store Server Notifications V2 究竟会不会报告应用级别的退款。这三个帖子都没有得到 Apple 的回答。

付费应用退款让你损失多少钱

收入这一侧是可预测的。Google 的 Play Console 帮助文档称,你退款时它会退还其服务费,因此从你收入中扣除的是你的分成,而不是标价。如果退款发生在 Google 已经向你付款之后,会从未来的付款中扣除;如果你的余额保持为负至少 48 小时,Google 可能会从你的银行账户扣款。在 Apple 这一侧,合同规定你偿付与价格相等的金额。实际上,RevenueCat 在 2022 年报告称,Apple 扣除的是显示为 Extended Partner Share 的扣佣后金额,也就是说 Apple 没有保留它的抽成。

拿不回来的,是你为服务这位买家已经付出的成本。来看一个示例。一款售价 $6.99 的付费照片应用通过云端模型运行滤镜,并把项目同步到云存储。你为一条广告付了钱,这条广告带来了这位买家。

成本项在 Google Play 上是否返还在 App Store 上是否返还
你在 $6.99 中的分成从你的收入中扣回从你的收入中扣回
商店服务费或佣金由 Google 返还给你据 RevenueCat 的报告,不收取
已消耗的云端推理和 API 调用否否
已同步项目的存储否否
获取该买家的广告支出否否
买家继续使用应用时持续产生的服务器成本终止,应用已被卸载持续,直到你的应用进行检查

最后一行正是 iOS 变得昂贵的地方。保留了应用的退款买家会继续调用你的后端,退款之后的每一次推理请求、同步和 API 调用,都是没有收入支撑的成本。对于没有服务器成本的付费应用,退款只是损失了一笔销售。对于有后端的应用,它可能变成一张不断累积的账单。

如何在应用内检测付费应用退款

既然服务器什么也收不到,检查就必须从设备上开始,再通知你的服务器。

在 iOS 上,读取 AppTransaction 的 revocationDate

AppTransaction 是 App Store 对客户购买该应用的签名记录。Apple 的 StoreKit 文档现在在其上列出了 revocationDate 属性,描述为应用购买的撤销日期。在启动时读取 AppTransaction.shared,验证结果,并把非 nil 的 revocationDate 视为已退款的下载。把签名值发送到你的服务器,让它停止为该账户提供服务。

  • Apple 表示,即使在退款或重新购买之后,同一个 Apple 账户的 appTransactionID 也保持不变。所以用它作为记录的键,再次付费的买家就能被识别出来。
  • AppTransaction.refresh() 会从 App Store 获取一份新的记录,但会显示登录提示。Apple 建议只在用户明确操作之后调用它,例如点击“恢复”按钮。
  • 签名值保存在设备上。Apple 的文档没有为它描述任何服务器通知,所以你的服务器只能知道应用上报的内容。
一位开发者在笔记本电脑前拿着屏幕上显示挂锁的手机,在付费应用退款后检查访问权限

在 Android 上,向 Play Integrity 请求许可判定

Google 的卸载能处理大多数情况,但某些副本可能在卸载后依然存在,例如从备份侧载的副本。Play Integrity API 会为已登录账户返回 appLicensingVerdict。LICENSED 表示用户拥有应用授权。UNLICENSED 表示没有,Google 建议显示 GET_LICENSED 对话框。UNEVALUATED 表示 Google 无法检查,例如用户没有登录 Google Play。Google 还指出,在一些较旧的设备上,用户卸载后仍保留授权,所以 LICENSED 并不能在每台设备上都证明购买仍然有效。

让服务器充当守门人

客户端检查可能被打补丁绕过。真正值得保护的是你的后端所做的付费工作,所以让后端拒绝以下账户的调用:最近一次上报为退款、上报为 UNLICENSED 判定,或在你设定的宽限期过后仍没有任何判定。这样才能防止退款变成免费算力。

付费应用何时应该转向应用内购买

Apple 自己关于更改商业模式的指南,描述了如何从付费应用转为带应用内购买的免费应用,并使用 AppTransaction 上的 originalAppVersion,继续为购买过付费版本的用户提供高级功能。这一转变在退款方面的好处很具体。一旦价格放在非消耗型项目或订阅上,退款就会以 REFUND 通知和作废购买的形式到达,你的服务器可以据此采取行动,而 App Store 上的订阅退款申请会触发 CONSUMPTION_REQUEST。这些正是 RefundHalt 监听的信号,并且会在 12 小时和 24 小时的时限内作出回应。付费下载一个都不会给你。

常见问题解答

在 Google Play 上,买家有多长时间可以退掉付费应用?
根据 Google 的 Play Console 帮助文档,购买后最多两小时内可全额退款,而且每款应用只能退一次。Google 的退款政策还称,买家可能可以在 48 小时内获得退款,超过之后 Google 会让买家联系开发者。应用会在退款过程中被卸载。
有人为我的付费应用退款时,Apple 会通知我的服务器吗?
没有任何有文档记载的通知。Apple 的 App Store Server Notifications 涵盖的是应用内购买事件,REFUND 类型只列出消耗型项目、非消耗型项目、自动续期订阅和非续期订阅。应用可以在设备上读取 AppTransaction 的 revocationDate,并上报给你的服务器。
退款后的买家还能继续使用付费 iOS 应用吗?
Apple 论坛上的开发者反映可以,而且 Apple 的文档没有描述任何在退款后移除应用的步骤。在启动时检查 AppTransaction 的 revocationDate,并让你的服务器停止为上报了已退款下载的账户提供服务。
我可以自己为付费应用退款吗?
在 Google Play 上可以。Play Console 允许你为付费应用发起全额退款,但不能部分退款,而且 Google 会退还其服务费。在 App Store 上不行。只有 Apple 能为 App Store 购买退款。
我能用使用数据作为证据,对付费应用退款提出申诉吗?
不能。Apple 的 CONSUMPTION_REQUEST 记载适用于消耗型项目和自动续期订阅,而 Google Play 通过 orders.reviewrefund 进行的退单审核,经由为应用内商品和订阅设计的通知到达。两个商店都没有为应用购买本身记载任何证据流程。

来源和延伸阅读

RefundHalt

App Store 和 Google Play 退款自动驾驶

继续阅读

下一项退款请求已经在路上。

读完又一封关于未能申辩退款的支持邮件所需的时间,足够您完成 RefundHalt 设置。