“mitao”
2026-04-07 3ee4725e50f2494fc291ba841730942004e22956
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.xiaopeng.trafficControl.util;
 
import com.xiaopeng.unifiedverification.util.md5.MD5Util;
import com.xiaopeng.unifiedverification.util.sha256.SHA256Util;
import com.xiaopeng.trafficControl.enums.SignatureType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
 
public class SignatureUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(SignatureUtils.class);
 
    /**
     * 通用签名方法,签名算法为SHA1<br/>
     * 签名原文拼装规则:<br/>
     * ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符<br/>
     * ②在第①步骤组装的String前面追加appid的值<br/>
     * ③在第①步骤组装的String后面追加appSecret的值<br/>
     *
     * @param appId     业务系统唯一标识
     * @param paraMap   所需要传递的参数map
     * @param appSecret 分配给业务系统的秘钥
     * @return
     */
    public static String getSignatureSHA1(String appId, Map<String, String> paraMap, String appSecret) {
        return getSignature(appId, paraMap, appSecret, SignatureType.SHA1);
    }
 
    /**
     * 通用签名方法<br/>
     * 签名原文拼装规则:<br/>
     * ①paraMap按key的自然排序,并按key1+value1+key2+value2的规则拼接,中间无分隔符<br/>
     * ②在第①步骤组装的String前面追加appid的值<br/>
     * ③在第①步骤组装的String后面追加appSecret的值<br/>
     *
     * @param appId         业务系统唯一标识
     * @param paraMap       所需要传递的参数map
     * @param appSecret     分配给业务系统的秘钥
     * @param signatureType 签名算法类型(参考SignatureType)
     * @return
     */
    public static String getSignature(String appId, Map<String, String> paraMap, String appSecret,
                                      SignatureType signatureType) {
        String originStr = buildAllSignatureOriginStr(appId, paraMap, appSecret);
        LOGGER.info("originStr: {}", originStr);
        return getSignature(originStr, signatureType);
    }
 
    // ------------------------------------------------------------------------------------------
 
    /**
     * 构造计算签名的完整消息内容<br/>
     */
    public static String buildAllSignatureOriginStr(String appId, Map<String, String> paraMap, String appSecret) {
        StringBuilder sb = new StringBuilder(128);
        String result = sb.append(appId).append(buildMiddleSignatureOriginStr(paraMap)).append(appSecret).toString(); // 用于签名的原文
 
        return result;
    }
 
    /**
     * 构造计算签名的中间消息内容<br/>
     */
    public static String buildMiddleSignatureOriginStr(Map<String, String> map) {
        if (map.isEmpty()) {
            return "";
        }
 
        Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String obj1, String obj2) {
                // 升序排序
                return obj1.compareTo(obj2);
            }
        });
 
        treeMap.putAll(map);
 
        Iterator<Map.Entry<String, String>> iter = treeMap.entrySet().iterator();
        StringBuilder stringBuilder = new StringBuilder(128);
 
        while (iter.hasNext()) {
            Map.Entry<String, String> entry = iter.next();
 
            stringBuilder.append(entry.getKey()).append(entry.getValue());
        }
 
        return stringBuilder.toString();
    }
 
    /**
     * 计算签名
     *
     * @param originStr
     *            用于签名的原始内容
     * @param signatureType
     *            签名算法类型(参考SignatureType)
     * @return 签名值
     */
    public static String getSignature(String originStr, SignatureType signatureType) {
        if (SignatureType.MD5 == signatureType) {
            return MD5Util.getMD5LowerString(originStr);
        } else if (SignatureType.SHA1 == signatureType) {
            return SHA1Util.getSHA1LowerString(originStr);
        } else if (SignatureType.SHA256 == signatureType) {
            return SHA256Util.getSHA256LowerString(originStr);
        } else { // 默认用SHA1
            return SHA1Util.getSHA1LowerString(originStr);
        }
    }
}