public class SignUtils {
private static Logger LOG = LoggerFactory.getLogger(SignUtils.class);
private SignUtils() {
}
public static String signMD5(Object object, String key) {
String json = JSON.toJSONString(object);
return signMD5(json, key);
}
public static String signMD5(String json, String key) {
Map<String, Object> map = JSON.parseObject(json);
return signMD5(map, key);
}
public static String signOnMethod(Map<String, Object> map,String signMethod, String key) {
map.remove("sign");
map.remove("signMethod");
map.remove("extField");
return sign(signMethod, map, key);
}
public static String signMD5(Map<String, Object> map, String key) {
map.remove("sign");
map.remove("signMethod");
map.remove("extField");
return sign("MD5", map, key);
}
public static String sign(String signMethod, Map<String, Object> map, String key) {
StringBuilder signBuilder = buildSign(map);
if (StringUtils.isNotEmpty(key)) {
signBuilder.append("&key=").append(key);
}
byte[] digest = DigestUtils.getDigest(signMethod).digest(signBuilder.toString().getBytes());
return new String(Hex.encodeHex(digest));
}
@SuppressWarnings("unchecked")
private static String signStr(Object obj) {
if (obj == null)
return null;
if (obj instanceof Map) {
return buildSign((Map<String, Object>) obj).insert(0, '{').append('}').toString();
}
if (obj instanceof List) {
return buildSign((List<Object>) obj).insert(0, '[').append(']').toString();
}
return obj.toString();
}
private static StringBuilder buildSign(Map<String, Object> map) {
if (!(map instanceof TreeMap)) {
map = new TreeMap<String, Object>(map);
}
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value != null && StringUtils.isNotEmpty(value.toString())) {
builder.append(key).append("=").append(signStr(value)).append("&");
}
}
return builder.deleteCharAt(builder.length() - 1);
}
private static StringBuilder buildSign(List<Object> list) {
StringBuilder builder = new StringBuilder();
if (list == null || list.isEmpty()) {
return builder;
}
for (Object obj : list) {
builder.append(signStr(obj)).append(",");
}
return builder.deleteCharAt(builder.length() - 1);
}
}