1 changed files with 125 additions and 0 deletions
			
			
		| @ -0,0 +1,125 @@ | |||||
|  | 
 | ||||
|  | package com.epmet.controller; | ||||
|  | 
 | ||||
|  | import org.slf4j.Logger; | ||||
|  | import org.slf4j.LoggerFactory; | ||||
|  | import org.springframework.web.bind.annotation.RequestMapping; | ||||
|  | import org.springframework.web.bind.annotation.RestController; | ||||
|  | 
 | ||||
|  | import javax.servlet.http.HttpServletRequest; | ||||
|  | import javax.servlet.http.HttpServletResponse; | ||||
|  | import java.io.IOException; | ||||
|  | import java.io.PrintWriter; | ||||
|  | import java.security.MessageDigest; | ||||
|  | import java.security.NoSuchAlgorithmException; | ||||
|  | import java.util.Arrays; | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | /** | ||||
|  |  * desc:微信配置测试 | ||||
|  |  * | ||||
|  |  * @author generator generator@elink-cn.com | ||||
|  |  * @since v1.0.0 2020-03-08 | ||||
|  |  */ | ||||
|  | @RestController | ||||
|  | @RequestMapping("wechat") | ||||
|  | public class WxController { | ||||
|  |     private static Logger log = LoggerFactory.getLogger(WxController.class); | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |     @RequestMapping("check") | ||||
|  |     public void doGet(HttpServletRequest request, HttpServletResponse response) { | ||||
|  |         log.debug("weixin get..."); | ||||
|  |         // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
 | ||||
|  |         String signature = request.getParameter("signature"); | ||||
|  |         // 时间戳
 | ||||
|  |         String timestamp = request.getParameter("timestamp"); | ||||
|  |         // 随机数
 | ||||
|  |         String nonce = request.getParameter("nonce"); | ||||
|  |         // 随机字符串
 | ||||
|  |         String echostr = request.getParameter("echostr"); | ||||
|  | 
 | ||||
|  |         // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
 | ||||
|  |         PrintWriter out = null; | ||||
|  |         try { | ||||
|  |             out = response.getWriter(); | ||||
|  |             if (WxController.checkSignature(signature, timestamp, nonce)) { | ||||
|  |                 log.debug("weixin get success...."); | ||||
|  |                 out.print(echostr); | ||||
|  |             } | ||||
|  |         } catch (IOException e) { | ||||
|  |             e.printStackTrace(); | ||||
|  |         } finally { | ||||
|  |             if (out != null) | ||||
|  |                 out.close(); | ||||
|  |         } | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 与接口配置信息中的Token要一致 | ||||
|  |      */ | ||||
|  |     private static String token = "o2opri3hschiwit"; | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 验证签名 | ||||
|  |      * | ||||
|  |      * @param signature | ||||
|  |      * @param timestamp | ||||
|  |      * @param nonce | ||||
|  |      * @return | ||||
|  |      */ | ||||
|  |     public static boolean checkSignature(String signature, String timestamp, String nonce) { | ||||
|  |         String[] arr = new String[]{token, timestamp, nonce}; | ||||
|  |         // 将token、timestamp、nonce三个参数进行字典序排序
 | ||||
|  |         Arrays.sort(arr); | ||||
|  |         StringBuilder content = new StringBuilder(); | ||||
|  |         for (int i = 0; i < arr.length; i++) { | ||||
|  |             content.append(arr[i]); | ||||
|  |         } | ||||
|  |         MessageDigest md = null; | ||||
|  |         String tmpStr = null; | ||||
|  | 
 | ||||
|  |         try { | ||||
|  |             md = MessageDigest.getInstance("SHA-1"); | ||||
|  |             // 将三个参数字符串拼接成一个字符串进行sha1加密
 | ||||
|  |             byte[] digest = md.digest(content.toString().getBytes()); | ||||
|  |             tmpStr = byteToStr(digest); | ||||
|  |         } catch (NoSuchAlgorithmException e) { | ||||
|  |             e.printStackTrace(); | ||||
|  |         } | ||||
|  | 
 | ||||
|  |         content = null; | ||||
|  |         // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
 | ||||
|  |         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 将字节数组转换为十六进制字符串 | ||||
|  |      * | ||||
|  |      * @param byteArray | ||||
|  |      * @return | ||||
|  |      */ | ||||
|  |     private static String byteToStr(byte[] byteArray) { | ||||
|  |         String strDigest = ""; | ||||
|  |         for (int i = 0; i < byteArray.length; i++) { | ||||
|  |             strDigest += byteToHexStr(byteArray[i]); | ||||
|  |         } | ||||
|  |         return strDigest; | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     /** | ||||
|  |      * 将字节转换为十六进制字符串 | ||||
|  |      * | ||||
|  |      * @param mByte | ||||
|  |      * @return | ||||
|  |      */ | ||||
|  |     private static String byteToHexStr(byte mByte) { | ||||
|  |         char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; | ||||
|  |         char[] tempArr = new char[2]; | ||||
|  |         tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; | ||||
|  |         tempArr[1] = Digit[mByte & 0X0F]; | ||||
|  | 
 | ||||
|  |         String s = new String(tempArr); | ||||
|  |         return s; | ||||
|  |     } | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue