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

执行executeNewOrder函数触发ERR_INVALID_ARG_TYPE错误,求签名排查

解决ERR_INVALID_ARG_TYPE签名生成错误

错误信息

问题根源

代码中签名生成的链式调用逻辑完全错误:错误地将digest("hex")挂在了URLSearchParams.toString()的结果后面,导致update()方法接收到的不是待签名的字符串,而是尝试对字符串调用不存在的digest方法,直接触发类型错误。

另外还有两处细节问题:

  • 请求头里的X-MBX-APIKEY字段前有多余空格,会导致身份验证失败
  • POST请求的参数拼接方式不符合多数加密货币交易所规范(通常应放在请求体而非URL查询参数)

修正后的代码

import axios from "axios";
import crypto from "crypto";

const apiKey = process.env.API_KEY;
const apiSecret = process.env.API_SECRET;
const apiUrl = process.env.API_URL;

export async function executeNewOrder(symbol, quantity, side, price) {
  const data = {
    symbol,
    quantity,
    side,
    price,
    type: "LIMIT",
    timeInForce: "GTC",
    timestamp: Date.now(), // 多数交易所字段名为小写s的timestamp
    recvWindow: 50000,
  };

  // 正确生成签名:先拼接参数字符串,再执行HMAC加密并转十六进制
  const queryString = new URLSearchParams(data).toString();
  const signature = crypto
    .createHmac("sha256", apiSecret)
    .update(queryString)
    .digest("hex");

  // 将签名加入请求参数
  const requestData = new URLSearchParams({
    ...data,
    signature,
  });

  const result = await axios({
    method: "POST",
    url: `${apiUrl}/v3/order`,
    headers: {
      "X-MBX-APIKEY": apiKey, // 移除多余空格
      "Content-Type": "application/x-www-form-urlencoded",
    },
    data: requestData, // POST参数放在请求体中
  });

  return result;
}

关键修改点

  • 调整签名生成的链式调用顺序,确保update()接收纯字符串,digest()在HMAC实例上调用
  • 修正时间戳字段名为timestamp(匹配多数交易所的参数要求)
  • 将POST参数移至请求体,并设置正确的Content-Type
  • 移除请求头字段的多余空格

内容的提问来源于stack exchange,提问作者Lucas de Castro Patrão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:22:45