Вызов BitFinex API возвращает 400 неверных запросов

Попытка получить аутентификацию с BitFinex для работы. Документы здесь: https://www.bitfinex.com/pages/api

Скажем, клиент хочет сделать запрос на POST

https://api.bitfinex.com/v1/order/новый

С полезной нагрузкой{ "request":"/v1/order/new", "nonce": "1234", "option1": ... }

Предоставленный одноразовый номер должен строго увеличиваться.

Для аутентификации запроса используйте следующее:

payload = parameters-dictionary -> JSON encode -> base64 
signature = HMAC-SHA384(payload, api-secret) as hexadecimal 
send (api-key, payload, signature) 

Они кодируются как заголовки HTTP с именами: X-BFX-APIKEY X-BFX-PAYLOAD X-BFX-SIGNATURE.

Вот код C#, который следует приведенному выше примеру, но генерирует неверный запрос HTTP 400. Есть идеи как исправить?

        long nonce = DateTime.Now.ToUnixTimestampMS(); //returns a strictly increasing timestamp based number e.g. 1402207693893

        string path = "https://api.bitfinex.com/v1/balances";
        string paramDict = "{\"request\": \"/v1/balances\",\"nonce\": \"" + nonce + "\"}"; //ie. {"request": "/v1/balances","nonce": "1402207693893"}
        string payload = Convert.ToBase64String(Encoding.UTF8.GetBytes(paramDict));

        //API Sign
        HMACSHA384 hmac = new HMACSHA384(Encoding.UTF8.GetBytes(APISECRET));           //My API SECRET
        byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
        string hexHash = BitConverter.ToString(hash).Replace("-", "");

        NameValueCollection headers = new NameValueCollection();
        headers.Add("X-BFX-APIKEY", APIKEY);                                            //My API KEY
        headers.Add("X-BFX-PAYLOAD", payload);
        headers.Add("X-BFX-SIGNATURE", hexHash);

        //POST data
        try
        {
            //create post request
            HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(path);
            request.KeepAlive = true;
            request.Method = "POST";

            //add headers
            request.Headers.Add(headers);

            //write out payload
            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(paramDict);
            request.ContentLength = byteArray.Length;
            using (var writer = request.GetRequestStream()){writer.Write(byteArray, 0, byteArray.Length);}

            //read reply
            using (var response = request.GetResponse() as System.Net.HttpWebResponse)
            {
                using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    //get reply (JSON)
                    string responseContent = reader.ReadToEnd();
                }
            }
        }
        catch (Exception e)
        {
            //always throws an exception here
            Debug.WriteLine(e.Message);
        }

Ответы (1)

Наконец обнаружил исправление: шестнадцатеричный хэш должен быть в нижнем регистре:

string hexHash = BitConverter.ToString(hash).Replace("-", "").ToLower();
Такой странный API... Спасибо за ваш вопрос и (самостоятельный) ответ
У меня такая же проблема в питоне, но шестнадцатеричный дайджест уже в нижнем регистре...
Вы когда-нибудь получали заказ / новый для работы? Я все еще получаю плохой запрос, несмотря на то, что другие вызовы, такие как балансы и т. Д., Работают правильно.