1
zj
8 days ago 7d008bf58373926bbdcf67fa7bcf92510f427fb6
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
package com.nq.utils;
 
import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;
 
public class PaymentSignUtil {
 
    /**
     * 生成签名
     * @param params 请求参数Map
     * @param key 密钥
     * @return 签名
     */
    public static String generateSign(Map<String, String> params, String key) {
        try {
            // 第一步:去除空值参数
            Map<String, String> sortedParams = new TreeMap<>();
            for (Map.Entry<String, String> entry : params.entrySet()) {
                if (entry.getValue() != null && !entry.getValue().trim().isEmpty()) {
                    sortedParams.put(entry.getKey(), entry.getValue());
                }
            }
 
            // 第二步:拼接字符串
            StringBuilder stringA = new StringBuilder();
            for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
                stringA.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
 
            // 去掉最后一个&
            if (stringA.length() > 0) {
                stringA.deleteCharAt(stringA.length() - 1);
            }
 
            // 拼接密钥
            String stringB = stringA.toString() + "&key=" + key;
 
            // 第三步:MD5并转为小写
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(stringB.getBytes("UTF-8"));
            StringBuilder sign = new StringBuilder();
            for (byte b : digest) {
                sign.append(String.format("%02x", b));
            }
            return sign.toString().toLowerCase();
 
        } catch (Exception e) {
            throw new RuntimeException("生成签名失败", e);
        }
    }
 
    /**
     * 验证返回签名
     * @param data 返回数据
     * @param key 密钥
     * @param sign 返回的签名
     * @return 是否验证通过
     */
    public static boolean verifySign(Map<String, String> data, String key, String sign) {
        try {
            String generatedSign = generateSign(data, key);
            return generatedSign.equals(sign);
        } catch (Exception e) {
            return false;
        }
    }
 
}