Skip to content

查询提现单 — checkWithdrawOrder

按商户订单号(userOrder)查询一笔提现单的当前状态。返回结构与提现状态回调一致,可用于:

  • 回调未及时到达时的主动兜底查询
  • 对账时核对订单终态(orderStatus)与链上交易哈希(txid)。
POST https://api.anonypay.io/api/merchant/checkWithdrawOrder

与其他业务接口相同:请求体为业务 JSON 的 RSA-OAEP 加密密文,并携带全套签名头(ANONY-APP-ID / ANONY-TOKEN / ANONY-TIMESTAMP / ANONY-NONCE / ANONY-SIGN)。加解密与签名规范见协议说明,token 获取见 getToken

请求参数

字段类型必填说明
userOrderstring商户订单号(创建提现单时传入的 userOrder

请求体示例(加密前的业务 JSON):

json
{ "userOrder": "W20260708-0001" }

响应字段

data 验签、解密后为业务 JSON,字段与提现状态回调一致:

字段类型说明
businessTypestring固定 withdraw
toAddressstring提现目标地址
amountstring提现金额
currencystring币种符号
feestring手续费
apiOrderstring平台订单号
userOrderstring商户订单号
withdrawTypestring提现类型:normal(普通)/ financialConfirmation(财务确认)
messagestring备注
txidstring链上交易哈希(未完成时可能为空
orderStatusstring订单状态,取值见下表

解密后的响应示例:

json
{
  "businessType": "withdraw",
  "toAddress": "TXYZ...abcd",
  "amount": "100",
  "currency": "trx.usdt",
  "fee": "1",
  "apiOrder": "AP2026070812345",
  "userOrder": "W20260708-0001",
  "withdrawType": "normal",
  "message": "",
  "txid": "9a1b2c3d...",
  "orderStatus": "success"
}

orderStatus 取值全表

取值类型含义
pendingConfirm中间态订单已受理(已扣款建单),等待平台确认处理
pendingTransfer中间态等待/正在执行链上转账(normal 流程)
pendingFinancialConfirmation中间态等待财务确认放行(仅 withdrawType=financialConfirmation 流程)
pendingCallback中间态链上处理已完成,等待回调商户
success终态提现成功
WithdrawRefund终态提现被拒绝/退款,金额已退回商户余额
fail终态提现失败

两条流程的状态流转(状态机图见创建提现单页面):

  • 普通提现(normal)pendingConfirmpendingTransferpendingCallbacksuccess
  • 财务确认(financialConfirmation)pendingConfirmpendingFinancialConfirmationpendingCallbacksuccess
  • 任一流程都可能进入 WithdrawRefund(被拒绝退款)或 fail(失败)终态。

以终态为准判定业务结果

中间态(pending*)的具体名称与流转细节可能随平台流程调整,请勿在业务逻辑中硬编码依赖中间态;判定订单结果只应依据三个终态:success / WithdrawRefund / fail。提现的最终结果同时会通过提现状态回调异步通知,本接口适合作为回调的兜底与对账手段。

错误

message说明
withdrawOrderNotExistuserOrder 查无此提现单(订单号错误,或该订单不属于当前商户号)

失败时响应为 { "code": 9999, "data": "", "message": "withdrawOrderNotExist" }。其余通用错误(signatureFailedtokenExpired 等)见错误码

调用示例

php
require 'AnonyV2Client.php';

$client = new AnonyV2Client($appId, $serverPublicKeyB64, $merchantPrivateKeyB64);
$token  = $client->getToken($secret);

$res = $client->post('checkWithdrawOrder', ['userOrder' => 'W20260708-0001'], $token);
// $res['data'] 已自动验签+解密
$order = $res['data'];
if (in_array($order['orderStatus'], ['success', 'WithdrawRefund', 'fail'], true)) {
    // 终态,可据此更新本地订单
}
python
from anony_v2 import AnonyV2Client, auth_header
import requests

c = AnonyV2Client(app_id, server_pub_b64, merchant_priv_b64)

# 取 token(响应仍是加密+签名信封,需验签+解密)
tr = requests.post(c.base_url + "getToken",
                   headers={"ANONY-APP-ID": str(app_id),
                            "Authorization": auth_header(app_id, secret)})
tb = tr.json()
token = c.verify_response(tb["data"], tr.headers["ANONY-TIMESTAMP"],
                          tr.headers["ANONY-NONCE"], tr.headers["ANONY-SIGN"])["token"]

req = c.build_request({"userOrder": "W20260708-0001"}, token)
r = requests.post(c.base_url + "checkWithdrawOrder", data=req["body"], headers=req["headers"])
body = r.json()
if body["code"] == 10000:
    order = c.verify_response(body["data"], r.headers["ANONY-TIMESTAMP"],
                              r.headers["ANONY-NONCE"], r.headers["ANONY-SIGN"])
    print(order["orderStatus"], order["txid"])
else:
    print(body["message"])  # 例如 withdrawOrderNotExist
js
const { AnonyV2Client } = require('./anony_v2');

const c = new AnonyV2Client(appId, serverPubB64, merchantPrivB64);
const token = await c.getToken(secret); // Node ≥18

const req = c.buildRequest({ userOrder: 'W20260708-0001' }, token);
const r = await fetch(c.baseUrl + 'checkWithdrawOrder', {
  method: 'POST', body: req.body, headers: req.headers,
});
const body = await r.json();
if (body.code === 10000) {
  const order = c.verifyResponse(body.data, r.headers.get('anony-timestamp'),
    r.headers.get('anony-nonce'), r.headers.get('anony-sign'));
  console.log(order.orderStatus, order.txid);
} else {
  console.log(body.message); // 例如 withdrawOrderNotExist
}

相关页面