import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** 空值不参与,字典序,MD5 小写 */ public final class SignUtil { private SignUtil() {} public static String buildSign(Map params, String secretKey) throws Exception { TreeMap sorted = new TreeMap<>(); for (Map.Entry e : params.entrySet()) { if ("Sign".equals(e.getKey())) { continue; } sorted.put(e.getKey(), e.getValue()); } List parts = new ArrayList<>(); for (Map.Entry e : sorted.entrySet()) { Object v = e.getValue(); if (v == null) { continue; } String s = String.valueOf(v); if (s.isEmpty()) { continue; } parts.add(e.getKey() + "=" + s); } String raw = String.join("&", parts) + "&SecretKey=" + secretKey; MessageDigest md = MessageDigest.getInstance("MD5"); byte[] dig = md.digest(raw.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : dig) { sb.append(String.format("%02x", b)); } return sb.toString(); } }