package com.gs.xky.config; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import java.security.MessageDigest; import java.util.*; public class SignUtils { /* * 自定义比较器(比较字符串) */ private static Comparator keyComparator = new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }; /* * 构造签名 * @param paramJson ApiCommonParam对象转Json后的字符串 * @param appSecret * @return */ public static String buildCurrentSign(String paramJson, String appSecret) { Map commonMap = new HashMap(); Map jsonObject = JSONObject.parseObject(paramJson, new TypeReference>() { }); String value = ""; List keyList = new ArrayList(); for (Map.Entry entry : jsonObject.entrySet()) { value = entry.getValue().toString().trim(); commonMap.put(entry.getKey(), value); if ("sign".equalsIgnoreCase(entry.getKey())) { continue; } keyList.add(entry.getKey()); } // key排序 Collections.sort(keyList, keyComparator); //拼接数据 StringBuilder sb = new StringBuilder(); for (String k : keyList) { sb.append(commonMap.get(k)).append(":"); } sb.append(appSecret); // 计算MD5 String signStr = null; try { signStr = getMD5(sb.toString()); } catch (Exception e) { e.printStackTrace(); return null; } return signStr.toLowerCase(); } /* * 得到MD5值 * @param str * @return * @throws Exception */ private static String getMD5(String str) throws Exception { if (str == null || str.length() == 0) { return null; } StringBuffer ret = new StringBuffer(); try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(str.getBytes("UTF-8")); byte[] hash = digest.digest(); // 转为ASCII码,byte为8位,计算机为32位,采用补码形式,所以要补全. for (byte b : hash) { if ((0xFF & b) < 0x10) { ret.append("0" + Integer.toHexString((b & 0xFF))); } else { ret.append(Integer.toHexString(b & 0xFF)); } } } catch (Exception e) { e.printStackTrace(); throw e; } return ret.toString().toUpperCase(); } }