Google Play 订阅附加项退款可以逐项进行,但用户只能取消整个组合
Google Play 允许一个基础订阅在同一个购买令牌上附带最多 49 个附加项。本文说明订阅附加项退款如何运作,哪个 API 调用可以只退一项而不影响其他项,Google 在哪些情况下会阻止它,以及每种退款方式会让你付出什么成本。

要点
- Google Play 的带附加项订阅功能把一个基础订阅和最多 49 个附加项(合计 50 项)放在同一次购买中,并且每一项都必须使用相同的周期性结算周期。
- Google Play 用户无法在 Play 订阅中心取消单个附加项。他们只能把基础订阅和附加项一起取消,因此移除单个附加项必须在开发者的应用内完成。
- purchases.subscriptionsv2.revoke 方法接受带有一个 productId 的 itemBasedRefund。如果其他项仍然有效,Google 只撤销该项并全额退款,订阅继续运行。
- 当订阅处于付款被拒状态、该项已过期或未被拥有,或者属于预付费订阅时,Google 会阻止按项退款。
- 对带附加项的订阅执行 proratedRefund,会退还每一项的最新订单,金额按距下次续订的剩余时间按比例计算,并一次性撤销所有项的访问权限。
- 带附加项订阅的实时开发者通知不包含 subscriptionId,因此后端必须调用 purchases.subscriptionsv2.get 并读取每个 lineItem,才能知道哪些项仍然有权使用。
- Google Play 唯一要求开发者提供证据的退款流程,是通过 orders.reviewrefund 标记为待审核的拒付,时限为 24 小时。对于 2026 年 8 月 3 日之后下的订单,拒付败诉时开发者需承担购买价格减去 Play 服务费后的金额,外加银行收取的费用。
在 Google Play 上销售一个带三个附加项的基础订阅,你可以退还其中任意一个附加项,而不取消其余部分。你的用户却做不到这一点。Google 只允许用户取消整个组合,所以 Google Play 订阅附加项退款的精确工具掌握在你这个开发者手里,而且只能通过 API 使用。用对了,你只退出问题的那一项。用错了调用,你会把所有内容都退款或撤销。
带附加项的订阅是如何构成的
Google 在 I/O 2025 上宣布了订阅的多商品结账功能。一个购买流程可以同时销售一个基础订阅和若干可选附加项,按同一个周期合并计费。Google 的开发者指南设定了明确的限制:
- 只有自动续订的基础方案可以附带附加项。预付费方案不行。
- 每一项都必须使用相同的周期性结算周期。不允许在年付基础订阅上附加月付附加项。
- 一次购买最多包含 50 项,也就是一个基础订阅加上最多 49 个附加项。
- 该功能在韩国不可用。
所有内容都位于同一个购买令牌上。调用 purchases.subscriptionsv2.get 时,响应中包含一个 lineItems 列表,每一项对应一个条目。每个 line item 都有自己的 productId、expiryTime 和 latestSuccessfulOrderId。最后这个字段让按项退款成为可能:每一项都有自己的最新订单。
按比例计费从第一天开始
当用户在周期中途添加附加项时,Google 会立即收取按比例计算的金额,使附加项与基础订阅在同一天续订。Google 自己的例子是:一个 $10 的月付附加项在 7 天试用后于 8 月 15 日添加,收取 $2.90 以覆盖 8 月剩余的时间。因此,单个附加项在第一笔完整订单之前,可能会有一笔金额较小、数额不规整的首单。查询某次退款会命中哪个订单时,请记住这一点。
你的用户只能取消整个组合
Google 面向用户的帮助页面说得很直接。用户只能将基础订阅和附加项一起取消,目前无法在 Google Play 中取消单个附加项。暂停功能也不可用。如果用户拒绝涨价,Google 会取消基础订阅以及所有附加项。
这样一来,想退出某一个附加项的用户在 Play Store 里只有两个选择:取消全部,或者申请退款。对你来说两者都不好。Google 的指南指出,你的应用可以改为提供移除功能。被移除的附加项会在当前结算周期结束时到期,组合中的其余部分继续续订。
Google Play 订阅附加项退款工具对比
对于带附加项的订阅,Google 提供了五种退款方式。它们的区别在于退还什么,以及访问权限是否终止。
| 工具 | 退还的内容 | 访问权限的变化 |
|---|---|---|
| 在 Play Console 中对特定订单退款 | 该订单上由你选择的金额 | 不撤销任何内容 |
| orders.refund,未设置 revoke | 一个订单的全额 | 不撤销任何内容 |
| subscriptionsv2.revoke 搭配 itemBasedRefund | 某一项最新一笔扣款的全额 | 只有该项终止,除非它是最后一个有效项 |
| subscriptionsv2.revoke 搭配 proratedRefund | 每一项的最新订单,按剩余时间按比例计算 | 所有项立即终止 |
| subscriptionsv2.revoke 搭配 fullRefund | 每一项最新一笔扣款的全额 | 所有项立即终止 |
Google 在附加项指南中给出了一条硬性警告:不要对带附加项的订阅调用已弃用的 purchases.subscriptions.refund。此外,orders.refund 无法处理超过三年的订单。
itemBasedRefund 的行为
itemBasedRefund 对象只有一个必填字段 productId,用于指定要撤销的项。Google 描述了两种结果:
- 其他项仍然有效:只撤销指定项并全额退款,订阅继续。
- 没有其他有效项:该项被撤销并全额退款,整个订阅被取消。
每个请求只能指定一项。要退还两个附加项,就调用两次。
Google 何时阻止按项退款
Google 会在三种情况下拒绝 itemBasedRefund。订阅处于任何付款被拒状态,包括宽限期和账号保留。你指定的项未被拥有或已经过期。或者该购买是预付费订阅,这类订阅完全不支持按项停用。
按订单 ID 退款会发生什么
Google 的指南指出,orders.refund 上的 revoke 标志只有在该订单是订阅的最新订单时才会终止访问权限。对较早的订单退款会成功,但不会撤销任何内容。Play Console 的行为相同:退还最近一笔订单,订阅会被移除;退还较早的订单,订阅保持有效。有附加项时,请从正确 line item 的 latestSuccessfulOrderId 中选取订单,否则你可能会退错扣款。
谁决定退款,何时会要求你提供证据
带附加项订阅的大多数退款都无需你参与决定,和其他 Play 订阅一样。在购买后 48 小时内,用户可以通过「报告问题」向 Google 申请,由 Google 决定。超过这个时间,Google 会让用户来找你。另外,如果你没有在三天内确认新的订阅购买,Google 会自动为用户退款并撤销该购买。
只有一个流程会询问你的说法。当持卡人发起拒付且 Google 将其标记为需要开发者审核时,你会收到 PendingRefundReviewNotification,并有 24 小时调用 orders.reviewrefund,提交退款偏好和使用证据。拒付本身由银行裁定,银行的裁定是最终结果。
在服务器上跟踪附加项退款
Google 的 RTDN 参考文档列出了 SUBSCRIPTION_ITEMS_CHANGED,用于订阅组合中某一项发生变化的情况,以及 SUBSCRIPTION_REVOKED,用于订阅在到期前被撤销的情况。Google 的指南说明,通过 subscriptionsv2.revoke 进行的撤销会同时触发 SUBSCRIPTION_REVOKED 通知和 VoidedPurchaseNotification,并记录在 Voided Purchases API 中。
问题在于 subscriptionId。Google 表示,带附加项订阅的 RTDN 中不提供该字段。所以不要指望通知告诉你是哪一项发生了变化。对于组合的每一条通知:
- 使用 purchaseToken 调用 purchases.subscriptionsv2.get。
- 读取每个 lineItem 及其 expiryTime。Google 要求刷新所有项的 expiryTime,而不只是你预期的那一项。
- 按 productId 授予或移除访问权限,而不是按购买令牌。
- 轮询 Voided Purchases API 作为兜底。它覆盖过去 30 天。
宽限期和账号保留作用于整个组合
付款问题会同时影响所有项。Google 会在有效项中选取最短的宽限期,并将其应用于整个续订。宽限期内,用户保留所有项。进入账号保留后,所有项的访问权限都会暂停。如果付款始终没有恢复,付款被拒的项会到期,其他项在各自结算周期的剩余时间内恢复。

