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

Node.js调用BingX API出现signature does not match错误求助

修复BingX API签名不匹配问题

问题根源分析

你的代码存在以下关键错误导致签名验证失败:

  1. 时间戳不一致:签名生成时的timestamp和请求体中的timestamp是两次独立生成的,存在毫秒级差异,服务器验证时会判定不匹配。
  2. 签名原始串格式错误:未按照BingX要求拼接请求方法、路径和参数串,缺少空格和?分隔符。
  3. 请求头缺失必要字段:POST发送表单格式数据时未声明Content-Type,导致服务器无法正确解析参数。
  4. 签名编码处理不当:对Base64结果的URL编码做了不必要的替换,不符合API要求。

BingX API签名规则(中文翻译)

根据官方文档,签名生成需遵循以下步骤:

  1. 将所有请求参数(不含sign)按参数名的ASCII码升序排列,拼接成key1=value1&key2=value2格式的字符串。
  2. 拼接原始签名串:{请求方法(大写)} {请求路径}?{参数串},例如POST请求的格式为POST /api/v1/user/getBalance?apiKey=xxx&currency=USDT&timestamp=1690000000000。
  3. 使用HMAC-SHA256算法,以API秘钥为密钥对原始签名串加密,将结果转为Base64编码,再进行URL编码得到最终签名。
  4. 请求时需确保签名用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:31:46