Binance API错误码-1102:已传timestamp仍报错求助
Binance期货API报错-1102:已传timestamp仍提示未发送的解决方法
问题场景
调用Binance期货API下单时,明明传入了timestamp参数,却收到错误码-1102,提示:
"Mandatory parameter 'timestamp' was not sent, was empty/null, or malformed."
报错原因
- 请求格式不兼容:Binance的签名验证类API(如期货下单接口)要求参数以
form-urlencoded格式或URL查询字符串传递,不支持JSON格式请求体。你的代码中axios默认以JSON发送请求,Binance服务器无法解析JSON里的参数,因此判定timestamp未传入。 - 签名参数格式错误:生成签名的
params字符串中使用了HTML实体&作为分隔符,而非普通的&,这会导致签名计算错误,同时服务器无法正确解析参数。
修复方案
步骤1:修改参数分隔符
将生成签名的params字符串中的&替换为&,确保参数格式正确。
步骤2:改用form-urlencoded格式发送请求
引入qs模块(需通过npm install qs安装),将请求参数序列化为form-urlencoded格式,并设置正确的请求头。
修改后的完整代码
// settings const setting = require('./json/binance.json'); // packages const axios = require('axios'); const crypto = require('crypto'); const qs = require('qs'); // 用于序列化form数据 const apiKey = setting.apiKey; const apiSecret = setting.secret; // Headers:指定内容类型为form-urlencoded const headers = { 'X-MBX-APIKEY': apiKey, 'Content-Type': 'application/x-www-form-urlencoded' }; // Signature function generateSignature(params) { return crypto.createHmac('sha256', apiSecret).update(params).digest('hex'); } function placeFuturesOrder(req) { const symbol = req.body.symbol; const side = req.body.side; const type = 'MARKET'; const quantity = req.body.amount; const baseUrl = 'https://fapi.binance.com'; const endpoint = '/fapi/v1/order'; const timestamp = Date.now(); // 用普通&分隔参数,修正HTML实体问题 const params = `symbol=${symbol}&side=${side}&type=${type}&quantity=${quantity}×tamp=${timestamp}`; const signature = generateSignature(params); // 序列化为form-urlencoded格式 const postData = qs.stringify({ symbol, side, type, quantity, timestamp, signature, }); return axios.post(baseUrl + endpoint, postData, { headers }); }
额外注意事项
- 确保
timestamp是毫秒级时间戳,且与Binance服务器时间差不超过5000ms,可调用/fapi/v1/time接口同步时间。 - 若参数值包含特殊字符(如小数、特殊符号),需用
encodeURIComponent()处理,例如:symbol=${encodeURIComponent(symbol)}。 - 生成签名的参数必须与实际发送的参数完全一致,避免遗漏或多余参数。
内容的提问来源于stack exchange,提问作者code
相关产品推荐
相关产品推荐

