You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Binance TR API下单时返回Invalid API-key错误,但查询账户接口正常求助

Binance TR API下单时返回Invalid API-key错误,但查询账户接口正常求助

我在用Binance TR的API,调用账户查询接口时一切正常,但尝试创建买入订单时,始终返回以下错误:

data: { code: 3700, msg: 'Invalid API-key', timestamp: 1733491789482 }

可以正常工作的账户查询代码

这是我用来查询账户信息的代码,执行后能成功返回数据:

var apikey="EfA925057351A2f91Fc458ce784c92A2U1xmmH4M3XBuCFmFaWtTN7..";
var secretkey="355D6701C75CC418D874664AF0698f4CYhiOeSVrIV0RfoQLCIxd8gc8l8tl...";
var headers = {
    'X-MBX-APIKEY': apikey,
}
var payload_ana={
        "timestamp":Date.now()
    }
    
axios
    .get("https://www.binance.tr/open/v1/account/spot ",{params:payload_ana,headers:headers})
    // 后续处理逻辑

无法工作的下单代码

这是我尝试创建买入订单的代码,执行后就会返回Invalid API-key错误:

var payload={
    "symbol":x,
    "side":0,
    "type":2,
    "quantity":(Number(deger)*50/100/Number(y)).toString(),
    // deger=我的总余额,y=当前币价
    "timestamp":Date.now(),
}   
var sonuc=crypto.createHmac('sha256', secretkey).update("symbol="+payload.symbol+"&side="+payload.side+"&type="+payload.type+"&quantity="+payload.quantity+"&timestamp="+payload.timestamp).digest('hex');      
payload.signature=sonuc;
axios
    .post("https://www.binance.tr/open/v1/orders ",{params:payload,headers:headers})
    // 后续处理逻辑

完整的请求响应

以下是下单请求返回的完整响应信息:

{
  status: 200,
  statusText: 'OK',
  headers: Object [AxiosHeaders] {
    'content-type': 'application/json; charset=utf-8',
    'transfer-encoding': 'chunked',
    connection: 'keep-alive',
    date: 'Fri, 06 Dec 2024 13:49:55 GMT',
    'x-from-dispatcher': 'exchange-api',
    server: 'Tengine',
    vary: 'Accept-Encoding',
    'cache-control': 'no-cache,no-store',
    'x-mbx-request-weight-1m': '1200',
    'x-mbx-used-weight-1m': '6',
    'x-cache': 'Miss from cloudfront',
    via: '1.1 6be35cf91f59f6713f28a8e4ae2189c0.cloudfront.net (CloudFront)',
    'x-amz-cf-pop': 'IST50-P1',
    'x-amz-cf-id': 'gaMCIh3nq9wDL3sTGCcIfy656g68CcwtOgQr869wKxmCcaFuB_IZuQ=='
  },
  config: {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false
    },
    adapter: [ 'xhr', 'http', 'fetch' ],
    transformRequest: [ [Function: transformRequest] ],
    transformResponse: [ [Function: transformResponse] ],
    timeout: 0,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: Object [AxiosHeaders] {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'application/json',
      'User-Agent': 'axios/1.7.8',
      'Content-Length': '291',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    method: 'post',
    url: 'https://www.binance.tr/open/v1/orders ',
    data: '{"params":{"symbol":"CRV_TRY","side":"BUY","type":"MARKET","quantity":"2.4039089002976186","timestamp":1733492985963,"signature":"f3b0128a562d8b03e090e5cd1db02bd4f321faf95f684320924b59be063137a8"},"headers":{"X-MBX-APIKEY":"EfA925057351A2f91Fc458ce784c92A2U1xmmH4M3XBuCFmFaWtTN7uqGvxiBVqO"}}'
  },
  request: <ref *1> ClientRequest { /* 省略部分内容 */ },
  data: { code: 3700, msg: 'Invalid API-key', timestamp: 1733492986008 }
}

问题分析与解决方案

从你的请求响应中可以看到几个关键错误,这也是导致签名验证失败(返回Invalid API-key)的核心原因:

1. Axios POST请求结构完全错误

你当前的axios.post调用不符合Axios语法规范:

// 错误写法
axios.post("https://www.binance.tr/open/v1/orders ",{params:payload,headers:headers})

Axios的POST方法正确语法是axios.post(url, data, config),其中:

  • 第二个参数是请求体(data)
  • 第三个参数是配置对象(包含headers、params等)

你的写法导致:

  • X-MBX-APIKEY没有被正确添加到请求头(看响应的config.headers里无此字段)
  • 请求参数被错误包裹为JSON对象发送,而Binance TR API要求POST下单接口使用application/x-www-form-urlencoded格式参数

2. 签名与实际发送参数不匹配

  • 生成签名时你用的是side=0,但实际发送的参数里side"BUY"(看响应的data字段),这会导致签名和实际参数不一致,验证失败
  • 手动拼接签名字符串容易出现空格、编码或参数顺序错误,推荐用工具库生成标准的form-urlencoded格式字符串

3. 修正后的下单代码示例

下面是解决所有问题后的代码:

const crypto = require('crypto');
const axios = require('axios');
const qs = require('qs'); // 需要先安装qs库:npm install qs

var apikey="EfA925057351A2f91Fc458ce784c92A2U1xmmH4M3XBuCFmFaWtTN7..";
var secretkey="355D6701C75CC418D874664AF0698f4CYhiOeSVrIV0RfoQLCIxd8gc8l8tl...";
var headers = {
    'X-MBX-APIKEY': apikey,
    'Content-Type': 'application/x-www-form-urlencoded' // 必须设置该Content-Type
}

// 构造下单参数(确保side/type和API文档定义一致)
var payload={
    "symbol": "CRV_TRY", // 替换为你的目标交易对
    "side": "BUY", // 若API要求用数值0对应BUY,可改为0,但要保证签名和参数一致
    "type": "MARKET", // 若API要求用数值2对应MARKET,可改为2,需和文档匹配
    "quantity": (Number(deger)*50/100/Number(y)).toString(),
    "timestamp": Date.now(),
}   

// 用qs生成标准form-urlencoded字符串,避免手动拼接错误
const queryString = qs.stringify(payload);
// 生成签名
var signature = crypto.createHmac('sha256', secretkey).update(queryString).digest('hex');
// 添加签名到参数
payload.signature = signature;

// 正确的Axios POST调用
axios
    .post(
        "https://www.binance.tr/open/v1/orders",
        qs.stringify(payload), // 发送form-urlencoded格式的参数
        { headers: headers } // 正确设置请求头
    )
    .then(response => {
        console.log("下单成功:", response.data);
    })
    .catch(error => {
        console.error("下单失败:", error.response?.data || error.message);
    });

额外注意事项

  • 务必核对Binance TR API文档中sidetype的定义:确认是用字符串还是数值,保证参数值和签名生成时完全一致
  • quantity的小数位数需符合对应交易对的精度要求,否则会触发其他错误
  • 不要在API密钥/密钥中包含多余空格,确保复制的内容完整正确
  • 若仍有问题,可开启Axios的调试日志,检查实际发送的请求头和参数是否符合要求

备注:内容来源于stack exchange,提问作者Sefer Eken

火山引擎 最新活动