签名工具类
pom
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<!-- commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<!-- commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
工具类
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
@Slf4j
public class ApiEncryptUtil {
private static final String TIMESTAMP = "timestamp";
private static final String SIGN = "sign";
private static final String SIGNKEYCODE = "signKey";
private static final long TSDIFF = 3600000;
public static String generateSign(Map<String,Object> map, String signKey) throws Exception {
String timestamp = null;
if (map.get(TIMESTAMP) != null){
timestamp = map.get(TIMESTAMP).toString();
}
if (StringUtils.isEmpty(timestamp)) {
throw new Exception("参数[timestamp]为空");
}
String signString = map2SignString(map,signKey);
return DigestUtils.md5Hex(signString);
}
public static String generateSign(Map<String,Object> map, String signKey,String signKeyCode) throws Exception {
String signString = map2SignString(map,signKey,signKeyCode);
if (StringUtils.isNotBlank(signString)){
String s = DigestUtils.md5Hex(signString);
return s.toUpperCase();
}
return signString;
}
public static boolean checkSign(Map<String,Object> map,String signKey) throws Exception {
String sign = null;
if (map.get(SIGN) != null){
sign = map.get(SIGN).toString();
}
String timestamp = null;
if (map.get(TIMESTAMP) != null){
timestamp = map.get(TIMESTAMP).toString();
}
if (StringUtils.isEmpty(sign) || StringUtils.isEmpty(timestamp)) {
throw new Exception("请求参数不全sign和timestamp必须要有");
}
if (!checkTimestamp(timestamp)) {
throw new Exception("时间戳无效已过期");
}
String newSign = generateSign(map, signKey);
if (!sign.equals(newSign)) {
throw new Exception("签名无效");
}
return true;
}
private static String map2SignString(Map map,String signKey) {
return map2SignString(map,signKey,SIGNKEYCODE);
}
private static String map2SignString(Map map,String signKey,String signKeyCode) {
if(MapUtils.isEmpty(map)){
return null ;
}
Map<String, Object> paramMap = sortByKey(JSONObject.parseObject(JSONObject.toJSONString(map)));
StringBuilder content = new StringBuilder();
for (String key : paramMap.keySet()) {
if (key.equals(SIGN)) {
continue;
}
String value = null;
Object o = paramMap.get(key);
if (o != null){
value = o.toString();
}
if (StringUtils.isNotBlank(value)) {
content.append(key).append("=").append(value.trim()).append("&");
}
}
content.append(signKeyCode + "=" + signKey);
return content.toString();
}
private static Map<String, Object> sortByKey(Map map) {
if(MapUtils.isEmpty(map)){
return null;
}
Map<String, Object> sortMap = new TreeMap<>(Comparator.naturalOrder());
sortMap.putAll(map);
for (Map.Entry<String, Object> entry : sortMap.entrySet()) {
if (entry.getValue() instanceof List){
List newValues = new ArrayList();
List values = (List)entry.getValue();
for (Object value : values) {
if (value instanceof Map){
Map<String, Object> sortMap1 = sortByKey((JSONObject) JSONObject.toJSON(value));
newValues.add(sortMap1);
}else {
newValues.add(value);
}
}
entry.setValue(newValues);
}else if (entry.getValue() instanceof Map){
Map<String, Object> sortMap1 = sortByKey((JSONObject)JSONObject.toJSON(entry.getValue()));
entry.setValue(sortMap1);
}
}
return sortMap;
}
private static boolean checkTimestamp(String timestamp) {
long curTime = System.currentTimeMillis();
long dt = curTime - Long.parseLong(timestamp);
return dt <= TSDIFF;
}
}