简体   繁体   English

将Python / JS转换为Java-JSON和HMAC

[英]Translating Python/JS to Java - JSON & HMAC

I am trying to translate the following Python example into Java code, but was getting an error around the format of the HTTP post and/or the HMAC signature I have created. 我试图将以下Python示例转换为Java代码,但在我创建的HTTP帖子和/或HMAC签名的格式周围出现错误。 If anyone could point at which part I could have possibly done wrong, it would be super helpful. 如果有人指出我可能做错了哪一部分,那将非常有帮助。 Thank you! 谢谢!

Original Python example: 原始的Python示例:

    PAYLOAD = {
      "access_token": ACCESS_TOKEN,
      "price": 500000,
      "qty": 0.1,
      "currency", "btc"
    }

    def get_encoded_payload(payload):
      payload[u'nonce'] = int(time.time()*1000)

      dumped_json = json.dumps(payload)
      encoded_json = base64.b64encode(dumped_json)
      return encoded_json

    def get_signature(encoded_payload, secret_key):
      signature = hmac.new(str(secret_key).upper(), str(encoded_payload), hashlib.sha512);
      return signature.hexdigest()

    def get_response(url, payload):
      encoded_payload = get_encoded_payload(payload)
      headers = {
        'Content-type': 'application/json',
        'X-COINONE-PAYLOAD': encoded_payload,
        'X-COINONE-SIGNATURE': get_signature(encoded_payload, SECRET_KEY)
      }
      http = httplib2.Http()
      response, content = http.request(URL, 'POST', headers=headers, body=encoded_payload)
      return content

    def get_result():
      content = get_response(URL, PAYLOAD)
      content = json.loads(content)

      return content

    if __name__   == "__main__":
        print get_result()

Original JS example: 原始JS示例:

    var crypto = require('crypto');
var request = require('request');
var ACCESS_TOKEN = '';
var SECRET_KEY = '';
var url = 'https://api.coinone.co.kr/v2/order/limit_buy/';
  var payload = {
  "access_token": ACCESS_TOKEN,
  "price": 500000,
  "qty": 0.1,
  "currency": "btc",
  "nonce": Date.now()
};

payload = new Buffer(JSON.stringify(payload)).toString('base64');

var signature = crypto
  .createHmac("sha512", SECRET_KEY.toUpperCase())
  .update(payload)
  .digest('hex');

var headers = {
  'content-type':'application/json',
  'X-COINONE-PAYLOAD': payload,
  'X-COINONE-SIGNATURE': signature
};

var options = {
  url: url,
  headers: headers,
  body: payload
};

request.post(options,
  function(error, response, body) {
    console.log(body);
});

My code in Java: 我的Java代码:

    long nonce = (new Date()).getTime();
    JSONObject json = new JSONObject();
    json.put("currency", "BTC");
    json.put("price", 3000000);
    json.put("qty", 0.01);
    json.put("access_token", publicKey);
    json.put("nonce", nonce);

    System.out.println(json.toString());

    Client client = ClientBuilder.newClient();
    Entity<String> payload = Entity.json(json.toString());
    String message = json.toString(); 
    Response response = client.target(baseAddress+apiAddress)
      .request(MediaType.APPLICATION_JSON_TYPE)
      .header("content-type", "application/json")
      .header("accept", "application/json")
      .header("X-COINONE-PAYLOAD", payload)
      .header("X-COINONE-SIGNATURE", CreateToken(message, privateKey.toUpperCase()))
      .post(payload);

    String body = response.readEntity(String.class);
    System.out.println(body);

    ///////////
    private static String CreateToken(String message, String secretKey)
{
    String hash = "";
    try {    

        Mac sha512_HMAC = Mac.getInstance("HmacSHA512");
        SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA512");
        sha512_HMAC.init(secret_key);

        hash = Base64.encodeBase64String(sha512_HMAC.doFinal(message.getBytes()));

    }
    catch (Exception e){
        System.out.println("Error");
    }
    System.out.println(hash);
    return hash;
}

It returns the following message: {"errorCode":"130","errorMessage":"V2 API Nonce value must be a positive integer","result":"error"} 它返回以下消息:{“ errorCode”:“ 130”,“ errorMessage”:“ V2 API Nonce值必须为正整数”,“ result”:“ error”}

But this message seems to be a generic one - when input other nonce values, it also returns the same message 但是此消息似乎是通用消息-当输入其他现时值时,它也会返回相同的消息

Your message(payload) and hash(signature) are wrong... 您的message(payload)hash(signature)是错误的...

Example: 例:

String payload = Base64.encodeBase64String(message.getBytes("UTF-8"));
String signature = CreateToken(payload, key.toUpperCase());

---------
private static String CreateToken(String message, String secretKey){
String hash = "";
try {    

    Mac sha512_HMAC = Mac.getInstance("HmacSHA512");
    SecretKeySpec secret_key = new SecretKeySpec(secretKey.getBytes(), "HmacSHA512");
    sha512_HMAC.init(secret_key);

// hash = Base64.encodeBase64String(sha512_HMAC.doFinal(message.getBytes()));
hash = Hex.encodeHexString(sha512_HMAC.doFinal(message.getBytes()));

}
catch (Exception e){
    System.out.println("Error");
}
System.out.println(hash);
return hash;

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM