Битфинекс 400 ошибка

            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.

Ответы (2)

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#? .СЕТЬ? другой?

Я использую c #, я пробую много типов заголовков, 1-я ошибка была с формированием полезной нагрузки строки hmac = EncodeTo64 (paramDict); строковое сообщение = полезная нагрузка; строка skey = секрет; Кодировка System.Text.ASCIIEncoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(skey); HMACSHA384 hmacsha384 = новый HMACSHA384 (keyByte); byte[] messageBytes = encoding.GetBytes(сообщение); byte[] hashmessage = hmacsha384.ComputeHash(messageBytes); строковая подпись = this.ByteToString(hashmessage);
Я вижу, вы опубликовали ответ на свой вопрос, вам удалось исправить всю проблему и устранить другие ошибки? Вы сейчас получаете 200 OK? Не могу сильно помочь с С#, но я подумал, что хотя бы подкину несколько указателей.