Fiddler中使用C#调用Binance API提交订单返回Bad Request求助
Binance Fiddler脚本发送订单返回bad request排查方案
优先级最高的错误排查点
- 签名内容错误:你用于HMAC签名的字符串末尾多了
&signature=后缀,币安要求仅对除signature参数外的所有查询/请求体参数拼接后签名,多余的后缀会导致签名校验失败直接返回400。 - 参数位置错误:币安合约
fapi/v1/order私有接口的POST请求要求参数放在请求体中,你当前将所有参数拼接在URL查询串中,不符合接口规范,会直接被拦截返回400。 - 缺失API Key请求头:所有币安私有接口必须在请求头中携带
X-MBX-APIKEY字段,值为你的API公钥,未携带该头会直接返回权限类400错误。 - 参数提取逻辑脆弱:你硬编码查找
BTC作为symbol结束标识、硬编码查找&price作为quantity结束标识,一旦原始请求的交易对后缀不是BTC、参数顺序发生变化,会直接提取到错误参数甚至抛出异常,导致请求内容异常。 - 浮点数精度问题:使用float类型存储数量、价格,转字符串时极易出现科学计数法、多余小数位,不符合币安对应交易对的步长精度要求,会返回参数格式错误。
- 重复请求问题:你修改了原始session的host、url后又调用
SendRequest,会同时发送修改后的原始请求+新请求,两笔请求都会发到币安,大概率触发参数重复错误。
核心代码修正示例
public static void OnBeforeResponse(Session oSession) { if (oSession.HTTPMethodIs("POST") && oSession.uriContains("order")) { try { String strBody = oSession.GetRequestBodyAsString(); // 改用键值对解析参数,避免硬编码查找报错 var paramDict = System.Web.HttpUtility.ParseQueryString(strBody); string baseSymbol = paramDict["symbol"].Replace("BTC", ""); float quantity = float.Parse(paramDict["quantity"], System.Globalization.CultureInfo.InvariantCulture) * 2; // 根据交易对要求调整数量精度,比如U本位合约多数交易对数量保留3位小数 quantity = (float)Math.Round(quantity, 3); long timestamp = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; string apiPublicKey = "你的币安API公钥"; string secretKey = "lfaeGkjitNwvyG2lqDueMhSAOzRFlzL73w5pKRCAvSy7YrxyTkvwKCcHBHj..."; // 构建待签名参数,不包含signature字段 string signSource = $"symbol={baseSymbol}USDT&side=BUY&type=MARKET&quantity={quantity.ToString(System.Globalization.CultureInfo.InvariantCulture)}&recvWindow=5000×tamp={timestamp}"; // 生成签名,币安要求签名为小写十六进制 Encoding ascii = Encoding.ASCII; HMACSHA256 hmac = new HMACSHA256(ascii.GetBytes(secretKey)); string signature = BitConverter.ToString(hmac.ComputeHash(ascii.GetBytes(signSource))).Replace("-", "").ToLower(); // 构建最终请求体 string finalBody = $"{signSource}&signature={signature}"; byte[] bodyBytes = ascii.GetBytes(finalBody); // 新建独立请求头,避免原始请求头的干扰字段 HTTPHeaders newHeaders = new HTTPHeaders(); newHeaders.Add("X-MBX-APIKEY", apiPublicKey); newHeaders.Add("Content-Type", "application/x-www-form-urlencoded"); newHeaders.Add("Host", "fapi.binance.com"); // 仅发送新请求,不修改原始session的内容 FiddlerApplication.oProxy.SendRequest("POST", "https://fapi.binance.com/fapi/v1/order", newHeaders, bodyBytes, null); } catch (Exception ex) { // 输出错误日志到Fiddler日志面板方便排查 FiddlerApplication.Log.LogString("发送开仓请求失败:" + ex.Message); } } }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

