package com.ynxbd.wx.wxfactory.utils; import com.ynxbd.common.helper.common.ErrorHelper; import com.ynxbd.common.helper.common.JsonHelper; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; public class WxSignHelper { // 签名类型 final public static String SIGN_TYPE_MD5 = "MD5"; final public static String SIGN_TYPE_HMAC_SHA256 = "HMAC-SHA256"; // 时间标识 final public static String DATE_KEY = "date"; final public static String TIME_KEY = "time"; /** * 签名生成 * * @param map map * @param signType 类型 * @param key 密钥 * @return t | f */ public static String generateSign(Map map, String signType, String key) { try { Map orderMap = MapHelper.order(map); orderMap.remove("sign"); String paramsStr = MapHelper.mapJoin(orderMap, false, false); if (signType == null) { signType = SIGN_TYPE_MD5; } if (SIGN_TYPE_HMAC_SHA256.equalsIgnoreCase(signType)) { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); sha256_HMAC.init(secret_key); return Hex.encodeHexString(sha256_HMAC.doFinal((paramsStr + "&key=" + key).getBytes(StandardCharsets.UTF_8))).toUpperCase(); } else { return DigestUtils.md5Hex(paramsStr + "&key=" + key).toUpperCase(); } } catch (Exception e) { ErrorHelper.println(e); } return null; } /** * 签名验证 * * @param map map * @param key 密钥 * @return t | f */ public static boolean validateSign(Map map, String key) { return map.get("sign") != null && map.get("sign").equals(generateSign(map, null, key)); } /** * 签名验证 * * @param map map * @param key 密钥 * @return t | f */ public static boolean validateSign(Map map, String sign_type, String key) { return map.get("sign") != null && map.get("sign").equals(generateSign(map, sign_type, key)); } /** * 从请求流中获取数据 * * @param request 请求 * @return map */ public static String getReqData(HttpServletRequest request) { // 获取请求数据 try (InputStream in = request.getInputStream();) { StringBuilder sb = new StringBuilder(); InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8); char[] buffer = new char[4096]; int len; while ((len = reader.read(buffer)) != -1) { sb.append(buffer, 0, len); } String respData = sb.toString(); if ("".equals(respData)) { return null; } return respData; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 从请求中获取xml数据并转换为map * * @param request 请求 * @return map */ public static Map getReqXmlParamsMap(HttpServletRequest request) { String reqXml = getReqData(request); if (reqXml == null) { return null; } return XmlHelper.xmlOuterToMap(reqXml, false); } /** * 从请求中获取xml数据并转换为对象 * * @param request 请求 * @return 对象 */ public static T getReqXmlToBean(HttpServletRequest request ,Class clazz) { Map paramsMap = getReqXmlParamsMap(request); if (paramsMap == null) { return null; } return JsonHelper.parseObject(JsonHelper.toJsonString(paramsMap), clazz); } /** * 解析腾讯返回的时间 * * @param timeEnd 时间 * @return map */ public static Map getDateMap(String timeEnd) { Map dateMap = new HashMap<>(); ParsePosition pos = new ParsePosition(0); Date date = new SimpleDateFormat("yyyyMMddHHmmss").parse(timeEnd, pos); dateMap.put(DATE_KEY, new SimpleDateFormat("yyyy-MM-dd").format(date)); dateMap.put(TIME_KEY, new SimpleDateFormat("HH:mm:ss").format(date)); return dateMap; } public static String getMapInfo(Map paramsMap, String... ignored) { StringBuilder info = new StringBuilder(); boolean isIgnore; for (String key : paramsMap.keySet()) { isIgnore = false; if (ignored != null) { for (String item : ignored) { if (item.equals(key)) { isIgnore = true; break; } } } if (isIgnore) { continue; } info.append(key).append("=").append(paramsMap.get(key)).append(";"); // 拼接微信返回的信息 } return info.toString(); } }