这单在等用户做什么(重新确认 / 补件 / 无)
x-on-behalf-of
没有这个端点,你只能轮询订单详情去猜。 而「等重新确认」
有 4 小时时效,过期就自动退款 —— 商户完全不知道自己错过了什么,
用户只看到一笔莫名其妙退回来的钱。
action 为 null = 此刻不需要用户做任何事(正常处理中、
或已终态、或算不出来)。null 不是错误,别渲染成异常。
先看 waiting_on,再看 action
action 回答的是「要终端用户做什么」。但「材料交完了、等我方或
上游判」那一档在 action 上恒为 null(催他重传只会覆盖上一次的
文件,见下面那条 ⚠),于是它与「一切正常、处理中」在出参上长得
一模一样。waiting_on 就是把这两者分开的那一位:
member等终端用户做事。此时action必然非 null;review材料已交,等我方或上游判。action为null,
别催用户;要渲染「审核中」那一屏,读订单详情的 supplement 块
(它在这期间照常有值,source 会告诉你是我方还是上游在判);
none不等任何人为动作。
⚠ 它不是第二套语义:action 仍然是「要做什么」的唯一事实源。
别照着 waiting_on 去猜要补什么,也别把分支写在它上面 ——
分支写在 action.kind 上(新增一档时 kind 会变,这一位不会)。
action 非 null 时按 action.kind 分支,目前两档。
新增一档时老档的形状不会变,所以请写成 switch,
认不出的 kind 原样露出,别落进「重新确认」那一支。
── kind: "slippage" 等用户接受新价 ──
把 old_total → new_total 的差额(extra_charge)摆给用户,
倒计时用 deadline,用户同意就把 new_total 原样发给
POST /v1/remittances/{id}/reconfirm。
── kind: "supplement" 等用户补材料 ──
字段与 GET /v1/remittances/{id} 的 supplement 块逐字相同
(round / status / source / message / items[] /
submit_url / created_at / submitted_at),语义见那一页。
把 submit_url 丢给终端用户即可 —— 提交、校验、状态推进、
转发回上游都在我方那一侧完成,你不需要接收文件。
⚠ 这一档的 deadline 恒为 null,而且这是对的。 审核与补件
不会因为超时被自动取消(合规审查与上游 RFI 本来就会跨天甚至
跨周,24 小时到期就退款等于系统替审核员做了「拒绝」这个决定)。
别在你那一侧编一个倒计时。
⚠ 只有待用户交的那一轮会出现在这里。用户交完之后
(supplement.status: SUBMITTED)这个端点回 action: null +
waiting_on: "review" —— 此刻要做事的是我方或上游,不是他。
想渲染「审核中」那一屏,读订单详情的 supplement 块,
它在 SUBMITTED 期间照常有值。
别在 SUBMITTED 期间催用户重传:每传一次都会覆盖上一次,
而托管页会直接告诉他「这一轮已经处理过了」。
can_accept: false 时不要显示确认按钮,看 reject_reason:
insufficient_balance会员余额不够补冻 —— 让他先充值;too_many_rounds轮数用尽 —— 只剩取消或等过期。
⚠ extra_charge 与 extra_locked 是两个数:前者是他要多付的钱,
后者是要多冻的(含滑点预留,所以 ≥ 前者)。给用户看前者,
余额够不够按后者判。
⚠ 这里的价来自上一次分发时上游要多少,不是一次新报价 ——
我方不会为了渲染这一屏去问上游(报价只活 75 秒,用户看到时必然
已过期,而每问一次都是一次带幂等键的上游写调用)。它是决策依据,
不是承诺;真正的成交价在放行那一刻定,用户原来设的滑点上限仍然罩着它。
路径参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | 必填 | 订单号。rmt_ 前缀可带可不带。 |
请求头
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
x-on-behalf-of |
string | 必填 | 代哪个会员调用。 |
响应
action 非 null;无待办时
{"id": "...", "waiting_on": "none"|"review", "action": null}。
下面的示例是 kind: "slippage";补件那一档长这样:
``
{
"id": "rmt_9c1f0a7e-3b2d-4f81-9a55-1d2e3f4a5b6c",
"waiting_on": "member",
"action": {
"kind": "supplement",
"round": 1,
"status": "PENDING",
"source": "upstream",
"message": "Please provide proof of the source of funds.",
"items": [
{
"field_key": "proof_of_funds",
"label": "资金来源证明",
"type": "file",
"required": true,
"submitted": false
}
],
"submit_url": "https://api.zise.com/remit/supplement/6f1c2b9d4a8e47f0b3d5c1a2e9f80b7c",
"created_at": "2026-08-12T10:05:00Z",
"submitted_at": "",
"deadline": null
}
}
``{
"id": "rmt_9c1f0a7e-3b2d-4f81-9a55-1d2e3f4a5b6c",
"waiting_on": "member",
"action": {
"kind": "slippage",
"moved_bps": 137,
"slippage_bps": 100,
"old_total": "499.980000",
"new_total": "512.340000",
"extra_charge": "12.360000",
"extra_locked": "12.483600",
"available": "820.500000",
"can_accept": true,
"reject_reason": "",
"deadline": "2026-08-12T13:30:00Z"
}
}not_found 订单不在这个会员名下,或不属于你。curl -X GET 'https://api.zise.com/v1/remittances/{id}/pending-action' \
-H 'x-auth-token: Bearer $TOKEN' \
-H 'x-on-behalf-of: $MEMBER_ID'const res = await fetch("https://api.zise.com/v1/remittances/{id}/pending-action", {
method: "GET",
headers: {
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
},
});
// 金额按字符串读,别让它变成 number
const data = await res.json();import requests
res = requests.get(
"https://api.zise.com/v1/remittances/{id}/pending-action",
headers={
"x-auth-token": "Bearer $TOKEN",
"x-on-behalf-of": "$MEMBER_ID",
},
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()req, _ := http.NewRequest("GET", "https://api.zise.com/v1/remittances/{id}/pending-action",
nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("x-on-behalf-of", "$MEMBER_ID")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.zise.com/v1/remittances/{id}/pending-action"))
.header("x-auth-token", "Bearer $TOKEN")
.header("x-on-behalf-of", "$MEMBER_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
// 金额字段用 String / BigDecimal,不要 double$ch = curl_init('https://api.zise.com/v1/remittances/{id}/pending-action');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'x-auth-token: Bearer $TOKEN',
'x-on-behalf-of: $MEMBER_ID',
],
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
{
"id": "rmt_9c1f0a7e-3b2d-4f81-9a55-1d2e3f4a5b6c",
"waiting_on": "member",
"action": {
"kind": "slippage",
"moved_bps": 137,
"slippage_bps": 100,
"old_total": "499.980000",
"new_total": "512.340000",
"extra_charge": "12.360000",
"extra_locked": "12.483600",
"available": "820.500000",
"can_accept": true,
"reject_reason": "",
"deadline": "2026-08-12T13:30:00Z"
}
}