string url = @"https://api.bitfinex.com/v1/balances";
string paramDict = "{\"request\": \"/v1/balances\",\"nonce\": \"" + GetNonce() * 10000 + "\"}";
string payload = Convert.ToBase64String(Encoding.ASCII.GetBytes(paramDict));
string signature = BitConverter.ToString(hmac.ComputeHash(Encoding.ASCII.GetBytes(payload))).Replace("-","").ToLower();
var headers = new Dictionary<string, string>
{
{"X-BFX-APIKEY",key},
{"X-BFX-PAYLOAD",payload},
{"X-BFX-SIGNATURE",signature}
};
var request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
if (request == null)
throw new Exception("Non HTTP WebRequest");
var data = System.Text.Encoding.ASCII.GetBytes(paramDict);
request.Method = "POST";
request.Timeout = 30000;
request.ContentLength = data.Length;
foreach (var a in headers)
{
request.Headers.Add(a.Key, a.Value);
}
var write = request.GetRequestStream();
write.Write(data, 0, data.Length);
var respone = request.GetResponse() as HttpWebResponse;
Это мой код. Может быть, вы видите, где я сделал ошибку. Как по мне, нормально сделано API.
Когда я запускаю этот код, он возвращает код ошибки HTTP 400.
string Query()
{
string url = "https://api.bitfinex.com/v1/balances";
string paramDict = "{\"request\":\"\\/v1\\/balances\",\"nonce\":\"" + GetNonce() * 100000 + "\"}";
string payload = EncodeTo64(paramDict);
string message = payload;
string skey = secret;
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(skey);
HMACSHA384 hmacsha384 = new HMACSHA384(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacsha384.ComputeHash(messageBytes);
string signature = this.ByteToString(hashmessage);
var headers = new Dictionary<string, string>
{
{"X-BFX-APIKEY",key},
{"X-BFX-PAYLOAD",payload},
{"X-BFX-SIGNATURE",signature}
};
var request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
if (request == null)
throw new Exception("Non HTTP WebRequest");
var data = encoding.GetBytes(paramDict);
request.Method = "POST";
request.Timeout = 30000;
request.ContentLength = data.Length;
foreach (var a in headers)
{
request.Headers.Add(a.Key, a.Value);
}
var write = request.GetRequestStream();
write.Write(data, 0, data.Length);
var respone = request.GetResponse() as HttpWebResponse;
return null;
}
это новый код для исправления ошибки с HMACSHA384
string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}
и еще некоторые исправления.
long GetNonce()
{
return nonce++;
}
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
о, и последнее исправление, чтобы доказать ошибку
string signature = this.ByteToString(hashmessage).ToLower();
Вы получаете ошибку HTTP 400 , что означает, что сервер (по какой-то причине) отказывается обрабатывать ваш запрос. Это может быть связано с неправильным форматированием строки, неправильным или неподдерживаемым форматом заголовков или типом MIME . Возможно, вы захотите более подробно изучить свои заголовки и способ анализа запроса в целом.
Глядя на ваш код, я могу только не заметить "@" в начале объявления строки вашего URL. Я не знаю, намеренно ли это сделано или язык, на котором вы кодируете, требует, чтобы вы использовали его (я мог бы просто поднять флаг там, где это не так), однако я и из чистого личного интереса (но может помочь с проблемой) хотел бы знать, вы кодируете C#? .СЕТЬ? другой?
Юра Султанов
Дуум