public static String sign(Map<String, Object> data, String secret) {
// 按键排序
SortedMap<String, Object> sortedData = new TreeMap<>(data);
// 构建参数字符串
StringBuilder param = new StringBuilder();
for (Map.Entry<String, Object> entry : sortedData.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 如果值是整数,转换为字符串
String valueStr = value instanceof Integer ? String.valueOf(value) : value.toString();
// 拼接参数
if (param.length() > 0) {
param.append("&");
}
param.append(key).append("=").append(valueStr);
}
// 拼接密钥并计算 MD5
String queryString = param.toString() + secret;
return md5(queryString);
}
private static String md5(String input) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(input.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : array) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException("MD5 calculation error", e);
}
}