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+"×tamp="+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文档中
side和type的定义:确认是用字符串还是数值,保证参数值和签名生成时完全一致 quantity的小数位数需符合对应交易对的精度要求,否则会触发其他错误- 不要在API密钥/密钥中包含多余空格,确保复制的内容完整正确
- 若仍有问题,可开启Axios的调试日志,检查实际发送的请求头和参数是否符合要求
备注:内容来源于stack exchange,提问作者Sefer Eken




