我正在尝试连接到Poloniex交易API,该文件在此处记录:https://poloniex.com/support/api/

基本上,这描述了一个人需要知道的一切:


  所有对交易API的调用都通过HTTP POST发送到https://poloniex.com/tradingApi,并且必须包含以下标头:
  
  密钥-您的API密钥。
  
  签名-根据HMAC-SHA512方法,由您的键的“秘密”对查询的POST数据进行签名。
  
  此外,所有查询都必须包含“ nonce” POST参数。随机数参数是一个整数,必须始终大于先前使用的随机数。


但是由于某种原因,我得到了错误:无效的命令。我尝试了各种命令,但没有一个起作用。

public static String POLONIEX_SECRET_KEY = "my secret"; //KEY
public static String POLONIEX_API_KEY = "my key"; // TODO API KEY


public static void main(String[] args) {

    try {
        accessPoloniex();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public static final long generateNonce(){

    Date d = new Date();
    return d.getTime();
}

public static final void accessPoloniex() throws IOException{

    String nonce = new BigDecimal(Polo2.generateNonce()).toString();

    String connectionString = "https://poloniex.com/tradingApi";

    String queryArgs = "command=returnBalances";

    String hmac512 = hmac512Digest(queryArgs, POLONIEX_SECRET_KEY);

    // Produce the output
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    Writer writer = new OutputStreamWriter(out, "UTF-8");
    writer.append(queryArgs);


    CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpPost post = new HttpPost(connectionString);

    post.setHeader("Key", POLONIEX_API_KEY);
    post.setHeader("Sign", hmac512);

    post.setEntity(new ByteArrayEntity(out.toByteArray()));
    List<NameValuePair> params = new ArrayList<>();
    params.add(new BasicNameValuePair("nonce", nonce));

    CloseableHttpResponse response = null;
    Scanner in = null;
    try
    {
        post.setEntity(new UrlEncodedFormEntity(params));
        response = httpClient.execute(post);
        // System.out.println(response.getStatusLine());
        HttpEntity entity = response.getEntity();
        in = new Scanner(entity.getContent());
        while (in.hasNext())
        {
            System.out.println(in.next());

        }
        EntityUtils.consume(entity);
    } finally
    {
        in.close();
        response.close();
    }

}

public static String hmac512Digest(String msg, String keyString) {

    Mac shaMac;
    try {
        shaMac = Mac.getInstance("HmacSHA512");
        SecretKeySpec  keySpec = new SecretKeySpec(keyString.getBytes(), "HmacSHA512");

        shaMac.init(keySpec);
        final byte[] macData = shaMac.doFinal(msg.getBytes());
        return Hex.encodeHexString(macData); //again with try/catch for InvalidKeyException

    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    return null;
}


有人在该代码中看到任何问题吗?

最佳答案

我想到了:

我需要将“ queryArgs”设置为“ NameValuePair”,然后才能工作:

params.add(new BasicNameValuePair("command", "returnBalances"));

10-05 22:32