Node.js调用BingX API出现signature does not match错误求助
修复BingX API签名不匹配问题
问题根源分析
你的代码存在以下关键错误导致签名验证失败:
- 时间戳不一致:签名生成时的
timestamp和请求体中的timestamp是两次独立生成的,存在毫秒级差异,服务器验证时会判定不匹配。 - 签名原始串格式错误:未按照BingX要求拼接请求方法、路径和参数串,缺少空格和
?分隔符。 - 请求头缺失必要字段:POST发送表单格式数据时未声明
Content-Type,导致服务器无法正确解析参数。 - 签名编码处理不当:对Base64结果的URL编码做了不必要的替换,不符合API要求。
BingX API签名规则(中文翻译)
根据官方文档,签名生成需遵循以下步骤:
- 将所有请求参数(不含
sign)按参数名的ASCII码升序排列,拼接成key1=value1&key2=value2格式的字符串。 - 拼接原始签名串:
{请求方法(大写)} {请求路径}?{参数串},例如POST请求的格式为POST /api/v1/user/getBalance?apiKey=xxx¤cy=USDT×tamp=1690000000000。 - 使用HMAC-SHA256算法,以API秘钥为密钥对原始签名串加密,将结果转为Base64编码,再进行URL编码得到最终签名。
- 请求时需确保签名用的
timestamp与请求参数中的timestamp完全一致。
修复后的代码
const axios = require('axios'); const crypto = require('crypto'); const APIKEY = "My_API_Key"; const SECRETKEY = "My_Secret_key"; const generateSignature = (params) => { // 按参数名ASCII升序排序并拼接参数串 const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&'); // 拼接原始签名串:方法 + 路径 + ? + 参数串 const originString = `POST /api/v1/user/getBalance?${sortedParams}`; // 生成HMAC-SHA256签名,转Base64后URL编码 const hmac = crypto.createHmac('sha256', SECRETKEY).update(originString).digest('base64'); return encodeURIComponent(hmac); } const fetchBalance = async () => { try { const timestamp = Date.now(); // 构造签名用的参数(不含sign) const params = { apiKey: APIKEY, currency: 'USDT', timestamp: timestamp }; // 生成签名 const sign = generateSignature(params); // 构造请求体,加入签名 const body = new URLSearchParams({ ...params, sign: sign }).toString(); const url = `https://api-swap-rest.bingbon.pro/api/v1/user/getBalance`; const response = await axios.post(url, body, { headers: { 'User-Agent': 'Mozilla/5.0', 'Content-Type': 'application/x-www-form-urlencoded' // 必须声明表单格式 } }); console.log(response.data); } catch (error) { console.error('请求失败:', error.response?.data || error.message); } } fetchBalance();
关键修复说明
- 统一时间戳:只生成一次
timestamp,同时用于签名和请求参数,确保完全一致。 - 正确拼接原始签名串:按照
POST {路径}?{参数串}的格式拼接,符合API要求。 - 参数排序:通过
Object.keys(params).sort()确保参数按ASCII升序排列,避免因参数顺序导致签名错误。 - 添加Content-Type头:声明请求体为表单格式,让服务器正确解析参数。
- 规范签名编码:直接使用
encodeURIComponent处理Base64结果,无需额外替换操作。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

