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

一次性购买退款是你真正能收回的那种少见退款,所以终身解锁只让你损失价款,别无其他

针对终身解锁、去广告升级或永久专业版的一次性购买退款,是你真正能撤销的那种退款,因为你可以把功能收回来。这里说明它在 App Store 和 Google Play 上的成本,为什么 Apple 从不先征询你的意见,以及如何让 revoke 真正生效。

一把打开的黄铜挂锁旁放着一张收据和一把钥匙,展示一次性购买退款中开发者把已解锁功能收回的情形

要点

  • 一次性购买项目是客户永久保留的一次性购买,比如去广告、终身专业版解锁、永久功能。与可消耗项目不同,交付时没有任何东西被消耗掉,所以一次性购买退款是唯一一种你可以退回金钱、同时收回功能的退款。
  • 这使得一次性购买退款成为你会遇到的最干净的损失。你损失的是售价,商店会退回它自己的佣金,但没有算力、没有 API 调用,也没有你已付费却无法收回的交付产物。损失被限定在价款之内。
  • 问题在于价格。终身解锁通常是你单价最高的产品,往往是月度订阅的十到三十倍,所以一笔一次性购买退款是你账户上几乎任何其他退款都比不上的单笔冲击。
  • 在 App Store 上,Apple 通过 reportaproblem.apple.com 独自决定每一笔一次性购买退款,而且针对一次性购买项目没有 CONSUMPTION_REQUEST。Apple 只在可消耗项目和自动续期订阅上发送那种证据请求,所以在一次性购买项目上你没有申辩的窗口,也完全没有证据通道。
  • Apple 仍会告诉你退款发生了。REFUND App Store Server Notification 会针对可消耗项目、一次性购买项目和非续期订阅触发,签名交易中带有 revocationDate 和 revocationReason。StoreKit 也会把该产品从 Transaction.currentEntitlements 中移除,这就是你关闭功能的信号。
  • 在 Google Play 上,你可以自己从 Play Console 或 orders.refund API 为一次性购买项目退款,把 revoke 设为 true 会立即终止访问权。Google 自己的 48 小时自助退款无需征询你,未确认的一次性购买会在 3 天后被自动退款并撤销。
  • 陷阱是在客户端控制访问权。如果一笔已退款的一次性购买在缓存收据或仅存于客户端的标志中仍被标记为已拥有,客户在钱退走之后仍保留功能,于是你损失了价款却还在继续提供解锁。要在你的服务器上根据撤销状态核验权益,每次启动都核验。

销售终身解锁、去广告升级或永久专业版,你卖出的就是一次性购买项目,这是唯一一种退款能真正撤销你所交付内容的购买。可消耗项目的退款收回的是你交付金币或点数时已经花掉的钱。订阅退款撤销的是本来就在出租的访问权。一次性购买项目的退款则不同,从一个狭义的角度看,它是你会遇到的最温和的退款:客户什么都留不下。你退回价款,收回功能,而且不像可消耗项目,你这边的账本上不会留下算力账单。这是好消息。坏消息是,一次性购买项目通常是你所售商品中单价最高的,所以这唯一一种你能干净撤销的退款,也是金额最大的退款之一。

什么是一次性购买项目,以及为什么它的退款行为不同

商店把每一笔购买归入某种类型,类型决定了退款能撤销什么、不能撤销什么。一次性购买项目位于可消耗项目的对立端。

一次性购买项目只买一次,永久保留

一次性应用内购买是一种永久权益。客户购买一次,就在账户的整个生命周期内拥有它:去广告、终身专业版、完整版解锁、永久功能包。Apple 在客户的各设备间免费恢复它,Google Play 把它绑定到账户。没有续期也没有到期,所以价值不会随时间分批计量,也不会在兑换时被消耗。它就是打开并保持开启。

交付时没有任何东西被花掉,所以退款可以干净地撤销它

这正是一次性购买退款不同的全部原因。当你交付一个金币包,金币被花掉,你的算力账单是真实且花掉了的。当你交付一次性购买项目,你翻动的是一个标志。没有与这笔销售挂钩的按次使用成本,所以当钱退回时,你可以把标志翻回去,几乎毫发无损。商店甚至会帮你:在两个平台上,已退款的一次性购买都会被撤销,客户失去访问权,而且无法再次购买并第二次退款。

一次性购买退款实际让你付出什么

出现在你报表里的数字,就是退出去的售价。在一次性购买项目上,这个数字几乎就是全部故事,这正是它与可消耗项目不同之处,可消耗项目的售价只是损失的起点。

