package com.nq.utils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * @program: dabaogp * @description: 支付2签名 * @create: 2025-04-02 16:55 **/ public class SignatureGeneratorUtil { /** * 签名 * * @param parameter 参数 * @param secretKey 密钥 * @return 签名字符串 */ public static String generateSign(Map parameter, String secretKey) { // 移除 'sign' 参数 parameter.remove("sign"); // 对参数按照键进行排序 Map sortedParams = new TreeMap<>(parameter); StringBuilder signStr = new StringBuilder(); // 拼接所有参数,格式为 key=value& Set> entrySet = sortedParams.entrySet(); for (Map.Entry entry : entrySet) { String key = entry.getKey(); String value = entry.getValue(); if (value != null && !value.isEmpty()) { signStr.append(key).append("=").append(value).append("&"); } } // 拼接密钥 signStr.append("key=").append(secretKey); System.out.println(signStr); // 生成md5签名并转为小写 return md5(signStr.toString()).toLowerCase(); } /** * 计算 MD5 值 * * @param str 待加密字符串 * @return MD5 加密后的字符串 */ private static String md5(String str) { try { java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(str.getBytes()); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }