如何使用KuCoin API发出Javascript POST请求?

问题描述 投票:0回答:3

我正在尝试构建一个使用 KuCoin API 的 javascript/jQuery 脚本。我特别尝试从浏览器控制台使用 KuCoin API,而不是从 Node JS 或本地文件。

我在 Kucoin API 方面取得了一些成功,我可以发出签名的 REST GET 请求,但我无法让我的 REST POST 请求正常工作。这是我的代码:

// VARIABLES
var burl = 'https://cors-anywhere.herokuapp.com/https://api.kucoin.com'
var api_key = "xxx"
var api_secret = "xxx"
var api_passphrase = "xxx"
var endPointAccount = '/api/v1/accounts';
var endPointOrder = '/api/v1/orders';

// REST (Account)
// This signed GET request works
var now = Date.now();
var hey = now + "GET" + endPointAccount

/* signature */
var signature = CryptoJS.HmacSHA256(hey, api_secret);
var signatureInBase64 = CryptoJS.enc.Base64.stringify(signature);

/* passphrase */
var passphrase = CryptoJS.HmacSHA256(api_passphrase, api_secret);
var 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"
}

var url = burl + endPointAccount;
$.ajax({
    type: 'GET',
    url: url,
    headers: headers,
    dataType: 'json',
    success: function (data) {
        console.log(data);
    }
});


// REST (Order Limit BUY)
var now = Date.now().toString();
var hey = now + 'POST/api/v1/orders{"clientOid":"ADAUSDT","side":"buy","symbol":"ADA-USDT","price":"0.001","size":"50000"}';

/* signature */
var signature = CryptoJS.HmacSHA256(hey, api_secret);
signatureInBase64 = CryptoJS.enc.Base64.stringify(signature);

/* passphrase */
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"
}

var url = burl + 'POST/api/v1/orders{"clientOid":"ADAUSDT","side":"buy","symbol":"ADA-USDT","price":"0.001","size":"50000"}';
$.ajax({
    headers: headers,
    type: "POST",
    url: url,
    dataType: "json",
    success: function (data) {
        console.log(data);
    }
});

我的 POST 请求总是收到以下错误: 代码:'400005',消息:'无效的 KC-API-SIGN'

有人知道我做错了什么吗?

谢谢, 史蒂夫

javascript json api rest kucoin
3个回答
0
投票

我也有同样的问题。首先,在要签名的字符串中,必须包含方法。然后你需要定义一个主体。如果没有主体,您应该传递 body=""。然后你必须将 Date.now() 解析为字符串。例如:

var now = Date.now().toString();
var hey = now + method + url + body;

写完这篇文章后,我看到你已经在 url 中包含了该方法,所以这也很好。

旁注:我没有使用 CryptoJS。我使用了node.js的加密模块。


0
投票

如果你使用 NodeJs,这里是解决这个问题的步骤。

  1. NPM 安装 crypto-js

  2. 将其导入到您将使用的文件以及 axios 中,然后使用下面的代码片段。

    const axios = require("axios");
    const CryptoJS = require("crypto-js");
    
    class Authenticator {
    
    async signRequest(payload) {
    
        let { method, url, body, api_secret, api_passphrase, api_key } = payload
    
        try {
    
            const now = Date.now().toString();
    
            let queryStringPost = now + method + url + JSON.stringify(body);
            let queryStringGET = now + method + url;
    
            let queryString = method == "POST" ? queryStringPost : queryStringGET;
    
            console.log({queryString});
    
            /* signature */
            const signature = CryptoJS.HmacSHA256(queryString, api_secret);
            const signatureInBase64 = CryptoJS.enc.Base64.stringify(signature);
    
            /* passphrase */
            const passphrase = CryptoJS.HmacSHA256(api_passphrase, api_secret);
            const passphraseInBase64 = CryptoJS.enc.Base64.stringify(passphrase);
    
            const fullUrl = `${process.env.KUCOIN_BASE_URL}${url}`
    
            console.log({fullUrl});
    
            if(method == "POST"){
                const responseFromKucoin = await axios.post(fullUrl, body, {
                    headers: {
                        "KC-API-SIGN": signatureInBase64,
                        "KC-API-TIMESTAMP": now,
                        "KC-API-KEY": api_key,
                        "KC-API-PASSPHRASE": passphraseInBase64,
                        "KC-API-KEY-VERSION": "2"
                    },
                })
    
                const resp = responseFromKucoin.data
    
                console.log({ resp });
            }else{
                const responseFromKucoin = await axios.get(fullUrl,{
                    headers: {
                        "KC-API-SIGN": signatureInBase64,
                        "KC-API-TIMESTAMP": now,
                        "KC-API-KEY": api_key,
                        "KC-API-PASSPHRASE": passphraseInBase64,
                        "KC-API-KEY-VERSION": "2"
                    },
                })
    
                const resp = responseFromKucoin.data
    
                console.log({ resp });
    
                return resp;
            }
    
    
    
        } catch (err) {
            console.log({err});
        }
    }
    
    }
    
    
    module.exports = Authenticator
    

我向全班提出的请求示例。

const create = await new Kucoin().signRequest({
            method:"POST",
            url:"/api/v1/orders",
            body:{"clientOid":"ETHUSDT", side:"buy", symbol:"ETH-USDT", type:"market", size:"2000"},
            api_secret:process.env.KUCOIN_API_SECRET,
            api_passphrase:process.env.KUCOIN_PASSPHRASE,
            api_key:process.env.KUCOIN_API_KEY,  
        })

0
投票

问题是您在标头中错过了 Content-Type:application/json :)

© www.soinside.com 2019 - 2024. All rights reserved.