POST
/v1/remittances/{id}/cancel
取消(只有 needs_reconfirm 可撤)
Scope
remittances:write
代会员调用 · 必带 x-on-behalf-of
需 x-idempotency-key
动钱 · 解冻会员的 locked 并退回可用余额(含此前每一轮补冻),同步释放你的预付冻结
这个端点会动钱
失败处置见下方响应表。超时(504)用同一把幂等键重试——我方可能已经处理完;业务失败要换新键,同键会原样返回那次失败。
能撤的窗口只有一个:needs_reconfirm。
也就是「成交价涨过了用户设的滑点上限,我方停下来问要不要多付」
的那一刻 —— 用户说不要,钱原路退回可用余额,限额预留一并释放。
其余状态一律撤不掉,理由分两类:
reviewing/dispatching/submitting/processing:
payout 可能已经交给上游,而上游没有撤销接口。
submitting 更特殊:发出去了但结果不明,任何人工改判都被拒。
- 终态(
completed/failed/canceled/refunded):
已经结束了。
要撤这两类只能走客服 + 我方后台改判,那是人工流程。
⚠ 别按 HTTP 状态码判断「能不能撤」。 当前实现里,状态不允许
取消时返回的是 500 api_error(内部用的 conflict 没登记进对外码
目录)—— 这是缺陷,修复后会变成 400 state_invalid。
判可撤性请用 GET /v1/remittances/{id}/pending-action:
它返回非 null 的 action 时,这单才在可撤窗口里。
前置条件
- 订单在这个会员名下且属于这个商户
- 订单状态是 needs_reconfirm
路径参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | 必填 | 订单号。rmt_ 前缀可带可不带。 |
请求头
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
x-on-behalf-of |
string | 必填 | 代哪个会员调用。 |
x-idempotency-key |
string | 必填 | UUID v4。 |
请求体
这个 operation 还没有在 spec 里声明请求体字段。
响应
200已取消,钱已退回可用余额
{
"id": "rmt_9c1f0a7e-3b2d-4f81-9a55-1d2e3f4a5b6c",
"status": "canceled"
}404
not_found 订单不在这个会员名下,或不属于你。
两种同一响应 —— 区分开等于送出一个订单号探测器。500⚠ 当前实现:订单不在
needs_reconfirm 时落到这里
(api_error)。这不是「重试就能好」的错误,
见正文那条提醒。
调用样例
curl -X POST 'https://api.zise.com/v1/remittances/{id}/cancel' \
-H 'authorization: Bearer $TOKEN' \
-H 'x-zise-merchant: $MERCHANT_ID' \
-H 'x-on-behalf-of: $MEMBER_ID' \
-H 'x-idempotency-key: $(uuidgen)' \
-H 'content-type: application/json' \
-d '{}'
const res = await fetch(
"https://api.zise.com/v1/remittances/{id}/cancel",
{
method: "POST",
headers: {
"authorization": "Bearer $TOKEN",
"x-zise-merchant": "MERCHANT_ID",
"x-on-behalf-of": "MEMBER_ID",
"x-idempotency-key": "crypto.randomUUID()",
"content-type": "application/json"
},
body: JSON.stringify({}),
},
);
// 金额一律按字符串读,不要 JSON.parse 成 number
const data = await res.json();
import requests
res = requests.post(
"https://api.zise.com/v1/remittances/{id}/cancel",
headers={
"authorization": "Bearer $TOKEN",
"x-zise-merchant": "$MERCHANT_ID",
"x-on-behalf-of": "$MEMBER_ID",
"x-idempotency-key": "$(uuidgen)",
"content-type": "application/json"
},
json={},
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()