# C 端用户自主取消订单（小程序端）

> 端类型：**小程序端**（v3）｜变更类型：**新增接口**｜服务：hl-mp-service（Feign → hl-order-service-v3）
> Epic #3540 ｜ PR #3549 ｜日期：2026-06-06

## 接口地址

`POST /mp/order/{orderId}/cancel`

## 接口介绍

小程序 C 端用户自主取消**自己**的订单。仅出行前可取消，按退款政策（距出发天数阶梯）退款，取消后订单进入 `CANCELLED` 终态、不可恢复。

## 本次修改点

新增接口。此前小程序无自主取消能力（取消只能走后台定制师）。本接口固定 `POLICY` 退款模式（C 端不暴露退款模式选择），并校验订单归属当前登录用户。

## 入参

- 路径参数：`orderId`（Long，订单 ID，必填）
- 请求头：`Authorization`（登录 token，必填）
- 请求体（可选，可不传）：

| 字段 | 类型 | 必填 | 含义 |
|---|---|---|---|
| reason | String | 否 | 取消原因 |

**入参示例**
```
POST /mp/order/2063151085698134017/cancel
Authorization: Bearer <token>
Content-Type: application/json

{ "reason": "行程有变，需要取消" }
```
（body 也可整体不传。）

## 出参

`Result<Void>`

**出参示例**
```json
{ "code": 200, "message": "成功", "success": true, "data": null }
```

## 可取消状态（调用约束）

| 订单状态 | 是否可取消 |
|---|---|
| PENDING_PAY 待支付 | ✅ |
| CUSTOMIZING 定制中 | ✅ |
| PENDING_DEPARTURE 待出行 | ✅ |
| TRAVELLING 出行中 | ❌（行程中只能联系客服终止行程） |
| COMPLETED 已完成 | ❌ |
| CANCELLED 已取消 | ❌ |

- 退款模式固定 `POLICY`，按退款政策阶梯计算退款金额（已付订金时退款，未支付时无退款）。
- 仅可取消归属当前登录用户的订单（非本人订单返回 581037）。

## 错误码

| code | message | 触发 |
|---|---|---|
| 581017 | 当前订单状态不允许取消 | 出行中 / 已完成 / 已取消订单调用 |
| 581037 | 无权取消该订单 | 取消非本人（userId 不匹配）订单 |
| 401 | 缺少有效的 Authorization 头 | 未携带 token |

## 关联

- Epic：https://git.1814.love:8443/wx/HL/issues/3540
- PR：https://git.1814.love:8443/wx/HL/pulls/3549
- 后端负责人：腰苏图（订单 v3）
