将 Python/JS 翻译成 Java - JSON & HMAC
Posted
技术标签:
【中文标题】将 Python/JS 翻译成 Java - JSON & HMAC【英文标题】:Translating Python/JS to Java - JSON & HMAC 【发布时间】:2018-02-08 10:00:31 【问题描述】:我正在尝试将以下 Python 示例转换为 Java 代码,但在我创建的 HTTP 帖子和/或 HMAC 签名的格式方面出现错误。如果有人能指出我可能做错的部分,那将非常有帮助。谢谢!
原始 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()
原始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);
);
我的 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;
它返回以下消息: "errorCode":"130","errorMessage":"V2 API Nonce 值必须为正整数","result":"error"
但是这个消息似乎是一个通用消息——当输入其他 nonce 值时,它也返回相同的消息
【问题讨论】:
显示您遇到的错误。 不要描述消息。显示任何消息的确切文本,让您相信它不起作用!。即使您认为它没有帮助,请记住,您不知道如何解决问题,因此您可能不是判断哪些信息有用的最佳人选。 你的 JS 代码甚至不是 JS。是蟒蛇 尝试颠倒参数的顺序(针对您的请求),第一个应该是 http 请求方法,然后是 url。 sry 最初附加了一个 python 代码而不是 js。 JS在问题中更新了 【参考方案1】:您的message(payload)
和hash(signature)
错误...
例子:
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;
【讨论】:
以上是关于将 Python/JS 翻译成 Java - JSON & HMAC的主要内容,如果未能解决你的问题,请参考以下文章
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)
将 mongodb 聚合查询翻译成 Java/Kotlin Spring Data