我正在尝试对Bitstamp进行私有REST调用(请参阅https://www.bitstamp.net/api/)。
但是,我得到了以下的共鸣:
{"错误":"缺少密钥,签名和随机数参数"}
在API规范中,他们编写以下内容:
所有私有API调用都需要身份验证。你需要提供3 用于验证请求的参数:
- API密钥
- 现时标志
- 签名
API KEY
要获取API密钥,请转到"帐户","安全"然后" API访问"。 设置权限并单击"生成密钥"。
NONCE
Nonce是一个常规整数。它必须随着每一个增加 请求你。在这里阅读更多相关信息。示例:如果设置nonce 在第一次请求中,您必须将其设置为至少2 第二个请求。你不需要从1.开始 练习是对该参数使用unix时间。
SIGNATURE
签名是HMAC-SHA256编码的消息,包含:nonce,client ID和API密钥。必须使用机密生成HMAC-SHA256代码 使用API密钥生成的密钥。必须转换此代码 它的十六进制表示(64个大写字符)。
我一直在努力解决这个问题,一切似乎都是有序的:使用加密创建签名并转换为HEX,在服务器上激活API访问,API密钥正在按顺序等。联系时Bitstamp他们告诉我API正常工作,我收到的错误通常发生在我的密钥,签名和参数没有到达他们的API时。在坚持了一段时间之后,我现在还没有找到解决这个问题的线索。请帮忙。
我的代码如下
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import org.codehaus.jettison.json.JSONObject;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.DatatypeConverter;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException
public class Connection {
private static WebResource baseResource;
private static final MediaType responseType = MediaType.APPLICATION_JSON_TYPE;
public Connection() throws NoSuchAlgorithmException {
Client client = Client.create();
baseResource = client.resource("https://www.bitstamp.net/api/");
}
public void test() throws NoSuchAlgorithmException, InvalidKeyException {
String nonce_unixTime = String.valueOf(System.currentTimeMillis() / 1000L);
String clientID = "xxx";
String key = "yyy";
String secret = "zzz";
String message = nonce_unixTime + clientID + key;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] hash = sha256_HMAC.doFinal(message.getBytes());
String signature = DatatypeConverter.printHexBinary(hash).toUpperCase();
// Fetch the resource.
JSONObject json = baseResource.path("balance/")
.queryParam("key", key)
.queryParam("signature", signature)
.queryParam("nonce", nonce_unixTime)
.accept(responseType).post(JSONObject.class);
System.out.println(json.toString());
}
}
答案 0 :(得分:1)
这是因为bitstamp在POST的正文中等待params而不是url中的params,因此POST消息的类型必须是MediaType.APPLICATION_FORM_URLENCODED而不是JSONObject.class。