1
zj
2025-10-12 84d42b6997ae87fa64b75ae085fce11d05a6ca5a
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
package com.ruoyi.im.util;
 
import java.security.MessageDigest;
import java.util.*;
 
/**
 * 支付签名工具类
 */
public class PaySignUtil {
 
    /**
     * 生成签名
     * @param params 参数Map
     * @param key 商户密钥
     * @return 签名值
     */
    public static String generateSign(Map<String, Object> params, String key) {
        try {
            // 第一步:参数按ASCII码排序
            String stringA = createSignString(params);
 
            // 第二步:拼接key
            String stringSignTemp = stringA + "&key=" + key;
 
            // 第三步:MD5加密并转为大写
            return md5(stringSignTemp).toUpperCase();
        } catch (Exception e) {
            throw new RuntimeException("生成签名失败", e);
        }
    }
 
    /**
     * 验证签名
     * @param params 参数Map
     * @param key 商户密钥
     * @param sign 待验证签名
     * @return 验证结果
     */
    public static boolean verifySign(Map<String, Object> params, String key, String sign) {
        String generatedSign = generateSign(params, key);
        return generatedSign.equals(sign);
    }
 
    /**
     * 创建待签名字符串
     */
    private static String createSignString(Map<String, Object> params) {
        // 移除sign参数
        Map<String, Object> signParams = new HashMap<>(params);
        signParams.remove("sign");
 
        // 过滤空值并排序
        List<String> keys = new ArrayList<>();
        for (Map.Entry<String, Object> entry : signParams.entrySet()) {
            if (entry.getValue() != null && !entry.getValue().toString().trim().isEmpty()) {
                keys.add(entry.getKey());
            }
        }
 
        // ASCII码排序
        Collections.sort(keys);
 
        // 拼接字符串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = signParams.get(key).toString();
            if (i > 0) {
                sb.append("&");
            }
            sb.append(key).append("=").append(value);
        }
 
        return sb.toString();
    }
 
    /**
     * MD5加密
     */
    private static String md5(String data) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] array = md.digest(data.getBytes("UTF-8"));
        StringBuilder sb = new StringBuilder();
        for (byte item : array) {
            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
        }
        return sb.toString();
    }
}