2013-04-23 1 views
1

У меня проблема с вызовом MTGox HTTP api v2. Я написал функцию sendrequest, чтобы обрабатывать все мои запросы. Он отлично работает для ДЕНЕГ/ИНФО или ДЕНЬГИ/ЗАКАЗОВ, но я получаю 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 является нулевым символом, только в том случае, если вам интересно)

Кроме того, API MtGox, кажется, в флюс прямо сейчас - к примеру, для истории бумажника выше, мы привыкли называть:

BTCUSD/money/wallet/history 

как API конечной точки, но это уже не похоже на работу. Теперь мы называем:

money/wallet/history 

Таким образом, если вызовы, которые используются для работы для вас сейчас не удается, посмотрите на это тоже. Но я могу сказать вам, что наличие вашего nonce в качестве последнего параметра в вашей QS для вашей подписи имеет решающее значение, или ваши вызовы API больше не будут работать.

Я также рекомендую воссоздать новый ключ API в MtGox - мы должны были сделать это, чтобы наш код работал правильно. У меня есть догадка, что это связано с тем, что недавние изменения API MtGox недействительны старыми ключами (вероятно, чтобы блокировать торговые боты, пока они выясняют, как обращаться с ними, не убивая их ботов).

+0

Спасибо за ваш ответ. Но, к сожалению, это мне не помогает. Я попытался изменить порядок параметров, так что последнее приходит не в последнюю очередь, попробовал как BTCEUR/money/..., так и деньги/..., создал новый ключ API, но все же получил ошибку внутреннего внутреннего сервера. Мои другие вызовы API по-прежнему работают отдельно от упомянутых вами моментов. –