Step 1:
对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的 格式(即 key1=value1&key2=value2...) 拼接成字符 string1 。 注意: 为空的参数不参与签名。
Step 2:
在第一步中 string1 最后拼接上 key=Key(密钥)得到 stringSignTemp 字符串,并对 stringSignTemp 进行 md5 运算,再将得到 的字符串所有字符转换为大写,得到 sign 值 signValue。 注意:KEY 最多 32 个字符(不包含特殊符号)
SortedMap<Object,Object> params = new TreeMap<Object,Object>();
params.put("id",appid);
params.put("name",name);
params.put("age",age);
params.put("sign",signForInspiry(params,"123456"));
方法接收TreeMap会对参数进行ASCII排序,signForInspiry方法接收map和key ,key值作为最后的参数添加到串尾,最后进行md5加密全部转换成大写完工~
/** * 生成签名; * * @param params * @return */ static public String signForInspiry(Map params, String key) { StringBuffer sbkey = new StringBuffer(); Set es = params.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); Object v = entry.getValue(); //空值不传递,不参与签名组串 if (null != v && !"".equals(v)) { sbkey.append(k + "=" + v + "&"); } } sbkey = sbkey.append("key=" + key); //MD5加密,结果转换为大写字符 String sign = MD5(sbkey.toString()).toUpperCase(); return sign; }
/** * 对字符串进行MD5加密 * * @param str 需要加密的字符串 * @return 小写MD5字符串 32位 */ static public String MD5(String str) { MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); digest.update(str.getBytes()); return new BigInteger(1, digest.digest()).toString(16); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } }