请求参数按照ASCII码从小到大排序后追加秘钥再进行加密得到签名值

   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;
    }
}



    

猜你喜欢

转载自blog.csdn.net/xiaoqiang_0719/article/details/80493091