1

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

  1. 取你的请求的路径(应该看起来像BTCUSE/money/info什么),然后是 null 字符\0,然后是你的 post 参数,并将它们组合成一个字符串。
  2. 从 base 64 解码密钥
  3. 使用hmac sha512,上面的字符串作为消息,秘钥作为秘钥,运行hmac算法得到签名。
  4. 将整个事情编码回base64

所以在这个阶段,我有

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

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

  1. 在 post 参数上使用 urlencode 有什么问题?我需要这样做吗?在我见过的所有例子中,他都这样做了,但我从未见过任何说你必须这样做的东西,而且
  2. 我的空字符正确吗?因为我已经按照说明进行了操作,但是在我刚刚给出的页面上的示例中,他的消息字符串中仍然包含\0,我会让我相信他实际上是\通过放入\\0字符串而不是\0. 有任何想法吗?如果您认为将我的代码发布在堆栈溢出上会更好,请告诉我。

这是我提出请求的代码:

    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()当然遇到了错误。

4

0 回答 0