取消(只有 needs_reconfirm 可撤)
代会员调用 · 必带
x-on-behalf-of
需 x-idempotency-key
动钱 · 解冻会员的 locked 并退回可用余额(含此前每一轮补冻),同步释放你的预付冻结
这个端点会动钱
失败处置见下方响应表。超时(504)用同一把幂等键重试——我方可能已经处理完;业务失败要换新键,同键会原样返回那次失败。
能撤的窗口只有一个:needs_reconfirm。
也就是「成交价涨过了用户设的滑点上限,我方停下来问要不要多付」
的那一刻 —— 用户说不要,钱原路退回可用余额,限额预留一并释放。
其余状态一律撤不掉,理由分两类:
reviewing/dispatching/submitting/processing:
payout 可能已经交给上游,而上游没有撤销接口。
submitting 更特殊:发出去了但结果不明,任何人工改判都被拒。
- 终态(
completed/failed/canceled/refunded):
已经结束了。
要撤这两类只能走客服 + 我方后台改判,那是人工流程。
状态不允许取消时返回 400 state_invalid。
⚠ 别只按它判断「能不能撤」 —— 认领失败有四种理由(并发改状态 /
已有结算凭证 / 一张加锁凭证都没有 / 状态不在可撤集合里),
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 'x-auth-token: Bearer $TOKEN' \
-H 'x-on-behalf-of: $MEMBER_ID' \
-H 'x-idempotency-key: $IDEMPOTENCY_KEY' \
-H 'content-type: application/json' \
-d '{}'const res = await fetch("https://api.zise.com/v1/remittances/{id}/cancel", {
method: "POST",
headers: {
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
"x-idempotency-key": "$IDEMPOTENCY_KEY",
"content-type": "application/json",
},
body: JSON.stringify({}),
});
// 金额按字符串读,别让它变成 number
const data = await res.json();import requests
res = requests.post(
"https://api.zise.com/v1/remittances/{id}/cancel",
headers={
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
"x-idempotency-key": "$IDEMPOTENCY_KEY",
"content-type": "application/json",
},
json={},
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()req, _ := http.NewRequest("POST", "https://api.zise.com/v1/remittances/{id}/cancel",
strings.NewReader(`{}`))
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("x-on-behalf-of", "$MEMBER_ID")
req.Header.Set("x-idempotency-key", "$IDEMPOTENCY_KEY")
req.Header.Set("content-type", "application/json")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.zise.com/v1/remittances/{id}/cancel"))
.header("x-auth-token", "Bearer $TOKEN")
.header("x-on-behalf-of", "$MEMBER_ID")
.header("x-idempotency-key", "$IDEMPOTENCY_KEY")
.header("content-type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{}
"""))
.build();
// 金额字段用 String / BigDecimal,不要 double$ch = curl_init('https://api.zise.com/v1/remittances/{id}/cancel');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-auth-token: Bearer $TOKEN',
'x-on-behalf-of: $MEMBER_ID',
'x-idempotency-key: $IDEMPOTENCY_KEY',
'content-type: application/json',
],
CURLOPT_POSTFIELDS => <<<'JSON'
{}
JSON,
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
200
{
"id": "rmt_9c1f0a7e-3b2d-4f81-9a55-1d2e3f4a5b6c",
"status": "canceled"
}