> ## Documentation Index
> Fetch the complete documentation index at: https://waffo.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 预约取消与恢复订阅

> 说明如何预约在指定日期取消订阅、如何改期或撤销：预约期间的订阅状态与回调、对升降级和加座的限制、最后一期是否扣款、托管页面上的操作、用户邮件以及相关错误码。

本页讲怎么让订阅「到某个日期再取消」、怎么撤销，以及这期间订阅和回调是什么样的。立即取消、取消后的状态值见[订阅 FAQ](https://waffo.com/docs/zh/support/subscription-faq.md) 和[托管的订阅管理页面](https://waffo.com/docs/zh/support/subscription-hosted-management-faq.md)；字段级契约见官网 API 参考（`/api/v1/subscription/cancel`、`/api/v1/subscription/resume`）。

## 我能让订阅在周期结束时再取消吗？

可以，但需要账户开通。调用 `/api/v1/subscription/cancel` 时传 `scheduledCancelAt`（ISO 8601 时间），订阅就不会立即取消，而是在该时间点生效；不传或留空就是立即取消，行为和以前一致。

| 字段 | 说明 |
| - | - |
| `subscriptionId`、`merchantId`、`requestedAt` | 必填，和立即取消一样。 |
| `scheduledCancelAt` | 选填。取消生效时间。必须晚于当前时间，且不晚于订阅结束时间；订阅没有设置结束时间时，最晚可预约到当前时间起两年内。不符合时返回 `A0056`。 |

预约成功后，响应里的 `orderStatus` 是 `ACTIVE`（含义是「已预约取消、尚未生效」），并带回 `scheduledCancelAt`。之后查询订阅（`/api/v1/subscription/inquiry`）也会返回这个字段——只有存在尚未生效的预约时才有。

如果你的账户没有开通预约取消，带 `scheduledCancelAt` 的请求会被拒绝，而不会悄悄变成立即取消。渠道托管续订（如 PIX）的订阅目前也只能立即取消。被拒绝时常见的错误码是 `A0062`（该订阅不支持预约取消）。能否使用请联系你的 Waffo 对接人确认。

## 预约了取消，订阅状态会变吗？用户还能继续用吗？

不会变。预约期间订阅状态始终是 `ACTIVE`，照常按计划扣款，权益照常；直到取消生效那一刻，订阅才转为终态：

| 谁预约的 | 生效后的订阅状态 |
| - | - |
| 用户在托管的订阅管理页面上预约 | `USER_CANCELLED` |
| 商户通过 API 或 Portal 预约 | `MERCHANT_CANCELLED` |

生效时你会照常收到订阅状态通知（`SUBSCRIPTION_STATUS_NOTIFICATION`）。因此如果你按「状态变为已取消才撤权益」处理，预约取消不需要额外改造；如果你想提前知道取消日期，见下一问。

## 预约取消会推送什么回调？

预约被受理、改期、撤销时，Waffo 会向你的 `notifyURL` 推送独立的通知，`eventType` 为 `SUBSCRIPTION_CANCELLATION_SCHEDULE_NOTIFICATION`，`result` 是订阅对象。

要点：

* 这三种情况订阅状态都是 `ACTIVE`，所以**不会**通过 `SUBSCRIPTION_STATUS_NOTIFICATION` 送达，要用这个独立的通知类型才能知道预约、改期和撤销。
* 取消真正生效时，仍由订阅状态通知告诉你终态。

建议的处理方式：收到预约通知时记录取消时间，到生效前不要撤权益；收到撤销通知时清除记录；以订阅状态通知（或主动查询订阅）作为是否真的已取消的依据。

## 预约之后我怎么改期，怎么撤销？

| 想做什么 | 怎么做 | 说明 |
| - | - | - |
| 改期 | 对同一订阅再次调用 `/api/v1/subscription/cancel`，传新的 `scheduledCancelAt` | 取消已经到点后不能再改期，返回 `A0060`。 |
| 撤销预约 | 调用 `/api/v1/subscription/resume`，传 `subscriptionId`、`merchantId` | 响应的 `subscriptionStatus` 始终是 `ACTIVE`。下次扣款日不变、不顺延。 |
| 立即取消 | 先 `resume`，再调用 `/api/v1/subscription/cancel`（不传 `scheduledCancelAt`） | 预约期间直接立即取消会被拒绝，返回 `A0059`。 |

`/api/v1/subscription/resume` 只在订阅处于 `ACTIVE` 且预约尚未生效时有意义。订阅上没有预约时调用它也会返回 `ACTIVE`，不会报错，所以可以放心重试。

## 预约取消期间还能升降级、改金额、加座吗？

不能。订阅有待生效的取消时，`change`（升降级）、`update`（改金额、加座补差）都会被拒绝，错误码 `A0058`，提示先恢复订阅再修改。需要改的话，先 `resume`，改完再重新预约。

## 取消生效前，最后一期还会扣款吗？

要看那一期的扣款时间离取消生效时间有多近。按当前行为：如果某一期的续订时间点落在取消生效时间之前 24 小时以内（包含恰好 24 小时），这一期不再扣款，订阅直接在取消时间到期。续订时间点更早的各期照常扣款。

这样做是为了避免「刚扣完款马上取消」。

## 用户在托管页面上怎么预约、改期、恢复？

当你的账户可以使用预约取消时，托管的订阅管理页面上的取消弹窗提供三种选择：

| 选项 | 效果 |
| - | - |
| 立即取消 | 确认后马上取消，且不能恢复。 |
| 当前周期结束时取消 | 取消日为下次扣款日；在此之前订阅保持有效。 |
| 自定义日期 | 用户选一个未来日期，最早是明天。日期按收银台所用时区的 0 点计算。选定日期后页面会显示取消前剩余的扣款次数。 |

预约成功后，页面顶部显示「取消已预约至某日」，并出现两个按钮：**恢复订阅**和**改期**。

如果账户没有开通预约取消，弹窗里没有后两个选项，取消仍然是立即生效。

几条限制：

* 由商户预约的取消，用户在托管页面上不能改期或恢复（页面会提示该取消由商户预约，不能在此更改）；商户可以通过 API 操作。
* 已到点的预约不能再改期，也不能恢复。
* 已付款项不会因为取消而退回；这与立即取消一致。

## 预约取消时 Waffo 会给用户发邮件吗？

会。预约受理或改期、撤销（恢复）、取消生效前的提醒，Waffo 都有对应的用户邮件，商户通过 API 或 Portal 代为预约时同样会发。具体有哪些邮件、每封邮件的开关见 [Waffo 会给我的订阅客户发哪些邮件？](https://waffo.com/docs/zh/support/subscription-notifications-faq.md)。

## 预约取消相关错误码

| 错误码 | 含义 | 怎么处理 |
| - | - | - |
| `A0056` | `scheduledCancelAt` 必须晚于当前时间，且不晚于订阅结束时间（没有结束时间时不晚于当前时间起两年） | 改成合法的未来时间 |
| `A0058` | 订阅已有预约取消，需先恢复才能改计划或金额 | 先 `resume` |
| `A0059` | 订阅已有预约取消，需先恢复才能立即取消 | 先 `resume` |
| `A0060` | 预约已到生效时间，不能再改期 | 无需处理，等待生效 |
| `A0062` | 该订阅不支持预约取消 | 只能立即取消 |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.