OpenUtil.java 4.6 KB
package com.cnlive.shenhe.utils;

import javax.servlet.ServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.*;

/**
 * @author Administrator
 */
public class OpenUtil {

    /**
     * 验证签名
     * 用于服务端
     */
    public static boolean validateSign(ServletRequest request, String spKey) {
        return validateSign(request, spKey, null);
    }

    /**
     * 验证签名
     */
    private static boolean validateSign(ServletRequest request, String spKey, String... ignore) {
        Map<String, String> map = getRequestParam(request);
        String sign = map.get("sign");
        map.remove("sign");
        if (ignore != null) {
            for (String key : ignore) {
                map.remove(key);
            }
        }
        map = order(map);
        String str = mapJoin(map, false);
        String mySign = SHA1.SHA1Digest(str + "&key=" + spKey).toUpperCase();
        return mySign.equals(sign);
    }

    /**
     * 生成get 请求 URL
     */
    public static String buildURL(String url, Map<String, String> params, String spKey) {
        Map<String, String> map = order(params);
        if (map.containsKey("sign")) {
            map.remove("sign");
        }
        String str = mapJoin(map, false);

        String sign = SHA1.SHA1Digest(str + "&key=" + spKey).toUpperCase();
        map.put("sign", sign);
        return url + "?" + mapJoin(map, true);
    }

    /**
     * 生成签名 sign
     */
    public static String sign(Map<String, String> params, String spKey) {
        Map<String, String> map = order(params);
        if (map.containsKey("sign")) {
            map.remove("sign");
        }
        String str = mapJoin(map, false);
        return SHA1.SHA1Digest(str + "&key=" + spKey).toUpperCase();
    }

    /**
     * 获取请求参数
     */
    private static Map<String, String> getRequestParam(ServletRequest request) {
        Map<String, String> map = new LinkedHashMap<>();
        Map<String, String[]> map2 = request.getParameterMap();
        for (String key : map2.keySet()) {
            if (map2.get(key) == null || map2.get(key).length == 0) {
                map.put(key, null);
            } else {
                try {
                    String value = URLDecoder.decode(map2.get(key)[0], "utf-8");
                    map.put(key, value);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
        }
        return map;
    }

    /**
     * 获取附加参数
     */
    public static Map<String, String> getAttachParam(ServletRequest servletRequest, boolean attachKey) {
        Map<String, String[]> maps = servletRequest.getParameterMap();
        Map<String, String> map = new LinkedHashMap<String, String>();
        for (String key : maps.keySet()) {
            String[] vk = key.split("\\.");
            if (vk.length == 2 && vk[0].equals("attach")) {
                map.put(attachKey ? key : vk[1], maps.get(key)[0]);
            }
        }
        return map;
    }


    /**
     * url 参数串连
     */
    private static String mapJoin(Map<String, String> map, boolean valueUrlencode) {
        StringBuilder stringBuilder = new StringBuilder();
        for (String key : map.keySet()) {
            if (map.get(key) != null && !"".equals(map.get(key))) {
                try {
                    stringBuilder.append(key)
                            .append("=")
                            .append(valueUrlencode ? URLEncoder.encode(map.get(key), "utf-8").replace("+", "%20") : map.get(key))
                            .append("&");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }
        }
        if (stringBuilder.length() > 0) {
            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
        }
        return stringBuilder.toString();
    }


    /**
     * Map key 排序
     */
    private static Map<String, String> order(Map<String, String> map) {
        HashMap<String, String> tempMap = new LinkedHashMap<>();
        List<Map.Entry<String, String>> infoIds = new ArrayList<>(map.entrySet());

        infoIds.sort(new Comparator<Map.Entry<String, String>>() {
            @Override
            public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
                return (o1.getKey()).compareTo(o2.getKey());
            }
        });

        for (Map.Entry<String, String> item : infoIds) {
            tempMap.put(item.getKey(), item.getValue());
        }
        return tempMap;
    }

}