接口参数验签排序问题(map类型,通过key排序)
在设计对外的接口中,为了参数的安全性,经常会进行参数加密验签,以保证所传参数俩边一致,但是在生成签名时,如果参数的顺序不一致就会导致生成的签名不同,从而验签失败,因此参数排序成了重中之重。
public static String sign(Map<String, Object> data, String key) {
if (data == null || data.isEmpty()) {
return null;
}
StringBuilder buf = new StringBuilder();
Map hashMap = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
LinkedHashMap<String, Object> map = JSON.parseObject(JSON.toJSONString(hashMap, SerializerFeature.MapSortField),LinkedHashMap.class, Feature.OrderedField);
Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
Object k = entry.getKey();
if ("class".equals(k) || "key".equals(k) || "sign".equals(k)) {
continue;
}
Object v = entry.getValue();
if (v == null || "".equals(v.toString())) {
continue;
}
buf.append(k);
buf.append("=");
buf.append(v);
buf.append("&");
}
buf.append("key=" + key);
log.info(buf.toString());
String sign = EncryptUtil.md5(buf.toString()).toUpperCase();
return sign;
}