在公众号或者小程序开发中,无论是微信小程序,百度小程序还是支付宝小程序开发,涉及到的很多官方sdk接口调用,都需要有接口权限,而这些接口权限的获取都要对接口参数做特殊处理后再加密签名,才有接口权限,比如小程序API里面的多媒体接口(上传,下载等),支付接口,统一下单接口等。下面直接上代码
/**
* MD5 加密,转为指定类型
*
* @param text
* @param key
* @param input_charset
* @return
*/
public static String sign(String text, String key, String input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
/**
* SHA-1 加密,转为指定类型
*
* @param text
* @param input_charset
* @return
*/
public static String signBySHA(String text, String input_charset) {
String signature = null;
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(text.getBytes(input_charset));
signature = byteToHex(crypt.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("SHA-1签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + input_charset);
}
return signature;
}
//十六进制字节数组转为字符串
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String preStr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if ("sign".equals(key)) {
continue;
}
if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
preStr = preStr + key + "=" + value;
} else {
preStr = preStr + key + "=" + value + "&";
}
}
return preStr;
}
下面通过main方法测试上面的签名参数的处理以及签名参数的加密
public static void main(String args[]) {
Map map = new HashMap();
map.put("method", "");
map.put("username", "");
map.put("password", "");
String str = createLinkString(map) + "";
String sign = signBySHA(str, "UTF-8").toLowerCase();//SHA-1方式加密签名
System.out.println(sign);
}
欢迎广大开发者一起交流学习,笔者电话微信18629374628