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();
|
}
|
}
|