You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js调用Binance API下单时签名无效问题求助

Binance期货API下单签名错误(-1022)排查与修复

问题根源

你的代码核心问题是重复添加timestamp参数,导致签名生成的字符串与Binance服务器预期不一致,触发-1022签名无效错误:

  • 在createRequestConfig中,你已将timestamp加入data对象,生成signatureData时已包含该参数,但后续又手动拼接&timestamp=${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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:53:12