先排序:
public static String sortParams(Map<String, String> params) {
// 删掉sign参数
params.remove("sign");
StringBuilder stringToSign = new StringBuilder();
List<String> keyList = new ArrayList<String>();
Set<Map.Entry<String,String>> entry = params.entrySet();
Iterator<Map.Entry<String,String>> it = entry.iterator();
while (it.hasNext()){
Map.Entry<String,String> me = it.next();
String key = me.getKey();
String value = me.getValue();
if (value != null && !"".equals(value)) {
keyList.add(key);
}
}
Collections.sort(keyList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int length = Math.min(o1.length(), o2.length());
for (int i = 0; i < length; i++) {
char c1 = o1.charAt(i);
char c2 = o2.charAt(i);
int r = c1 - c2;
if (r != 0) {
return r;// char值小的排前边
}
}
// 2个字符串关系是str1.startsWith(str2)==true
// 取str2排前边
return o1.length() - o2.length();
}
});
//将参数和参数值按照排序顺序拼装成字符串
for (int i = 0; i < keyList.size(); i++) {
String key = keyList.get(i);
stringToSign.append(key);
stringToSign.append(params.get(key));
}
return stringToSign.toString();
}
然后进行MD5加密:
//对“生成签名的字符串”进行MD5,并进行BASE64操作,根据请求编码得到签名
public static String generate(String stringToSign, String charset) {
if (charset == null || "".equals(charset)) {
charset = "utf-8";
}
String sign = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
BASE64Encoder base64Encoder = new BASE64Encoder();
sign = base64Encoder.encode(md5.digest(stringToSign.getBytes(charset)));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sign;
}