成本你何时付出退款时是否收回
购买价款购买时否,全额退回给客户
商店在销售上的佣金购买时通常是,商店退回它自己的分成
交付解锁所需的算力或 API 调用没有,你翻动一个标志没有可收回的,也没有损失
功能本身你已授予访问权是,revoke 会把它收回
银行拒付费用,若争议闹到银行扣款之后否,而且在 Google Play 上你现在也要付这笔费用

损失就是价款,而价款正是问题所在

因为没有履约成本会被搁浅,一次性购买退款让你付出的是售价,别无其他。麻烦在于规模。一笔月度订阅退款退回几美元。终身解锁常常定价为 30、60 或 120 美元,正是因为客户只付一次,所以一笔一次性购买退款可能等于另一位用户一年的订阅收入。你看到它们的次数会远少于订阅退款,但每一笔冲击更重,而一小簇终身退款可能压过一个繁忙月份的普通流失。

两只手隔着桌子递回一把小黄铜钥匙,同时钱朝另一个方向滑回,展示一次性购买退款中功能被收回、价款被退回的情形

App Store 这一侧,Apple 从不先征询你

在 App Store 上你没有退款开关,而对于一次性购买项目,你也没有证据通道。这两点都值得说清楚,因为第二点会让那些以为消耗流程涵盖一切的开发者措手不及。

一次性购买项目没有 CONSUMPTION_REQUEST

Apple 自己决定每一笔退款,一次一个请求,通过 reportaproblem.apple.com。对于可消耗项目,以及自 2024 年起对于自动续期订阅,Apple 会向你的服务器发送 CONSUMPTION_REQUEST,并给你 12 小时回传消耗信息。一次性购买项目则什么都没有。没有消耗请求,没有 12 小时窗口,也没有可填的字段,因为 Apple 把永久解锁视为要么拥有、要么没有,没有什么可衡量的。在一次性购买退款上你没有发言权。你收到的是一份通知。

REFUND 通知是你得知退款发生的途径

你确实会收到的,是一条 REFUND App Store Server Notification。Apple 会针对可消耗项目、一次性购买项目和非续期订阅发送它,里面的签名交易带有 revocationDate(退款的时间戳)和 revocationReason。StoreKit 在设备上呈现同一事实:已退款的产品从 Transaction.currentEntitlements 中消失,StoreKit 会调用你的撤销权益处理程序,使应用可以关闭功能。把通知当作触发信号,把权益核查当作事实来源。当 revocationDate 被设置时,解锁就结束了。

Google Play 这一侧,你可以退款,但最快的路径绕过你

Google Play 给开发者的直接控制权比 Apple 多,尽管最伤人的那些退款仍然在没有你参与的情况下发生。

你可以自己为一次性购买项目退款并撤销

你可以从 Play Console,或用 Play Developer API 中的 orders.refund 方法,对任何不满三年的订单发起一次性购买退款。该调用接受一个 revoke 参数,把它设为 true 会立即终止对该应用内项目的访问权。Google Play 随后会把客户视为不再拥有该产品,卸载已退款的应用,并阻止在同一项目上重复购买再退款的循环。这是你拥有干净杠杆的唯一之处:退款加 revoke 确实能把永久解锁收回。

48 小时和 3 天的路径在没有你参与下运行

有两种 Google Play 一次性购买退款在你没有任何输入的情况下发生。在购买后 48 小时内,客户可以直接从商店获得自助退款,而不会征询你。另外,如果你的服务器在 3 天内从未确认购买,Google Play 会自动退款并撤销,认定客户已付款却从未收到商品。这两者都在你介入之前就已决定,而 Voided Purchases API 是你事后得知的途径,好让你取消权益。

当一次性购买项目变成拒付时,用金钱来衡量意味着什么

退款是失去一次性购买销售的便宜版本。拒付是昂贵版本,而在终身价格上,两者的差距很大。

争议路径成本更高、收回更少

当客户去找银行而不是商店时,销售会以拒付的形式退回,而拒付是最终的。在 App Store 上你没有消耗窗口来为一次性购买项目辩护,所以无从提交。在 Google Play 上,自 2026 年 8 月 3 日起,一笔拒付会把购买价款减去 Play 的服务费,再加上银行的拒付费用,转嫁到开发者身上,而 Google 继续承担它自己的服务费。在一笔 90 美元的终身解锁上,这会把一笔你本可以吸收的干净退款,变成一笔更大的、最终的损失,还钉上一笔银行费用。

把不满意的客户留在退款通道里

