package com.wwb;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by wangwenbo on 2018/5/24.
*/
/* 签名验证相关utilS */
public class SignUtils {
private static final Logger logger = LoggerFactory.getLogger(SignUtils.class);
private SignUtils() {
throw new IllegalAccessError("Utility class");
}
/**
* 将所有参数,按照属性名字符串顺序排序,返回加密后的sign值,去除可能包含的sign字段
*/
public static String createUnifiedOrderSign(Object param, String appKey) {
StringBuilder sign = new StringBuilder();
Map<String, String> map = getSortMap(param);
sign.append(appKey);
for (Map.Entry<String, String> entry : map.entrySet()) {
if (StringUtils.isNotBlank(entry.getValue())) {
sign.append(entry.getKey()).append(entry.getValue());
}
}
sign.append(appKey);
logger.info("加密字符串为:" + sign.toString());
System.out.println("加密字符串为:" + sign.toString());
String ans = DigestUtils.md5Hex(sign.toString()).toLowerCase();
logger.info("加密结果:" + ans);
return ans;
}
/**
* 获取排序后的类属性及值
*
* @param object
* @return
* @throws Exception
*/
private static Map<String, String> getSortMap(Object object) {
Field[] fields = object.getClass().getDeclaredFields();
Map<String, String> map = new HashMap<String, String>();
for (Field field : fields) {
String name = field.getName();
String methodName = "get" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
Method getter = null;
try {
getter = object.getClass().getMethod(methodName);
} catch (NoSuchMethodException e) {
logger.error("字段" + methodName + "get方法不存在", e);
}
// 调用getter方法获取属性值
String value = null;
if (getter != null) {
try {
value = (String) getter.invoke(object);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (value != null) {
map.put(name, value);
}
}
Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
sortMap.putAll(map);
return sortMap;
}
}