403尝试向MtGox api发布请求时的响应

时间:2013-08-05 16:50:22

标签: java mtgox

我收到403错误,所以我知道它可能与身份验证有关,但我似乎无法弄明白。我一直在关注网站https://bitbucket.org/nitrous/mtgox-api/overview上的指示,但无济于事。据我所知,该协议是:

  1. 获取您的请求的路径(应该看起来像BTCUSE/money/info或其他内容),后跟空字符\0,然后是您的帖子参数,并将它们组合成一个字符串。
  2. 解码来自base 64的密钥
  3. 使用hmac sha512,上面的字符串作为消息,并使用密钥作为密钥,运行hmac算法来提出签名。
  4. 将整个事情编码回base64
  5. 所以在这个阶段,我有

    params:  "nonce=1375719059438000"
    message: "BTCUSD/money/info nonce=1375719059438000"
    

    所以我只是尝试进行信息调用,除了nonce之外不需要任何参数。因此,正如文档所述,我将请求属性“rest-key”设置为我的apikey并“rest-sign”到我的签名,然后完成帖子。但是我收到了403回复。我从这个网站得到的几个问题以及我在论坛中看到但从未得到过回答的问题是

    1. 在帖子参数上使用urlencode有什么处理?我需要这样做吗?他在我见过的所有例子中都做到了这一点,但我从未见过任何说你必须这样做的事情,并且
    2. 我的空字符是否正确?因为我已按照说明进行操作,但在我刚给出的页面上的示例中,他的消息字符串仍然包含\0,我会让我相信他实际上是在逃避\\\0放入字符串中,而不是\0。有任何想法吗?如果您认为在堆栈溢出时发布我的代码会更好,请告诉我。
    3. 以下是我提出请求的代码:

          public String queryMtGox(String method, HashMap<String, String> args) throws    
          IllegalStateException{
                  String path = "BTCUSD/money/" + method;
          try {
          String nonce =  String.valueOf(System.currentTimeMillis())+"000";
              String post_data = this.buildMtGoxQueryString(args);
              if (post_data.contentEquals("")){
                  post_data+="nonce="+nonce;
              }else post_data+="&nonce="+nonce;
              String message = path +"\0"+post_data;
              // args signature
              Mac mac = Mac.getInstance("HmacSHA512");
              SecretKeySpec secret_spec = new           
          SecretKeySpec(Base64.decodeBase64(this.goxsecret), "HmacSHA512");
              mac.init(secret_spec);
              String signature = Base64.encodeBase64String(mac.doFinal(message.getBytes()));
      
              // build URL
              URL queryUrl = new URL("https://data.mtgox.com/api/2/" + path);
      
              // create connection
              HttpsURLConnection connection = (HttpsURLConnection)queryUrl.openConnection();
              connection.setDoOutput(true);
              connection.setDoInput(true);
      
              connection.setRequestMethod("POST");
      
              connection.setRequestProperty("Rest-Key", this.goxkey);
              connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; 
          MtGoxTradeCLI)");
              connection.setRequestProperty("Content-Type","application/x-www-form-
          urlencoded");
              connection.setRequestProperty("Rest-Sign", signature.replaceAll("\n", ""));
      
              // write post
               DataOutputStream outdata = new DataOutputStream(connection.getOutputStream());
                       outdata.write(post_data.getBytes());
                       outdata.close();
                       connection.disconnect();
              int len;
              // read inf
      
              byte buffer[] = new byte[16384];
      
               len = connection.getInputStream().read(buffer, 0, 16384);
      
              System.out.print(new String(buffer, 0, len, "UTF-8"));
          } catch (Exception ex) {
              Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
          }
          return "foo";
          }
      

      我当然在getInputStream()收到错误。

0 个答案:

没有答案