如何在浏览器中用JavaScript调用KuCoin API发送POST请求解决签名错误
问题原因&修复方案
你的代码存在3个核心错误导致签名验证失败:
- 错误1:POST请求的URL拼接错误,你把请求方法、请求体内容都错误拼接在了请求URL尾部,实际POST请求的URL应为
https://cors-anywhere.herokuapp.com/https://api.kucoin.com/api/v1/orders - 错误2:没有正确传递POST请求体,$.ajax的POST请求需要把请求参数放在
data字段,同时指定contentType: 'application/json',你当前发的POST请求体为空,服务端计算签名时用的是空请求体,和你签名时用的带参数的字符串不一致,自然校验失败 - 错误3:手动拼接JSON字符串容易出现格式、顺序错误,建议先将请求参数对象转成JSON字符串后,再统一用于签名拼接和请求体传递,保证两边字符串完全一致
修正后POST请求代码
// REST (Order Limit BUY) // 先定义请求参数对象,保证签名和请求体用的是完全一致的内容 var orderParams = { "clientOid": "ADAUSDT", "side": "buy", "symbol": "ADA-USDT", "price": "0.001", "size": "50000" }; // 统一转成JSON字符串,避免手动写的格式错误 var orderParamsStr = JSON.stringify(orderParams); var now = Date.now().toString(); // 签名拼接规则沿用原有逻辑,这里用统一生成的JSON字符串 var hey = now + 'POST' + endPointOrder + orderParamsStr; /* 签名计算逻辑和之前保持一致 */ var signature = CryptoJS.HmacSHA256(hey, api_secret); signatureInBase64 = CryptoJS.enc.Base64.stringify(signature); var passphrase = CryptoJS.HmacSHA256(api_passphrase, api_secret); passphraseInBase64 = CryptoJS.enc.Base64.stringify(passphrase); var headers = { "KC-API-SIGN": signatureInBase64, "KC-API-TIMESTAMP": now, "KC-API-KEY": api_key, "KC-API-PASSPHRASE": passphraseInBase64, "KC-API-KEY-VERSION": "2" } // 正确的URL,不要额外拼接方法和请求体 var url = burl + endPointOrder; $.ajax({ headers: headers, type: "POST", url: url, // 传递请求体,指定正确的内容类型 data: orderParamsStr, contentType: 'application/json', dataType: "json", success: function (data) { console.log(data); }, error: function(err) { console.log(err.responseJSON); } });
注意:如果后续出现时间戳相关报错,可以调整timestamp的取值,KuCoin允许timestamp和服务器时间差在3秒以内。
内容的提问来源于stack exchange,提问作者Steven Steggles
相关产品推荐
相关产品推荐

