使用C#完成OKex V5 REST API簽名


本文介紹了OKex V5 REST API簽名規則,並使用C#實現了簽名。在Demo中使用Flurl.Http類庫進行HTTP請求,介紹了使用只讀API和交易API獲取數據的方法。

比較遺憾的是,國內網絡是無法訪問該API的。

1、簽名介紹

OK-ACCESS-SIGN的請求頭是對timestamp + method + requestPath + body字符串(+表示字符串連接),以及SecretKey,使用HMAC SHA256方法加密,通過Base-64編碼輸出而得到的。

如:sign=CryptoJS.enc.Base64.Stringify(CryptoJS.HmacSHA256(timestamp + 'GET' + '/users/self/verify', SecretKey))

其中,timestamp的值與OK-ACCESS-TIMESTAMP請求頭相同,為ISO格式,如2020-12-08T09:08:57.715Z。

method是請求方法,字母全部大寫:GET/POST。

requestPath是請求接口路徑。如:/api/v5/account/balance

body是指請求主體的字符串,如果請求沒有主體(通常為GET請求)則body可省略。如:{"instId":"BTC-USDT","lever":"5","mgnMode":"isolated"}

SecretKey為用戶申請APIKey時所生成。如:22582BD0CFF14C41EDBF1AB98506286D

2、簽名實現

//OKEx V5 API簽名
public static string HmacSha256(string message, string secret)
{
    var sha256Data = Encoding.UTF8.GetBytes(message);
    var secretData = Encoding.UTF8.GetBytes(secret);
    using (var hmacSha256 = new HMACSHA256(secretData))
    {
        var buffer = hmacSha256.ComputeHash(sha256Data);
        return Convert.ToBase64String(buffer);
    }
}

3、異步獲取所有產品行情信息

該API僅需要只讀權限。

//異步獲取所有產品行情信息
public async Task<Tuple<bool, object>> GetOkexTickerssAsync(
    string apiKey, string secretKey, string passPhrase)
{
    //產品類型
    //SPOT:幣幣
    //SWAP:永續合約
    //FUTURES:交割合約
    //OPTION:期權
    var api = "/api/v5/market/tickers?instType=SWAP";

    //ISO8601 with 3 decimal places
    var timeStamp = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK", CultureInfo.InvariantCulture);
    var signText = $@"{timeStamp}GET{api}";
    var sign = HmacHelper.HmacSha256(signText, secretKey);

    var url = $"https://www.okex.com{api}"
        .WithHeader("Content-Type", "application/json")
        .WithHeader("OK-ACCESS-KEY", apiKey)
        .WithHeader("OK-ACCESS-SIGN", sign)
        .WithHeader("OK-ACCESS-TIMESTAMP", timeStamp)
        .WithHeader("OK-ACCESS-PASSPHRASE", passPhrase);

    try
    {
        var content = await url.GetStringAsync();
        return new Tuple<bool, object>(true, content);
    }
    catch (Exception e)
    {
        return new Tuple<bool, object>(false, e.Message);
    }
}

4、異步獲取成交明細(近三個月)

該API需要交易權限。

//異步獲取成交明細(近三個月)
public async Task<Tuple<bool, object>> GetOkexFillHistoryAsync(
    string apiKey, string secretKey, string passPhrase)
{
    //產品類型
    //SPOT:幣幣
    //MARGIN:幣幣杠桿
    //SWAP:永續合約
    //FUTURES:交割合約
    //OPTION:期權
    var api = "/api/v5/trade/fills-history?instType=SPOT";

    //ISO8601 with 3 decimal places
    var timeStamp = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK", CultureInfo.InvariantCulture);
    var signText = $@"{timeStamp}GET{api}";
    var sign = HmacSha256(signText, secretKey);

    var url = $"https://www.okex.com{api}"
        .WithHeader("Content-Type", "application/json")
        .WithHeader("OK-ACCESS-KEY", apiKey)
        .WithHeader("OK-ACCESS-SIGN", sign)
        .WithHeader("OK-ACCESS-TIMESTAMP", timeStamp)
        .WithHeader("OK-ACCESS-PASSPHRASE", passPhrase);

    try
    {
        var content = await url.GetStringAsync();
        return new Tuple<bool, object>(true, content);
    }
    catch (Exception e)
    {
        return new Tuple<bool, object>(false, e.Message);
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM