我收到 403 错误,所以我知道它可能与身份验证有关,但我似乎无法弄清楚。我一直在遵循网站https://bitbucket.org/nitrous/mtgox-api/overview上的指示,但无济于事。据我所知,协议是:
- 取你的请求的路径(应该看起来像
BTCUSE/money/info
什么),然后是 null 字符\0
,然后是你的 post 参数,并将它们组合成一个字符串。 - 从 base 64 解码密钥
- 使用hmac sha512,上面的字符串作为消息,秘钥作为秘钥,运行hmac算法得到签名。
- 将整个事情编码回base64
所以在这个阶段,我有
params: "nonce=1375719059438000"
message: "BTCUSD/money/info nonce=1375719059438000"
所以我只是想进行一个信息调用,除了随机数之外不需要任何参数。因此,正如文档所述,我将请求属性“rest-key”设置为我的 apikey,并将“rest-sign”设置为我的签名,然后完成帖子。但我收到了 403 响应。我在这个网站上遇到的几个问题,我在论坛上看到过,但从未得到回答是
- 在 post 参数上使用 urlencode 有什么问题?我需要这样做吗?在我见过的所有例子中,他都这样做了,但我从未见过任何说你必须这样做的东西,而且
- 我的空字符正确吗?因为我已经按照说明进行了操作,但是在我刚刚给出的页面上的示例中,他的消息字符串中仍然包含
\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()
当然遇到了错误。