由于业务需要,需要对请求进行的签名,其中有一部分的算法就是需要对所有参数进行字典排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串
*
* @param paramsMap 要排序的Map对象
* @param urlEncode 是否需要URLENCODE
* @param keyToLower 是否需要将Key转换为全小写 true:key转化成小写,false:不转化
* @return
*/
public static String formatUrlMap(Map<String, Object> paramsMap,
boolean urlEncode, boolean keyToLower) {

String buff = "";
Map<String, Object> tmpMap = paramsMap;

try {
List<Map.Entry<String, Object>> infoIds =
new ArrayList<Map.Entry<String, Object>>(tmpMap.entrySet());

//对所有传入参数按照字段名的ASCII码从小到大排序(字典序)
Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
public int compare(Map.Entry<String, Object> o1,
Map.Entry<String, Object> o2) {
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});

//构造URL 键值对的格式
StringBuffer buf = new StringBuffer();
for (Map.Entry<String, Object> item : infoIds) {
if (StringUtils.isNotBlank(item.getKey())) {
String key = item.getKey();
String value = item.getValue().toString();
if (urlEncode) {
value = URLEncoder.encode(value, "utf-8");
}
if (keyToLower) {
buf.append(key.toLowerCase() + "=" + value);
} else {
buf.append(key + "=" + value);
}
buf.append("&");
}
}
buff = buf.toString();

if (StringUtils.isNotEmpty(buff)) {
buff = buff.substring(0, buff.length() - 1);
}
} catch (Exception e) {
e.printStackTrace();
return null;
}

return buff;
}

排序后可以进行其他处理,比如拼上nonce、时间戳等;