1
zj
6 days ago 7166584366406c107c3e46560580765f2db4cd5c
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
package com.nq.utils.pay;
 
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
 
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
 
public class OcocnPayUtil {
 
    private OcocnPayUtil() {
    }
 
    public static String encode(String value) {
        if (value == null) {
            return "";
        }
        try {
            return URLEncoder.encode(value, StandardCharsets.UTF_8.name());
        } catch (UnsupportedEncodingException e) {
            return value;
        }
    }
 
    public static String buildSubmitSign(String money, String productName, String notifyUrl,
                                         String ordersn, String pid, String returnUrl,
                                         String sitename, String payType, String key) {
        Map<String, String> params = new TreeMap<>();
        params.put("money", money);
        params.put("name", productName);
        params.put("notify_url", notifyUrl);
        params.put("out_trade_no", ordersn);
        params.put("pid", pid);
        params.put("return_url", returnUrl);
        if (StringUtils.isNotBlank(sitename)) {
            params.put("sitename", sitename);
        }
        params.put("type", payType);
        return md5Sign(params, key);
    }
 
    public static Map<String, String> parseRequestParams(HttpServletRequest request) {
        Map<String, String> result = new HashMap<>();
        if (request == null) {
            return result;
        }
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            String[] values = entry.getValue();
            if (values != null && values.length > 0) {
                result.put(entry.getKey(), values[0]);
            }
        }
        return result;
    }
 
    public static boolean verifyNotifySign(Map<String, String> params, String key) {
        if (params == null || StringUtils.isBlank(key)) {
            return false;
        }
        String remoteSign = params.get("sign");
        if (StringUtils.isBlank(remoteSign)) {
            return false;
        }
        Map<String, String> signParams = new TreeMap<>();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            String name = entry.getKey();
            String value = entry.getValue();
            if ("sign".equalsIgnoreCase(name) || "sign_type".equalsIgnoreCase(name)) {
                continue;
            }
            if (StringUtils.isBlank(value)) {
                continue;
            }
            signParams.put(name, value);
        }
        String localSign = md5Sign(signParams, key);
        return remoteSign.equalsIgnoreCase(localSign);
    }
 
    private static String md5Sign(Map<String, String> params, String key) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (sb.length() > 0) {
                sb.append('&');
            }
            sb.append(entry.getKey()).append('=').append(entry.getValue());
        }
        sb.append(key);
        return DigestUtils.md5Hex(sb.toString()).toLowerCase();
    }
}