会员流水(游标分页)
x-on-behalf-of
会员视角的一条条流水,跨全部业务线(入金、提现、汇款、兑换、
转账、发卡、理财、扫码付)。不是账本分录 —— 一笔业务在这里
最多一行,账本那边可能是四条腿。
翻页只有一种形态:把上一页的 next_cursor 原样回传。
游标是不透明串,不要解析它、不要自己拼 —— 一旦你开始拼,
我方就再也改不了排序键了。解不开的游标按「从头开始」处理而不是报错。
⚠ amount_scale 必须一起用。金额是「该资产 scale 的定点整数」
的十进制串,而 scale 逐资产不同(USDT 6 位、BTC 8 位)。
按固定 6 位去解,第一个非 6 位资产上就错 100 倍且零报错。
⚠ type 与 status 是开放枚举,库里没有 CHECK 约束。
新业务线上线会加新值,而不会发版通知你。认不出的值请原样展示,
绝不要 default 成「处理中」或「成功」—— 那会把「人工审核中」
显示成已完成。要做分组就维护一张你认得的白名单,剩下的走兜底分支。
direction 只有两个值:in 钱进来、out 钱出去。
日终对账请用 from / to 做增量,不要全量重翻
from / to 与游标锚在同一列(created_at),所以
from = 上一轮见过的最大 created_at 是一句自洽的话,可以直接拿来
做增量同步。to 是开区间(< to)—— 闭区间会让每一轮重复取到
边界那一条,而重复的那条在对账里会被加两遍。
⚠ 时间必须是 ISO-8601(2026-08-01T00:00:00Z)。解不出来的串
直接 400 invalid_fields,不会被静默忽略 —— 静默忽略的表现是
「筛选没生效」,而你拿到的是一份看着正常、范围却不对的数据。
⚠ 别拿 occurred_at 当增量水位。 出参里两个时间都给:
occurred_at 是「这件事什么时候发生的」(充值取的是检测到的时刻),
created_at 是「我方什么时候记下的」。补记的历史流水上两者会差很远,
按 occurred_at 做水位会把它们永久跳过。
查询参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
limit |
integer | 可选 | 每页条数。缺省 20,上限 100;非数字或 ≤ 0 一律按 20 处理 (不报错,所以别指望用它来发现自己传错了)。 |
cursor |
string | 可选 | 上一页返回的 next_cursor 原样回传。首页不传。 |
id |
string | 可选 | 只取某一条。带不带 txn_ 前缀都认。非数字直接 400
invalid_fields。 |
type |
string | 可选 | 按业务类型过滤,精确匹配、大小写敏感。 ⚠ 这是开放枚举,我方刻意不校验取值:新业务线上线会加新值而 不会发版通知你,在这里做白名单等于「我方上了新业务、你的筛选器 当天开始漏单」。所以传一个我方不认识的值得到的是空列表, 不是报错 —— 拼错了不会有人告诉你。 |
status |
string | 可选 | 按状态过滤,同样是开放枚举、不校验、拼错得空列表。 |
direction |
string | 可选 | in 或 out。⚠ 与上面两个相反,这个是封闭枚举(库级约束
就两个值),所以传别的直接 400 invalid_fields。 |
asset |
string | 可选 | 按资产过滤,自动转大写。不校验存在性 —— 这是筛选器不是下单
入参,查一个该会员没有的币得到空列表而不是 asset_not_allowed。 |
from |
string | 可选 | 起始时间(含),ISO-8601。比的是 created_at。 |
to |
string | 可选 | 结束时间(不含),ISO-8601。比的是 created_at。 |
请求头
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
x-on-behalf-of |
string | 必填 | 查谁的流水 |
响应
{
"data": [
{
"id": "txn_80231",
"type": "withdrawal",
"status": "locked",
"status_version": 1,
"direction": "out",
"asset": "USDT",
"amount": "200000000",
"amount_scale": 6,
"occurred_at": "2026-08-12T09:31:02.881Z",
"created_at": "2026-08-12T09:31:02.881Z"
},
{
"id": "txn_80198",
"type": "deposit",
"status": "completed",
"status_version": 2,
"direction": "in",
"asset": "USDT",
"amount": "1500000000",
"amount_scale": 6,
"occurred_at": "2026-08-12T08:04:55.010Z",
"created_at": "2026-08-12T08:04:57.204Z"
}
],
"next_cursor": "MjAyNi0wOC0xMlQwODowNDo1N1p8ODAxOTg",
"has_more": true
}member_context_required 没带 x-on-behalf-of ·
invalid_fields id 不是数字 / direction 不是 in|out /
from 或 to 不是合法 ISO-8601(看 fields 数组)member_not_found 会员不存在 / 属于别的商户 / 已停用curl -X GET 'https://api.zise.com/v1/transactions' \
-H 'x-auth-token: Bearer $TOKEN' \
-H 'x-on-behalf-of: $MEMBER_ID'const res = await fetch("https://api.zise.com/v1/transactions", {
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/transactions",
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/transactions",
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/transactions"))
.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/transactions');
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
{
"data": [
{
"id": "txn_80231",
"type": "withdrawal",
"status": "locked",
"status_version": 1,
"direction": "out",
"asset": "USDT",
"amount": "200000000",
"amount_scale": 6,
"occurred_at": "2026-08-12T09:31:02.881Z",
"created_at": "2026-08-12T09:31:02.881Z"
},
{
"id": "txn_80198",
"type": "deposit",
"status": "completed",
"status_version": 2,
"direction": "in",
"asset": "USDT",
"amount": "1500000000",
"amount_scale": 6,
"occurred_at": "2026-08-12T08:04:55.010Z",
"created_at": "2026-08-12T08:04:57.204Z"
}
],
"next_cursor": "MjAyNi0wOC0xMlQwODowNDo1N1p8ODAxOTg",
"has_more": true
}