币安 API - "Signature for this request is not valid"
Binance API - "Signature for this request is not valid"
我正在尝试通过 REST API 和 RestSharp 访问我的币安账户。这是我的代码:
public void getaccountdata()
{
string apikey = "myapikey";
string secret = "mysecret";
var client = new RestClient("https://api.binance.com");
request = new RestRequest("/api/v3/time", Method.GET);
response = client.Get(request);
ttime testtime = new ttime();
testtime = JsonConvert.DeserializeObject<ttime>response.Content.ToString());
string timestamp = testtime.serverTime;
request = new RestRequest("/api/v3/account", Method.GET);
request.AddHeader("X-MBX-APIKEY", apikey);
request.AddQueryParameter("recvWindow", "5000");
request.AddQueryParameter("timestamp", timestamp);
request.AddQueryParameter("signature", CreateSignature(request.Parameters, secret));
response = client.Get(request);
System.Diagnostics.Debug.WriteLine(response.Content);
}
public static string CreateSignature(List<Parameter> parameters, string secret)
{
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.UTF8.GetBytes(secret);
byte[] queryStringBytes = Encoding.UTF8.GetBytes(signature);
HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);
byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
public class ttime
{
public string serverTime { get; set; }
}
基本上我只是想复制解决方案 here。但是我总是收到“此请求的签名无效”响应。
响应 URI 看起来正确(根据 FAQ here,最后的时间戳和签名)
有人知道我做错了什么吗?感谢您的帮助!
好的,错误是这一行:
signature = signature.Substring(0, signature.Length - 2);
这删除了时间戳的最后一个字符,所以它应该是:
signature = signature.Substring(0, signature.Length - 1);
因此,如果有人需要用 C# 编写的简单且有效的 Binance API 示例,请再次查看完整的工作代码:
public void getaccountdata()
{
string apikey = "myapikey";
string secret = "mysecret";
var client = new RestClient("https://api.binance.com");
request = new RestRequest("/api/v3/time", Method.GET);
response = client.Get(request);
ttime testtime = new ttime();
testtime = JsonConvert.DeserializeObject<ttime>response.Content.ToString());
string timestamp = testtime.serverTime;
request = new RestRequest("/api/v3/account", Method.GET);
request.AddHeader("X-MBX-APIKEY", apikey);
request.AddQueryParameter("recvWindow", "5000");
request.AddQueryParameter("timestamp", timestamp);
request.AddQueryParameter("signature", CreateSignature(request.Parameters, secret));
response = client.Get(request);
System.Diagnostics.Debug.WriteLine(response.Content);
}
public static string CreateSignature(List<Parameter> parameters, string secret)
{
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 - 1);
}
byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
byte[] queryStringBytes = Encoding.UTF8.GetBytes(signature);
HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);
byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
public class ttime
{
public string serverTime { get; set; }
}
我正在尝试通过 REST API 和 RestSharp 访问我的币安账户。这是我的代码:
public void getaccountdata()
{
string apikey = "myapikey";
string secret = "mysecret";
var client = new RestClient("https://api.binance.com");
request = new RestRequest("/api/v3/time", Method.GET);
response = client.Get(request);
ttime testtime = new ttime();
testtime = JsonConvert.DeserializeObject<ttime>response.Content.ToString());
string timestamp = testtime.serverTime;
request = new RestRequest("/api/v3/account", Method.GET);
request.AddHeader("X-MBX-APIKEY", apikey);
request.AddQueryParameter("recvWindow", "5000");
request.AddQueryParameter("timestamp", timestamp);
request.AddQueryParameter("signature", CreateSignature(request.Parameters, secret));
response = client.Get(request);
System.Diagnostics.Debug.WriteLine(response.Content);
}
public static string CreateSignature(List<Parameter> parameters, string secret)
{
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.UTF8.GetBytes(secret);
byte[] queryStringBytes = Encoding.UTF8.GetBytes(signature);
HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);
byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
public class ttime
{
public string serverTime { get; set; }
}
基本上我只是想复制解决方案 here。但是我总是收到“此请求的签名无效”响应。
响应 URI 看起来正确(根据 FAQ here,最后的时间戳和签名)
有人知道我做错了什么吗?感谢您的帮助!
好的,错误是这一行:
signature = signature.Substring(0, signature.Length - 2);
这删除了时间戳的最后一个字符,所以它应该是:
signature = signature.Substring(0, signature.Length - 1);
因此,如果有人需要用 C# 编写的简单且有效的 Binance API 示例,请再次查看完整的工作代码:
public void getaccountdata()
{
string apikey = "myapikey";
string secret = "mysecret";
var client = new RestClient("https://api.binance.com");
request = new RestRequest("/api/v3/time", Method.GET);
response = client.Get(request);
ttime testtime = new ttime();
testtime = JsonConvert.DeserializeObject<ttime>response.Content.ToString());
string timestamp = testtime.serverTime;
request = new RestRequest("/api/v3/account", Method.GET);
request.AddHeader("X-MBX-APIKEY", apikey);
request.AddQueryParameter("recvWindow", "5000");
request.AddQueryParameter("timestamp", timestamp);
request.AddQueryParameter("signature", CreateSignature(request.Parameters, secret));
response = client.Get(request);
System.Diagnostics.Debug.WriteLine(response.Content);
}
public static string CreateSignature(List<Parameter> parameters, string secret)
{
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 - 1);
}
byte[] keyBytes = Encoding.UTF8.GetBytes(secret);
byte[] queryStringBytes = Encoding.UTF8.GetBytes(signature);
HMACSHA256 hmacsha256 = new HMACSHA256(keyBytes);
byte[] bytes = hmacsha256.ComputeHash(queryStringBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
public class ttime
{
public string serverTime { get; set; }
}