You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					179 lines
				
				5.7 KiB
			
		
		
			
		
	
	
					179 lines
				
				5.7 KiB
			| 
											3 years ago
										 | 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<String, Object> map, String signType, String key) {
 | ||
|  |         try {
 | ||
|  |             Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> getReqXmlParamsMap(HttpServletRequest request) {
 | ||
|  |         String reqXml = getReqData(request);
 | ||
|  |         if (reqXml == null) {
 | ||
|  |             return null;
 | ||
|  |         }
 | ||
|  |         return XmlHelper.xmlOuterToMap(reqXml, false);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 从请求中获取xml数据并转换为对象
 | ||
|  |      *
 | ||
|  |      * @param request 请求
 | ||
|  |      * @return 对象
 | ||
|  |      */
 | ||
|  |     public static <T> T getReqXmlToBean(HttpServletRequest request ,Class<T> clazz) {
 | ||
|  |         Map<String, Object> paramsMap = getReqXmlParamsMap(request);
 | ||
|  |         if (paramsMap == null) {
 | ||
|  |             return null;
 | ||
|  |         }
 | ||
|  |         return JsonHelper.parseObject(JsonHelper.toJsonString(paramsMap), clazz);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 解析腾讯返回的时间
 | ||
|  |      *
 | ||
|  |      * @param timeEnd 时间
 | ||
|  |      * @return map
 | ||
|  |      */
 | ||
|  |     public static Map<String, String> getDateMap(String timeEnd) {
 | ||
|  |         Map<String, String> 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<String, Object> paramsMap, String... ignored) {
 | ||
|  |         StringBuilder info = new StringBuilder();
 | ||
|  |         boolean isIgnore;
 | ||
|  |         for (String key : paramsMap.keySet()) {
 | ||
|  |             isIgnore = false;
 | ||
|  |             if (ignored != null && ignored.length > 0) {
 | ||
|  |                 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();
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | }
 |