POST · /api/v1/wallet/withdraw/batch-create

批量发起提现

一次提交多笔提现单。各笔独立处理——部分成功不影响其他项,响应里逐条给出成功 / 失败结果。

注意事项

  • 批次内每项必须有独立且唯一appOrderNo,批次间也不能重复(跨批次同样幂等拒绝)。
  • HTTP 层面整个批次是一次请求;若整体签名 / 参数格式错误,整批返回错误,单项不会落库。
  • 建议单批次不超过 50 笔,避免超时。
POST/api/v1/wallet/withdraw/batch-create HMAC 幂等

Header 参数

X-Api-Key
string required
应用 apiKey。沙箱前缀 pk_test_,正式 pk_live_
例: pk_test_4f9d8ab1c0e74...
X-Timestamp
integer (UNIX 毫秒) required
请求发起时刻的 UNIX 毫秒时间戳(13 位整数)。与服务端时差不能超过 ±300000ms(5 分钟)。
例: 1746450000000
X-Nonce
string required
本次请求的随机串,建议 UUID v4 或 16 字节 hex。同一 (apiKey, nonce) 在 10 分钟窗口内不可重复。
例: 8e3a1c2f7b6d4a90
X-Signature
string required
HMAC-SHA256 签名(小写 hex,64 字符)。算法:HMAC(secret, METHOD + "\n" + PATH + "\n" + ts + "\n" + nonce + "\n" + SHA256(body))。详见 鉴权章节
例: 6e4a8c1f...(64 字符)

Body 参数

application/json
items
array required
提现单列表,每项结构与单笔提现的 Body 完全一致,每项必须有独立的 appOrderNo

示例

{
  "items": [
    {
      "appOrderNo":   "ORDER_2026050501",
      "chainCode":    "ETH",
      "chainTokenId": 3,
      "toAddress":    "0xab12cd34ef56789000000000000000000000001",
      "amount":       "10.5"
    },
    {
      "appOrderNo":   "ORDER_2026050502",
      "chainCode":    "ETH",
      "chainTokenId": 3,
      "toAddress":    "0xcd34ef5678901234000000000000000000000002",
      "amount":       "5.0"
    }
  ]
}

items[] 各项字段

appOrderNo
string required
商户业务单号,批次内各项之间也必须唯一。
例: ORDER_2026050501
chainCode
string required
公链 code。
例: ETH
chainTokenId
integer required
链上代币 id,从 GET /api/v1/wallet/support/tokens 获取。
例: 3
toAddress
string required
收币地址。
例: 0xab12cd34ef56789000000000000000000000001
toMemo
string optional
仅 Memo 链(XRP / XLM / EOS 等)需要传。
amount
string required
提现金额字符串,值 > 0。
例: "10.5"
callbackUrl
string optional
本笔单独的回调地址,覆盖应用级配置。
remark
string optional
备注(≤200 字),仅后台展示。

请求示例

# 签名算法(stringToSign / 4 个 header)见 /docs/api/auth
API_KEY=pk_test_xxx
SECRET=sk_test_xxx
METHOD=POST
REQ_PATH=/api/v1/wallet/withdraw/batch-create
BODY='{"items":[{"appOrderNo":"ORDER_2026050501","chainCode":"ETH","chainTokenId":3,"toAddress":"0xab12cd34ef56789000000000000000000000001","amount":"10.5"},{"appOrderNo":"ORDER_2026050502","chainCode":"ETH","chainTokenId":3,"toAddress":"0xcd34ef5678901234000000000000000000000002","amount":"5.0"}]}'
TS=$(( $(date +%s) * 1000 ))
NONCE=$(uuidgen | tr -d '-' | tr '[:upper:]' '[:lower:]')
BODY_SHA=$(printf "%s" "$BODY" | openssl dgst -sha256 -hex | awk '{print $2}')
SIG=$(printf "%s\n%s\n%s\n%s\n%s" "$METHOD" "$REQ_PATH" "$TS" "$NONCE" "$BODY_SHA" \
  | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $2}')

curl -X POST "https://api.pqpa.com$REQ_PATH" \
  -H "Content-Type: application/json" \
  -H "X-Api-Key:    $API_KEY" \
  -H "X-Timestamp:  $TS" \
  -H "X-Nonce:      $NONCE" \
  -H "X-Signature:  $SIG" \
  -d "$BODY"

响应

Response
200OK
{
  "code": 0,
  "data": {
    "total":        2,
    "successCount": 1,
    "failedCount":  1,
    "items": [
      {
        "appOrderNo": "ORDER_2026050501",
        "success":    true,
        "withdraw": {
          "appOrderNo":    "ORDER_2026050501",
          "chainCode":     "ETH",
          "token":         "USDT",
          "amount":        "10.5",
          "fee":           "0.0021",
          "fromAddress":   "0xHotWallet...",
          "toAddress":     "0xab12cd34ef56789000000000000000000000001",
          "memo":          null,
          "txHash":        null,
          "blockHeight":   null,
          "confirmations": 0,
          "status":        "PROCESSING",
          "failReason":    null,
          "riskLevel":     null,
          "riskReason":    null,
          "callbackTaskId": null,
          "createTime":    "2026-05-05T12:34:56",
          "updateTime":    "2026-05-05T12:34:56"
        },
        "errorCode":    null,
        "errorMessage": null
      },
      {
        "appOrderNo":   "ORDER_2026050502",
        "success":      false,
        "withdraw":     null,
        "errorCode":    1007004002,
        "errorMessage": "热钱包余额不足"
      }
    ]
  },
  "msg": ""
}

data 字段说明

total
integer required
本次批次总笔数。
successCount
integer required
受理成功笔数。
failedCount
integer required
受理失败笔数。
items
array required
各笔结果列表,顺序与请求 items 对应。
items[].appOrderNo
string required
回填请求中对应的商户业务单号。
items[].success
boolean required
true = 受理成功;false = 失败。
items[].withdraw
object? optional
成功时为完整的 WithdrawDetailRespVO(字段见查询单笔提现);失败时为 null
items[].errorCode
integer? optional
失败时的业务错误码;成功时为 null
items[].errorMessage
string? optional
失败时的错误描述;成功时为 null

下一步