有时候在请求第三方接口的时候,需要将属性根据ASCII码排序并使用sha56_Hmac加密组合成url,本文将描述一下过程,并且给广大码农提供一个思路
public class Test {
@Test
public void getCoinInfo() {
//TreeMap会根据key对应的ASCII码进行排序,默认:升序
Map<String, Object> params = new TreeMap<>();
params.put("属性一", 1);
params.put("属性二", 2);
params.put("属性三", 3);
//这时,就可以用urlParam去请求第三方接口了
String urlParam = getUrlParam(params);
System.out.println(result);
}
public static String getUrlParam(Map<String, Object> params) {
StringBuilder result = new StringBuilder();
if (params != null) {
for (String key : params.keySet()) {
Object value = params.get(key);
//效果:属性一:1,属性二:2,
result.append(key).append(":").append(value).append(",");
}
String tempString = result
try {
//参数一:要加密的数据 参数二:用于生成消息摘要的HMAC变体的共享密钥 最后转换为大写
String sign = sha256_HMAC(tempString, SECRET).toUpperCase();
//将加密后的数据添加到属性后边
result.append("sign").append(":").append(sign);
} catch (Exception e) {
e.printStackTrace();
}
}
//这时,返回的字符串就是根据ASCII码排序并使用sha56_Hmac加密后的数据
return result.toString();
}
/**
* sha56_Hmac加密
* @param message 要加密的数据
* @param secret 用于生成消息摘要的HMAC变体的共享密钥
* @return
* @throws Exception
*/
public static String sha256_HMAC(String message, String secret) throws Exception{
Mac mac = Mac.getInstance(HmacSHA256);
SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(), HmacSHA256);
mac.init(keySpec);
byte[] bs = mac.doFinal(message.getBytes());
return byte2Hex(bs);
}
}