import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
/**
* @program: outsys-adapter
* @description: 所有参数排序以及参数自动添加sign签名
* @author: ShiHuaHao
* @create: 2019-06-28 09:40
**/
public class ParamUtil {
/**
* 所有参数排序以及参数自动添加sign签名
* @param param
* @return
*/
public static String getParam4Url(String param) throws NoSuchAlgorithmException {
// 将参数按字母排序
String[] parameters = param.split("&");
TreeMap SortedParametersWithoutSign = new TreeMap();
for (int i = 0; i < parameters.length; i++) {
String[] pandvalue = parameters[i].split("=");
if (pandvalue.length > 1) {
String[] values = Arrays.copyOfRange(pandvalue, 1, pandvalue.length);
if (!values[0].equals(""))
SortedParametersWithoutSign.put(pandvalue[0], values[0]);
}
}
String requestParameters = "";
Set set = SortedParametersWithoutSign.entrySet();
Iterator iterator = set.iterator();
int iterationcount = 0;
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
if(iterationcount == 0)
requestParameters += mentry.getKey()+"="+mentry.getValue();
else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();
iterationcount++;
}
// 将组装的参数 得到md5 散列串
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(requestParameters.getBytes(Charset.forName("UTF-8")));
BigInteger number = new BigInteger(1, messageDigest);
String hashtext = number.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
// 加入sign的参数,重新生成 请求的参数。
SortedParametersWithoutSign.put("sign",hashtext);
// 重新拿到最新的请求数据
requestParameters = "";
set = SortedParametersWithoutSign.entrySet();
iterator = set.iterator();
iterationcount = 0;
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry)iterator.next();
if(iterationcount == 0)
requestParameters += mentry.getKey()+"="+mentry.getValue();
else requestParameters += "&"+mentry.getKey()+"="+mentry.getValue();
iterationcount++;
}
return requestParameters;
}
}
主要参考:链接