2013-04-23 75 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