JS调用KuCoin API出现Invalid KC-API-SIGN错误,如何解决?
KuCoin API Node.js 查询未成交订单签名错误(400005)排查
你的代码出现Invalid KC-API-SIGN错误,主要是以下几个问题导致的:
- 请求方法不匹配:签名计算时用的是
"GET",但实际请求用了post方法。KuCoin查询订单列表的接口是GET请求,POST是用于创建订单的,签名里的请求方法和实际请求方法不一致,直接导致签名验证失败。 - 多余的请求体:GET请求不需要
body参数,你传入了空字符串"",这可能干扰服务器的签名验证逻辑。 - (可选)未指定订单状态:默认调用
/api/v1/orders会返回所有状态的订单,要查询未成交订单,需要在路径后加?status=active参数。
修正后的代码
import { KEY, PASSWORD, SECRET } from "./secrets.js"; import CryptoJS from "crypto-js"; const baseUrl = 'https://api.kucoin.com'; // 添加查询参数指定获取未成交订单 const endPointOrders = '/api/v1/orders?status=active'; const signatureInBase64 = (path, now) => { // 把timestamp转成字符串,避免数字拼接的潜在格式问题 const msg = now.toString() + "GET" + path; const signature = CryptoJS.HmacSHA256(msg, SECRET); return CryptoJS.enc.Base64.stringify(signature); } const passphraseInBase64 = () => { const passphrase = CryptoJS.HmacSHA256(PASSWORD, SECRET); return CryptoJS.enc.Base64.stringify(passphrase); } const openOrders = async() => { const path = endPointOrders; const now = Date.now(); const headers = { "KC-API-SIGN": signatureInBase64(path, now), "KC-API-TIMESTAMP": now.toString(), // 转为字符串,避免数字传递的格式问题 "KC-API-KEY": KEY, "KC-API-PASSPHRASE": passphraseInBase64(), "KC-API-KEY-VERSION": "2", "Content-Type": "application/json" } const url = baseUrl + path; const response = await fetch(url, { method: 'get', // 改为GET请求 headers: headers }); const data = await response.json(); console.log(data); } export { openOrders };
关键修正说明
- 对齐签名与请求方法:签名里用
GET,实际请求也必须用GET,这是签名验证通过的核心前提。 - 移除GET请求的
body参数:符合HTTP规范,避免服务器解析异常。 - 统一timestamp格式:将
Date.now()的结果转为字符串后再参与签名和请求头,避免部分环境下数字类型的精度或格式问题。
内容的提问来源于stack exchange,提问作者Mirror318
相关产品推荐
相关产品推荐

