我正在建立一个与加密货币交易所互动的程序,以下达/出售订单等
为了使用Exchange的私有API方法,我必须在HTTP标头中包含一个符号,即邮寄消息主体,使用秘密键加密使用HMACSHA512。
。下面的代码在我的系统中效果很好,但是我的一些用户报告说,当服务器尝试使用某些私有API方法时,服务器总是返回签名错误。
我试图在多个系统设置中重现该错误,但无济于事。
我想知道以下代码的任何部分是否容易在不同的系统设置中使用。
public string SendQuery(string apiKey, string secretKey, string method, string[] param, string url)
{
// nonce
string nonceStr = Utility.CurrentTimeMillis().ToString() + "0000000000";
// generate the POST message
string postString = "method=" + method + "&nonce=" + nonceStr;
if (param != null)
{
foreach (string item in param) postString += "&" + item;
}
byte[] postData = Encoding.ASCII.GetBytes(postString);
// sign POST message
HMACSHA512 hMACSHA512 = new HMACSHA512(Encoding.ASCII.GetBytes(secretKey));
byte[] sign = hMACSHA512.ComputeHash(postData);
string signString = string.Empty;
for (int i = 0; i < sign.Length; i++)
{
signString += sign[i].ToString("X2");
}
signString = signString.ToLower(); // must use lower case
// generate headers
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Add("Key", apiKey);
request.Headers.Add("Sign", signString);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
request.KeepAlive = true;
request.Proxy = null;
request.Method = "POST";
request.Timeout = 5000;
string message = string.Empty;
try
{
using (Stream st = request.GetRequestStream())
st.Write(postData, 0, postData.Length);
Stream responseStream = request.GetResponse().GetResponseStream();
StreamReader objReader = new StreamReader(responseStream);
string line = "";
while (line != null)
{
line = objReader.ReadLine();
if (line != null) message += line;
}
}
catch (Exception ex)
{
}
return message;
}
所以回答我自己的问题,
事实证明,这个问题并不在于我的sendquery方法中,但是称其为double.tostring(" f8"(的函数来产生一个参数值,从而导致小数分离器字符变化,具体取决于本地格式。
例如:
double val = 1000.5;
string str = val.ToString("F8");
取决于格式将产生" 1000.50000000"或" 1000,50000000"。
因此,在使用double.tostring方法时,您必须提供IFORMATPROVIDER参数,或者只是使用肮脏但类似于工程的类似技巧,例如:
ToString("F8").Replace(",", ".");