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 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 parseRequestParams(HttpServletRequest request) { Map result = new HashMap<>(); if (request == null) { return result; } Map parameterMap = request.getParameterMap(); for (Map.Entry 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 params, String key) { if (params == null || StringUtils.isBlank(key)) { return false; } String remoteSign = params.get("sign"); if (StringUtils.isBlank(remoteSign)) { return false; } Map signParams = new TreeMap<>(); for (Map.Entry 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 params, String key) { StringBuilder sb = new StringBuilder(); for (Map.Entry 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(); } }