POST · /api/v1/wallet/withdraw/batch-create
批量发起提现
一次提交多笔提现单。各笔独立处理——部分成功不影响其他项,响应里逐条给出成功 / 失败结果。
注意事项
- 批次内每项必须有独立且唯一的
appOrderNo,批次间也不能重复(跨批次同样幂等拒绝)。 - HTTP 层面整个批次是一次请求;若整体签名 / 参数格式错误,整批返回错误,单项不会落库。
- 建议单批次不超过 50 笔,避免超时。
/api/v1/wallet/withdraw/batch-create HMAC 幂等 Header 参数
X-Api-Keystring required | 应用 apiKey。沙箱前缀 pk_test_,正式 pk_live_。 例: pk_test_4f9d8ab1c0e74... |
X-Timestampinteger (UNIX 毫秒) required | 请求发起时刻的 UNIX 毫秒时间戳(13 位整数)。与服务端时差不能超过 ±300000ms(5 分钟)。 例: 1746450000000 |
X-Noncestring required | 本次请求的随机串,建议 UUID v4 或 16 字节 hex。同一 (apiKey, nonce) 在 10 分钟窗口内不可重复。 例: 8e3a1c2f7b6d4a90 |
X-Signaturestring required | HMAC-SHA256 签名(小写 hex,64 字符)。算法: HMAC(secret, METHOD + "\n" + PATH + "\n" + ts + "\n" + nonce + "\n" + SHA256(body))。详见 鉴权章节。 例: 6e4a8c1f...(64 字符) |
Body 参数
application/jsonitemsarray required | 提现单列表,每项结构与 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[] 各项字段
appOrderNostring required | 商户业务单号,批次内各项之间也必须唯一。 例: ORDER_2026050501 |
chainCodestring required | 公链 code。 例: ETH |
chainTokenIdinteger required | 链上代币 id,从 GET /api/v1/wallet/support/tokens 例: 3 |
toAddressstring required | 收币地址。 例: 0xab12cd34ef56789000000000000000000000001 |
toMemostring optional | 仅 Memo 链(XRP / XLM / EOS 等)需要传。 |
amountstring required | 提现金额字符串,值 > 0。 例: "10.5" |
callbackUrlstring optional | 本笔单独的回调地址,覆盖应用级配置。 |
remarkstring 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"响应
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 字段说明
totalinteger required | 本次批次总笔数。 |
successCountinteger required | 受理成功笔数。 |
failedCountinteger required | 受理失败笔数。 |
itemsarray required | 各笔结果列表,顺序与请求 items 对应。 |
items[].appOrderNostring required | 回填请求中对应的商户业务单号。 |
items[].successboolean required | true = 受理成功;false = 失败。 |
items[].withdrawobject? optional | 成功时为完整的 WithdrawDetailRespVO(字段见null。 |
items[].errorCodeinteger? optional | 失败时的业务错误码;成功时为 null。 |
items[].errorMessagestring? optional | 失败时的错误描述;成功时为 null。 |
下一步
- 单笔发起提现 — 单笔接口及完整参数说明
- 查询单笔提现 — 按
appOrderNo反查当前状态 - 配置 WITHDRAW 回调 — 状态变更主动通知