2013-04-23 50 views
1

我在调用MTGox HTTP API P2时遇到了问题。 我写了一个sendrequest函数来处理所有的请求。 它适用于MONEY/INFO或MONEY/ORDERS,但当我尝试方法MONEY/ORDER/QUOTE或MONEY/ORDER/ADD时,会出现500内部服务器错误。使用MTGOX API的内部服务器

它似乎是当post_data包含除nonce以外的任何东西时,它会出错。 我需要做些什么来解决这个问题?

sendRequest函数也:

private string sendRequest(string action, NameValueCollection query) 
    { 

     NameValueCollection nvc = new NameValueCollection(); 
     nvc.Add("nonce", DateTime.Now.Ticks.ToString()); 
     nvc.Add(query); 

     String post_data = ""; 
     for (int i = 0; i < nvc.Count; i++) 
     { 
      post_data += "&"; 
      post_data += nvc.Keys[i]; 
      post_data += "="; 
      post_data += nvc[i]; 
     } 
     post_data = post_data.Substring(1); 


     action = "BTCEUR/money/" + action; 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sBasePath + action); 
     action += "\0"+post_data; 
     req.Method = "POST"; 

     HMACSHA512 hmac = new HMACSHA512(GetBytes(action)); 
     hmac.Key = Convert.FromBase64String(secret); 
     String sign = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(action)), Base64FormattingOptions.None); 


     req.Headers.Add("Rest-Key", apikey); 
     req.Headers.Add("Rest-Sign", sign); 

     req.UserAgent = "Mozilla/4.0 (compatible; MtGoxTradeCLI)"; 
     req.ContentType = "application/x-www-form-urlencoded"; 

     StreamWriter reqStream = new StreamWriter(req.GetRequestStream()); 
     reqStream.Write(post_data); 
     reqStream.Close(); 

     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

     StreamReader respStream = new StreamReader(resp.GetResponseStream()); 
     String response = respStream.ReadToEnd(); 
     respStream.Close(); 

     return response; 
    } 

回答

0

确保您的签名现时是最后在你的签名是需要PARAMS任何要求,例如钱/钱包/历史与货币USD您的签名应该是:

money/wallet/history\0currency=USD&nonce=xxxxxxxxxx 

(的\ 0是一个空字符,以防万一你想知道)

此外,MtGox的API似乎是在现在助焊剂 - 例如,对于钱包的历史上面,我们习惯称之为:

BTCUSD/money/wallet/history 

的API端点,不过这似乎不再工作。现在我们拨打:

money/wallet/history 

因此,如果过去为你工作的呼叫现在失败了,那么也请看看。但我可以肯定地告诉你,将你的随机数作为QS中的最后一个参数用于签名是至关重要的,否则你的API调用将不再起作用。

我还建议在MtGox中重新创建一个新的API密钥 - 我们必须这样做才能使代码正常工作。我有一个预感,这是因为MtGox最近的API更改已经使旧的密钥无效(可能会继续在海湾交易机器人,而他们弄清楚如何处理它们而不会让机器人杀死他们的API)

+0

感谢您的回答。但不幸的是,它并没有帮助我。 我试着改变参数顺序,以使nonce最后一次,尝试BTCEUR/money/...和money/...,创建一个新的API密钥,但仍然得到500内部服务器错误。 我的其他API调用仍然可以与您提到的几点不同。 – 2013-04-24 09:26:00