这个java签名(sign)生成逻辑怎么弄啊?

这个可咋弄啊

API名称

签名(sign)生成逻辑

请求方式

GET

数据格式

JSON

使用状态

正在使用

入参

1、将除了sign参数以外的参数按照字典序升序进行排列,按照keyvalue顺序进行拼接,得到的拼接结果首尾拼接秘钥(请求接口时用接口秘钥,回传订单验签时用回调秘钥)

2、将步骤1得到的字符串进行md5,得到的结果即为sign

出参  无

 

秘钥:123456

我应该得出签名结果啊?

 

public static String genSign(TreeMap params) {
	if (params.containsKey("sign")) 
	    params.remove("sign");
	}
	String str = "";
	str += SECRET;
	for (String key : params.keySet()) {
	    str += key + params.get(key);
	}
	str += SECRET;
	String sign = md5(str);
	return sign;
}
public static String md5(String source) {
	String md5Result = null;
	try {
	        byte[] hash = org.apache.commons.codec.binary.StringUtils.getBytesUtf8(source);
	        MessageDigest messageDigest = MessageDigest.getInstance("MD5");
	        messageDigest.update(hash);
	        hash = messageDigest.digest();
	        md5Result = Hex.encodeHexString(hash);
	} catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	}
	return md5Result;
}

 

例如你的参数是

{

“key1”:"value1",

"key2":"value2",

"key3":"value3"

}

密钥:123456

需要签名的字符串就是:123456key1value1key2value2key3value3123456,再进行MD5加密得到sign

最终你请求的参数就是

{

“key1”:"value1",

"key2":"value2",

"key3":"value3",

“sign”:"签名后的值"

}

 

服务端接收到参数后也会对参数进行签名计算,再和你的签名做对比

直接拿去用吧

    /**
     * 签名
     * @param params 需要签名的参数,TreeMap 会自带排序功能
     * @return
     * @throws Exception
     */
    public static String paramsSign(TreeMap<String,String> params,String appkey) throws Exception{
        if(params.containsKey("sign")) {//签名明文组装不包含sign字段
            params.remove("sign");
        }
        params.put("key", appkey);
        StringBuilder sb = new StringBuilder();
        for(Map.Entry<String, String> entry:params.entrySet()){
            if(entry.getValue()!=null&&entry.getValue().length()>0){
                sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
        }
        if(sb.length()>0){
            sb.deleteCharAt(sb.length()-1);
        }
        String sign = md5(sb.toString().getBytes("UTF-8"));//记得是md5编码的加签
        params.remove("key");
        return sign;
    }

 

/**
	 * md5
	 * @param b
	 * @return
	 */
	public static String md5(byte[] b) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.reset();
			md.update(b);
			byte[] hash = md.digest();
			StringBuffer outStrBuf = new StringBuffer(32);
			for (int i = 0; i < hash.length; i++) {
				int v = hash[i] & 0xFF;
				if (v < 16) {
					outStrBuf.append('0');
				}
				outStrBuf.append(Integer.toString(v, 16).toLowerCase());
			}
			return outStrBuf.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return new String(b);
		}
	}

 

之前看错了,以为你要签名方法。直接调用genSign方法获得签名,把签名当成一个参数传过去给api就行了。