【问题标题】:Binance API - "Signature for this request is not valid"Binance API - “此请求的签名无效”
【发布时间】:2021-03-03 11:27:03
【问题描述】:

我正在尝试通过 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 看起来是正确的(根据常见问题解答 here 末尾的时间戳和签名)

有人知道我做错了什么吗?感谢您的帮助!

【问题讨论】:

    标签: c# rest binance


    【解决方案1】:

    好的,错误是这一行:

    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; }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多