Binance API - Подпись для этого запроса недействительна

Я пытаюсь получить доступ к своей учетной записи binance через 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; }
  }

В основном я просто пытаюсь воспроизвести решение здесь. Однако я всегда получаю Подпись на этот запрос недействительный ответ.

URI ответа выглядит правильно (отметка времени и подпись в конце в соответствии с FAQ здесь)

У кого-нибудь есть идеи, что я делаю не так? спасибо за любую помощь!


person dunkleosteus    schedule 03.03.2021    source источник


Ответы (1)


хорошо, ошибка была в этой строке:

signature = signature.Substring(0, signature.Length - 2);

Это удалило последний символ отметки времени, поэтому оно должно быть:

signature = signature.Substring(0, signature.Length - 1);

Так что, если кому-то нужен простой и рабочий пример Binance API на C #, вот снова полный рабочий код:

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; }
  }
person dunkleosteus    schedule 03.03.2021