Kucoin API C#签名验证失败问题求助
排查KuCoin API签名验证失败的问题
我帮你分析下签名失败的原因——你的代码逻辑和KuCoin官方要求的签名规则不匹配,主要有几个核心问题需要修正:
1. 待签名字符串的构造完全错误
KuCoin要求的待签名字符串必须严格遵循以下格式:
timestamp + HTTP_METHOD + requestPath + queryStringOrRequestBody
拆解每个部分的要求:
timestamp:毫秒级UTC时间戳(也就是你用的nonce,必须和请求头里的KC-API-TIMESTAMP完全一致)HTTP_METHOD:大写的请求方法,比如GET、POSTrequestPath:完整的API路径,比如/api/v1/user/info(要包含版本号,和实际请求的路径完全匹配)queryStringOrRequestBody:GET请求填URL查询参数(比如?symbol=BTC-USDT),POST请求填格式化后的请求体JSON字符串(不能有多余空格或换行)
你的代码里构造的"/user/info/"+input+"/"完全不符合这个规则,这是导致签名验证失败的首要原因。
2. 签名结果的编码方式不对
KuCoin要求把HMAC-SHA256加密后的字节数组转换成Base64编码字符串,但你的代码是转成了十六进制小写字符串(BitConverter.ToString(hashValue).Replace("-", "").ToLower()),这是第二个核心错误。
修复后的示例代码
假设你要调用GET /api/v1/user/info这个接口,修复后的C#代码应该是这样的:
// 生成毫秒级UTC时间戳,必须和请求头KC-API-TIMESTAMP的值完全一致 long timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); string method = "GET"; // 注意路径要和KuCoin API的实际路径一致,包含版本号 string requestPath = "/api/v1/user/info"; // GET请求无参数时填空字符串,有参数则拼接成?key1=value1&key2=value2的格式 string queryOrBody = ""; // 构造正确的待签名字符串 string stringToSign = timestamp + method + requestPath + queryOrBody; byte[] secretKeyBytes = Encoding.UTF8.GetBytes(SecretKey); byte[] inputBytes = Encoding.UTF8.GetBytes(stringToSign); using (var hmac = new HMACSHA256(secretKeyBytes)) { byte[] hashValue = hmac.ComputeHash(inputBytes); // 转换为Base64编码,这才是KuCoin接受的签名格式 return Convert.ToBase64String(hashValue); }
额外需要注意的细节
- 请求头必须包含这几个字段,缺一不可:
KC-API-KEY:你的API KeyKC-API-TIMESTAMP:和签名中用的timestamp完全相同的毫秒时间戳KC-API-SIGN:上面生成的Base64签名KC-API-PASSPHRASE:创建API时设置的密码短语
- 时间戳不能和KuCoin服务器时间相差超过30秒,否则会触发签名错误,建议用UTC时间生成避免时区偏差
- 如果是POST请求,请求体必须是标准JSON格式,且要和待签名字符串里的
queryOrBody完全一致(不能有多余空格、换行) - 确认你的API Key、Secret、Passphrase都正确,没有复制错误或大小写问题
内容的提问来源于stack exchange,提问作者Zimsan
相关产品推荐
相关产品推荐