每种退款方式让你付出多少钱
附加项通常对应着你需要付费的东西。额外的云存储由你的存储服务商计费。AI 额度包按模型 API 调用计费。额外的席位意味着更多算力,创作者档位可能会触发分成支付。这些成本在用户使用附加项时就已产生,退款只退还价格,却收不回其中任何一项成本。
退得太多
代价高昂的错误是,用户只投诉一个附加项,你却用了 fullRefund 或 proratedRefund。两者都会撤销所有项,所以你连基础订阅的费用也退了,还失去了一个本想继续订阅的用户。itemBasedRefund 只退还该附加项的最新一笔扣款。当它被阻止时,对该项最新订单执行 orders.refund,可以退钱而不终止任何内容。
部分退款与费用
Play Console 允许你对订阅订单进行部分退款,Google 表示退款比例同样适用于你的收入分成和服务费。退还一半订单金额,Google 的服务费也会退回一半。但你为提供该附加项所付出的成本不会退回。
组合订单的拒付
对于 2026 年 8 月 3 日之后下的订单,Google 将拒付成本转由开发者承担。拒付成功时,你需支付购买价格减去 Play 服务费后的金额,外加银行收取的费用。包含多个附加项的组合订单,一旦败诉损失也更大。按附加项记录、并关联到混淆账号 ID 的使用日志,就是你在 24 小时审核中需要提交的材料。
附加项退款检查清单
- 在应用内提供移除单个附加项的方式,因为 Google Play 不提供。
- 每收到一条通知,都保存每个 lineItem 的 productId、expiryTime 和 latestSuccessfulOrderId。
- 只有一个附加项出问题时,默认使用 itemBasedRefund。
- 订阅处于宽限期或账号保留时,改用 orders.refund 退还该项的订单。
- 永远不要对组合调用已弃用的 purchases.subscriptions.refund。
- 按账号记录附加项使用情况,以便在 24 小时内提交拒付审核材料。
- 按附加项统计退款率,而不只是按订阅统计,避免表现差的附加项被基础方案的数据掩盖。
常见问题解答
- 用户能否只取消 Google Play 订阅中的一个附加项?
- 在 Google Play 中不能。Google 的帮助页面说明,用户只能将基础订阅和附加项一起取消。你的应用可以提供移除单个附加项的功能,被移除的附加项会在当前结算周期结束时到期。
- 如何退还一个附加项而不取消订阅?
- 调用 purchases.subscriptionsv2.revoke,并传入指定该附加项 productId 的 itemBasedRefund。如果其他项仍然有效,Google 只撤销该项并全额退款。你也可以使用不带 revoke 标志的 orders.refund 退还该项的最新订单,这样会退钱但不影响访问权限。
- 为什么我的 itemBasedRefund 调用失败了?
- 当订阅处于付款被拒状态、该项未被拥有或已过期,或者属于预付费订阅时,Google 会阻止该调用。调用前请检查 line item 的 expiryTime 和订阅状态。
- 按比例退款适用于带附加项的订阅吗?
- 适用,但它会撤销所有内容。Google 会退还每一项的最新订单,金额按距下次续订的剩余时间按比例计算,所有项的访问权限立即终止。
- 哪个 RTDN 会告诉我某个附加项已被退款?
- Google 的指南说明,撤销会触发 SUBSCRIPTION_REVOKED 和 VoidedPurchaseNotification,而 SUBSCRIPTION_ITEMS_CHANGED 用于组合中某一项的变化。由于组合订阅缺少 subscriptionId,请调用 purchases.subscriptionsv2.get 并读取每个 lineItem,以确认发生了什么变化。
来源和延伸阅读
- Google Play Billing: Subscription with add-ons
- Google Play Help: Subscriptions with add-ons
- Google Play Developer API: purchases.subscriptionsv2.revoke
- Google Play Developer API: orders.refund
- Google Play Billing: Manage subscriptions and one-time purchases
- Play Console Help: Issue refunds and cancel orders
- Google Play Billing: Real-time developer notifications reference
- Google Play Billing: Subscription lifecycle
- Google Play Help: Request a refund on Google Play
- Google Play Developer API: orders.reviewrefund
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
App Store 和 Google Play 退款自动驾驶
继续阅读
过多的退款申请,代价可能远超退款本身,因为两大应用商店都把它当作质量信号
Apple 审核指南 5.6.4 把过多的退款申请列为应用未达质量标准的迹象,Google 的开发者分发协议也允许它依据退款率下架新开发者的应用。本文梳理两家商店的原文、下架的真实成本,以及如何避开风险。
在处理退款之前先验证 App Store 服务器通知,因为任何人都能向你的 webhook URL 发送请求
在检查签名之前,一条退款通知只不过是一个 HTTPS 请求。本文介绍如何验证 App Store 服务器通知和 Google Play RTDN 消息、每个商店签名的内容,以及伪造的退款或被错误拒绝的退款会让你付出什么代价。