使用Node.js调用Binance API下单时签名无效问题求助
Binance期货API下单签名错误(-1022)排查与修复
问题根源
你的代码核心问题是重复添加timestamp参数,导致签名生成的字符串与Binance服务器预期不一致,触发-1022签名无效错误:
- 在
createRequestConfig中,你已将timestamp加入data对象,生成signatureData时已包含该参数,但后续又手动拼接×tamp=${timestamp},最终签名字符串出现两个timestamp键值对,破坏签名一致性。 - POST请求的
config.data里重复拼接timestamp和signature,进一步加剧参数不一致问题。 placeMarketOrder中提前给data加timestamp,进入createRequestConfig后又被重新赋值,属于冗余操作。
修复后的代码
const axios = require('axios'); const crypto = require('crypto'); const API_KEY = 'xx'; const API_SECRET = 'xx'; const BASE_URL = 'https://fapi.binance.com'; const signature = (data) => { return crypto.createHmac('sha256', API_SECRET).update(data).digest('hex'); }; const createRequestConfig = (method, endpoint, data = {}) => { // 统一生成timestamp,避免重复 const timestamp = Date.now(); data.timestamp = timestamp; // 生成待签名参数字符串:排序后拼接,已包含timestamp,同时对参数值URL编码 const signatureData = Object.keys(data) .sort() .map(key => `${key}=${encodeURIComponent(data[key])}`) .join('&'); const sig = signature(signatureData); const config = { method: method, url: `${BASE_URL}${endpoint}`, headers: { 'X-MBX-APIKEY': API_KEY } }; if (method === 'GET') { // GET请求参数放在URL config.url += `?${signatureData}&signature=${sig}`; } else if (method === 'POST') { config.headers['Content-Type'] = 'application/x-www-form-urlencoded'; // POST请求参数放在请求体,包含签名 config.data = `${signatureData}&signature=${sig}`; } return config; }; const placeMarketOrder = async (symbol, side, notionalValue) => { const endpoint = '/fapi/v1/order'; const data = { symbol: symbol, side: side, type: 'MARKET', quantity: 0, // 占位符,后续计算 newOrderRespType: 'FULL' // 不再手动加timestamp,交给createRequestConfig统一处理 }; const config = createRequestConfig('POST', endpoint, data); try { const response = await axios(config); // 注意:此处计算逻辑可能有误,若按名义价值下单,建议使用quoteOrderQty参数(期货API支持),无需自行计算 const executedQty = response.data.executedQty; const calculatedQuantity = executedQty / notionalValue; console.log('Order response:', response.data); console.log('Calculated quantity:', calculatedQuantity); } catch (error) { console.error('Error placing order:', error.response.data); } };
额外注意事项
- 参数URL编码:所有参数值需用
encodeURIComponent编码,避免特殊字符破坏参数字符串结构。 - 名义价值下单优化:若要按USDT等名义金额下单,直接使用
quoteOrderQty参数,Binance会自动计算对应数量,无需手动处理。 - 时间同步:确保本地服务器时间与Binance服务器时间误差不超过5000ms,否则也可能触发签名错误。
内容的提问来源于stack exchange,提问作者mch_dk
相关产品推荐
相关产品推荐