教训与每家商店都在推着你走的方向一致:退款撤销销售并通常退回佣金,拒付两者都不做还添一笔费用。一个能拿到直接退款的客户很少会打电话给银行。在 Google Play 上,你可以在 24 小时内通过 orders.reviewrefund 回应拒付审查,Google 还提供 Review Refund API 来共享交易详情,以便它代你挑战欺诈性争议。用它,但不要依赖它。更便宜的做法是在争议开始之前就让诚实的退款变得容易。

如何在一次性购买退款上少亏一些

你无法阻止商店为永久解锁退款。你能做到的是,当它退款时,你确实把功能收回,并且你能看清模式。

在服务器上核验权益,每次启动都核验

根据针对当前交易状态的服务器核查来决定访问权,而不是根据缓存收据或购买时写入一次的客户端标志。当 REFUND 通知到来,或权益消失,或 Google Play 上 revoke 被设置时,在你这一侧关闭功能。一笔已退款却仍然可用的一次性购买,就是最干净的退款变成纯亏损的那一种情形。

把终身和一次性产品当作各自独立的群组来观察

因为一次性购买退款稀少但金额大,它们会消失在一个混合的退款率里。按产品单独跟踪它们。某个终身档位上出现一簇退款,通常指向某件具体的事:一个超过其价值的价格、一个在更新后损坏的功能,或一个承诺超过解锁实际交付的商店页面。把一次性购买退款对照一次性购买销售来读,原因通常很容易说清。

快速确认,并干净利落地兑现合理退款

按时确认每一笔购买,这样你就永远不会意外触发 3 天自动退款;当退款确实合理时,痛快地把功能收回,而不是留下一个心怀不满的客户去向银行升级。退款是较小的损失。拒付才是那个带着费用的。

简短版本

一次性购买退款是你真正能撤销的那种少见退款,因为永久解锁交付起来不花你任何成本,而且能被直接收回。你损失价款,商店退回它的分成,也不像可消耗项目那样留下搁浅的算力账单。麻烦在于终身解锁通常是你最贵的产品,所以每一笔退款都是一次大的单笔冲击,Apple 独自决定它,没有消耗请求让你回应,而 Google Play 会在 48 小时内或第 3 天确认节点上,在没有你参与的情况下把它退款。要在你的服务器上核验权益,干净地 revoke,快速确认,并把不满意的客户留在退款通道而非拒付通道里。

常见问题解答

我可以自己为一次性应用内购买退款吗?
在 Google Play 上,可以。你可以对任何不满三年的订单,从 Play Console 或 orders.refund API 为一次性购买项目退款,把 revoke 参数设为 true 会立即终止访问权。在 App Store 上,不可以。Apple 通过 reportaproblem.apple.com 决定每一笔退款,而对于一次性购买项目没有 CONSUMPTION_REQUEST,所以你完全没有证据窗口。
Apple 会为一次性购买退款发送 CONSUMPTION_REQUEST 吗?
不会。Apple 只为可消耗项目,以及自 2024 年起为自动续期订阅发送 CONSUMPTION_REQUEST。一次性购买项目没有消耗请求,也没有 12 小时窗口,因为 Apple 把永久解锁视为要么拥有、要么没有。你通过 REFUND App Store Server Notification 和交易上的 revocationDate 得知退款,而不是通过一个需要回应的请求。
我如何知道客户的一次性购买被退款了?
在 App Store 上,会触发一条 REFUND 通知,签名交易带有 revocationDate 和 revocationReason,同时 StoreKit 把产品从 Transaction.currentEntitlements 中移除。在 Google Play 上,Voided Purchases API 会报告它,实时通知会标记取消。两种情况下,都要在你的服务器上核查权益,并在购买被撤销时关闭功能。
一次性购买退款能让我干净地拿回钱吗?
比任何其他退款类型都更干净。购买价款退回给客户,商店通常退回它的佣金,但因为一次性购买项目交付起来不花任何成本,所以不像可消耗项目那样会有算力或 API 账单搁浅在你这一侧。只要你确实撤销了功能,你的损失基本上就是售价。
如果我不在 Google Play 上确认一次性购买会怎样?
如果你在 3 天内不确认,Google Play 会自动退款并撤销该购买,认定客户已付款却从未收到商品。一旦你核验完购买,就立刻从你的服务器调用 purchases.products.acknowledge,这样你就永远不会触发一笔你并不打算发生的退款。

来源和延伸阅读

RefundHalt

App Store 和 Google Play 退款自动驾驶

继续阅读

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

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