这个sig生成算法有一个让人很疑惑的方法就是连接不带&的
//填充“应用历史趋势”所需要的参数
public Map<String, String> paramMap(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date today = new Date();
String endDate = sdf.format(today);//当前日期
Calendar theCa = Calendar.getInstance();
theCa.setTime(today);
theCa.add(theCa.DATE, -30);//最后一个数字30可改,30天的意思
Date start = theCa.getTime();
String startDate = sdf.format(start);//三十天之前日期
Map<String, String> map = new LinkedHashMap<>();//用来存放参要加密的参数的(这边用LinkedHashMap为了防止参数顺序不对)
map.put("app_id",APP_ID);
map.put("end_date",endDate);
map.put("idx","pv,uv");
map.put("start_date",startDate);
Map<String, String> tmap = MapUtil.order(map);//这个方法就是用来给map排序的这边我就不去掉了,这个方法也是用到LinkedHashMap。
String str = SECRET_KEY+MapUtil.mapJoin(tmap, false, false).replaceAll("&","");//这边就是为了把map进行拼接成字符串,因为正常的拼接都带&,然而这里面不带&,就吧&替换掉
map.put("sign",DigestUtils.md5Hex(str));//DigestUtils.md5Hex(str)这个方法就是md5加密完生成的一串sign了
return map;
}
附上MapUtil其中MapUtil.order(Map<String, String>)给hashmap排序的这个方法和MapUtil.mapJoin(Map<String, String>,boolean,boolean)方法将map转为字符串的
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class MapUtil {
private static Logger logger = LoggerFactory.getLogger(MapUtil.class);
/**
* Map key 排序
* @param map map
* @return map
*/
public static Map<String,String> order(Map<String, String> map){
HashMap<String, String> tempMap = new LinkedHashMap<String, String>();
List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>( map.entrySet());
Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
public int compare(Map.Entry<String, String> o1,Map.Entry<String, String> o2) {
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
for (int i = 0; i < infoIds.size(); i++) {
Map.Entry<String, String> item = infoIds.get(i);
tempMap.put(item.getKey(), item.getValue());
}
return tempMap;
}
/**
* 转换对象为map
* @param object object
* @param ignore ignore
* @return map
*/
public static Map<String,String> objectToMap(Object object,String... ignore){
Map<String,String> tempMap = new LinkedHashMap<String, String>();
for(Field f : getAllFields(object.getClass())){
if(!f.isAccessible()){
f.setAccessible(true);
}
boolean ig = false;
if(ignore!=null&&ignore.length>0){
for(String i : ignore){
if(i.equals(f.getName())){
ig = true;
break;
}
}
}
if(ig){
continue;
}else{
Object o = null;
try {
o = f.get(object);
} catch (IllegalArgumentException e) {
logger.error("", e);
} catch (IllegalAccessException e) {
logger.error("", e);
}
tempMap.put(f.getName(), o==null?"":o.toString());
}
}
return tempMap;
}
/**
* url 参数串连
* @param map map
* @param keyLower keyLower
* @param valueUrlencode valueUrlencode
* @return string
*/
public static String mapJoin(Map<String, String> map,boolean keyLower,boolean valueUrlencode){
StringBuilder stringBuilder = new StringBuilder();
for(String key :map.keySet()){
if(map.get(key)!=null&&!"".equals(map.get(key))){
try {
String temp = (key.endsWith("_")&&key.length()>1)?key.substring(0,key.length()-1):key;
stringBuilder.append(keyLower?temp.toLowerCase():temp)
.append("=")
.append(valueUrlencode?URLEncoder.encode(map.get(key),"utf-8").replace("+", "%20"):map.get(key))
.append("&");
} catch (UnsupportedEncodingException e) {
logger.error("", e);
}
}
}
if(stringBuilder.length()>0){
stringBuilder.deleteCharAt(stringBuilder.length()-1);
}
return stringBuilder.toString();
}
/**
* 获取所有Fields,包含父类field
* @param clazz clazz
* @return list
*/
private static List<Field> getAllFields(Class<?> clazz){
if(!clazz.equals(Object.class)){
List<Field> fields = new ArrayList<Field>(Arrays.asList(clazz.getDeclaredFields()));
List<Field> fields2 = getAllFields(clazz.getSuperclass());
if(fields2!=null){
fields.addAll(fields2);
}
return fields;
}else{
return null;
}
}
}