Binance API HMAC SHA256 签名错误使用 C# [英] Binance API HMAC SHA256 Signature error Using C#
问题描述
我尝试使用 C#
和 RestSharp
库连接到 Binance Api
.基于 文档我应该尝试这样的事情:
I try to connect to the Binance Api
Using C#
And RestSharp
lib. Based on documents I should try something like this:
queryString: symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
queryString: symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559
HMAC SHA256 签名:
HMAC SHA256 signature:
[linux]$ echo -n符号=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559"|openssl dgst -sha256 -hmacNhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"(标准输入)=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71 curl命令:
[linux]$ echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559" | openssl dgst -sha256 -hmac "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j" (stdin)= c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71 curl command:
(HMAC SHA256) [linux]$ curl -H "X-MBX-APIKEY:vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A" -X邮政 https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b28738ad
(HMAC SHA256) [linux]$ curl -H "X-MBX-APIKEY: vmPUZE6mv9SD5VNHk4HlWFsOr6aKE2zvsw0MuIgwCIPy6utIco14y7Ju91duEh8A" -X POST https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559&signature=c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71
我尝试了很多方法和很多堆栈问题,但我找到了适用于其他语言而不是 c# 的解决方案.这是我基于:this和这个
I try many ways and many stack questions but I found solutions for other languages not c#. this i I done based on: this and this
public string GetAccountInfo()
{
long timeStamp = GetTimestamp();
var request = new RestRequest("api/v3/account");
request.AddHeader("X-MBX-APIKEY", ApiKey);
request.AddParameter("timestamp", timeStamp, ParameterType.QueryString);
request.AddParameter("recvWindow", RecvWindow, ParameterType.QueryString);
request.AddParameter("signature", GetSignature(request.Parameters), ParameterType.QueryString);
return Client.Get(request).Content;
}
private long GetTimestamp()
{
return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
}
private string GetSignature(List<Parameter> parameters)
{
var signature = "";
if(parameters.Count > 0)
{
foreach (var item in parameters)
{
if(item.Name != "X-MBX-APIKEY")
signature += $"{item.Name}={item.Value}&";
}
signature = signature.Substring(0, signature.Length - 2);
}
byte[] keyBytes = Encoding.Unicode.GetBytes(ApiSecret);
byte[] valueBytes = Encoding.Unicode.GetBytes(signature);
return HashEncode(HashHMAC(keyBytes, valueBytes));
}
private static byte[] HashHMAC(byte[] key, byte[] message)
{
var hash = new HMACSHA256(key);
return hash.ComputeHash(message);
}
private static string HashEncode(byte[] hash)
{
return BitConverter.ToString(hash).Replace("-", "").ToLower();
}
但我收到此错误:此请求的签名无效.我该如何解决?谢谢.
but I got this error: Signature for this request is not valid. How can I fix it? Thank you.
推荐答案
以下是签名生成的工作示例:
Below is the working example of signature generation:
public static string CreateSignature(string queryString, string secret)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
byte[] queryStringBytes = Encoding.UTF8.GetBytes(queryString);
HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);
byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
queryString
是您在查询中传递的参数字符串,例如timestamp=1586620030079
secret
是你的 api 秘密.
queryString
is your string of parameters passed in query, e.g. timestamp=1586620030079
secret
is your api secret.
需要注意的重要一点是,当您逐步进行调试时,请求会因 Bad Request
响应而失败,因为时间戳超出了接收窗口.
Important thing to note is that request fails with Bad Request
response when you go in debug step by step because timestamp gets outside of recv window.
您还可以发现此 SDK 至少作为工作代码示例非常有用:https://github.com/nathan-alexander/csharp-binance-api
You could also find this SDK very useful at least as working code example: https://github.com/nathan-alexander/csharp-binance-api
这篇关于Binance API HMAC SHA256 签名错误使用 C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!