接口参数验签排序问题(map类型,通过key排序)
在设计对外的接口中,为了参数的安全性,经常会进行参数加密验签,以保证所传参数俩边一致,但是在生成签名时,如果参数的顺序不一致就会导致生成的签名不同,从而验签失败,因此参数排序成了重中之重。
public static String sign(Map<String, Object> data, String key) {
if (data == null || data.isEmpty()) {
return null;
}
StringBuilder buf = new StringBuilder();
//接口在接收参数时返回的类型为LinkedHashMap,所以先转换为hashmap
Map hashMap = JSONObject.parseObject(JSONObject.toJSONString(data), Map.class);
//因为会存在map中嵌套map 的情况,使用SerializerFeature.MapSortField可以将所有参数排序通过key进行排序,再使用Feature.OrderedField保证转map时顺序正确
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;
}
版权声明:本文为weixin_42608402原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。