Z Zise Developers English

批量查询多个会员的个人线开户进度

POST /v1/remit/vp/applications/query scope: remittances:read
商户自身

一次查询同一商户名下多个会员的 VP 开户状态。

请求体

字段类型必填说明
members string[] 必填 商户会员标识数组;支持 external_member_id 和 mem_<uuid> 混合传入。

响应

200批量结果。每一项与入参逐条对应。
{
  "items": [
    {
      "query": "vp-a",
      "member_id": "mem_7a3b7e6d-1111-2222-3333-444444444444",
      "external_member_id": "vp-a",
      "application": {
        "id": "vpa_12",
        "status": "reviewing",
        "reviewed_at": "",
        "created_at": "2026-08-13T20:00:00.000Z"
      },
      "stage": "reviewing"
    },
    {
      "query": "missing-member",
      "error": "member_not_found",
      "application": null
    }
  ]
}
400invalid_request —— members 缺失、为空、超过 100,或含空字符串
403insufficient_scope 缺 remittances:read

深入说明

为什么是新端点,不是改老的 GET

现有 GET /v1/remit/vp/applications 的契约是“x-on-behalf-of 绑定一个会员”。这条批量端点改用 body 传一组会员标识,避免把单会员中间件与审计语义扭成多值。

支持两种会员标识

members[] 里每一项都可以是:

  • 商户自己的 external_member_id
  • 我方返回过的 mem_<uuid>

返回顺序与入参一致

为了让调用方可以直接把响应按索引回填到自己的批任务里,返回结果保持与members[] 相同的顺序。

单条不存在不拖垮整批

某个会员不存在,或不属于当前商户时,只在该项返回error: "member_not_found";整批仍返回 200。

请求
curl -X POST 'https://api.zinfra.vip/v1/remit/vp/applications/query' \
  -H 'x-auth-token: Bearer $TOKEN' \
  -H 'content-type: application/json' \
  -d '{
    "members": [
      "vp-a",
      "mem_7a3b7e6d-1111-2222-3333-444444444444",
      "missing-member"
    ]
  }'
const res = await fetch("https://api.zinfra.vip/v1/remit/vp/applications/query", {
  method: "POST",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
    "content-type": "application/json",
  },
  body: JSON.stringify({
    "members": [
      "vp-a",
      "mem_7a3b7e6d-1111-2222-3333-444444444444",
      "missing-member"
    ]
  }),
});
// 金额按字符串读,别让它变成 number
const data = await res.json();
import requests

res = requests.post(
    "https://api.zinfra.vip/v1/remit/vp/applications/query",
    headers={
        "x-auth-token": "Bearer $TOKEN",
        "content-type": "application/json",
    },
    json={
      "members": [
        "vp-a",
        "mem_7a3b7e6d-1111-2222-3333-444444444444",
        "missing-member"
      ]
    },
)
# 金额用 Decimal(str(...)),不要 float
data = res.json()
req, _ := http.NewRequest("POST", "https://api.zinfra.vip/v1/remit/vp/applications/query",
    strings.NewReader(`{
  "members": [
    "vp-a",
    "mem_7a3b7e6d-1111-2222-3333-444444444444",
    "missing-member"
  ]
}`))
req.Header.Set("x-auth-token", "Bearer $TOKEN")
req.Header.Set("content-type", "application/json")
res, err := http.DefaultClient.Do(req)
// 金额字段用 string 接,不要 float64
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zinfra.vip/v1/remit/vp/applications/query"))
    .header("x-auth-token", "Bearer $TOKEN")
    .header("content-type", "application/json")
    .method("POST", HttpRequest.BodyPublishers.ofString("""
{
  "members": [
    "vp-a",
    "mem_7a3b7e6d-1111-2222-3333-444444444444",
    "missing-member"
  ]
}
"""))
    .build();
// 金额字段用 String / BigDecimal,不要 double
$ch = curl_init('https://api.zinfra.vip/v1/remit/vp/applications/query');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
    'content-type: application/json',
  ],
  CURLOPT_POSTFIELDS => <<<'JSON'
{
  "members": [
    "vp-a",
    "mem_7a3b7e6d-1111-2222-3333-444444444444",
    "missing-member"
  ]
}
JSON,
]);
$res = curl_exec($ch);
// 金额用 bcmath / 字符串,不要 floatval
200
{
  "items": [
    {
      "query": "vp-a",
      "member_id": "mem_7a3b7e6d-1111-2222-3333-444444444444",
      "external_member_id": "vp-a",
      "application": {
        "id": "vpa_12",
        "status": "reviewing",
        "reviewed_at": "",
        "created_at": "2026-08-13T20:00:00.000Z"
      },
      "stage": "reviewing"
    },
    {
      "query": "missing-member",
      "error": "member_not_found",
      "application": null
    }
  ]
}