签名验证
签名方式要求: 将第三方传递过来的参数数据进行字典排序并在前后两端均加上appSecret,得到的字符串进行 md5签名(第三方传递过来的签名sign不进行排序与签名)
单层简易数据方式
请求数据示例:
{
“orderId”: “SS111111111”,
“timestamp”: “1584687954”,
“status”: “7”,
“sign”: “11231asdasda”
}
在数据仅有一个层级时采用此方法即可完成
/**
* @param businessParam 业务参数Map,使用TreeMap保证有序
* 如果业务参数有对象传输,请使用Json工具类转换为字符串
* @param appSecret 分配的appSecret
*/
public static String getSignKey(TreeMap<String, String> treeMap, String appSecret) {
return md5(getDataStr(treeMap, appSecret));
}
private static String getDataStr(TreeMap<String, String> treeMap, String appSecret) {
StringBuilder sb = new StringBuilder(appSecret);
// 按照规则拼成字符串
for (Map.Entry<String, String> entry : treeMap.entrySet()) {
if ("sign".equals(entry.getKey())) {
continue;
}
String name = entry.getKey();
String value = entry.getValue();
sb.append(name).append(value);
}
sb.append(appSecret);
return sb.toString();
}
private static String md5(String dataStr) {
return DigestUtils.md5Hex(dataStr);
}
如上述代码所示, 将接收的参数转换为TreeMap类型, 然后直接调用getDataStr方法得到结果
多层级数据方式
请求数据示例:
{
totalQuantity:20,
company: {
administrator: '',
department: [{
userId: '' ,
username: ''
},{
userId: '' ,
username: ''
}]
}
}
在数据多层级时采用此方法即可完成
public static String getSignKey(JSONObject json, String appSecret) {
String data = JSONObject.toJSONString(json, SerializerFeature.SortField.MapSortField);
JSONObject jsonObject = JSONObject.parseObject(data,JSONObject.class, Feature.OrderedField);
StringBuilder sb = new StringBuilder(appSecret);
for (String str : jsonObject.keySet()){
if ("sign".equals(str)) {
continue;
}
sb.append(str).append(json.get(str));
}
sb.append(appSecret);
// 按照规则拼成字符串
return md5(sb.toString());
}
private static String md5(String dataStr) {
return DigestUtils.md5Hex(dataStr);
}
多层级数据处理方法主要依托于
String data = JSONObject.toJSONString(json, SerializerFeature.SortField.MapSortField);
JSONObject jsonObject = JSONObject.parseObject(data,JSONObject.class, Feature.OrderedField);
这两个排序接口设定, 下面的方法对于简易和复杂两种情况均可以处理, 且传递参数为比较常用的JSONObject,更适用些,具体使用哪种方式可自行选择!