package com.tzld.piaoquan.wecom.controller; import com.tzld.piaoquan.wecom.common.constant.WeComServerConstant; import com.tzld.piaoquan.wecom.utils.wecom.AesException; import com.tzld.piaoquan.wecom.utils.wecom.WXBizMsgCrypt; import com.tzld.piaoquan.wecom.utils.wecom.WxUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Map; @Slf4j @RestController @RequestMapping("/wecom/server") public class WeComController { @Autowired RedisTemplate redisTemplate; @GetMapping("/verify") public void verifyGet(HttpServletRequest request, HttpServletResponse response) { try { // 微信加密签名 String msgSignature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 // 如果是刷新,需返回原echostr String echoStr = request.getParameter("echostr"); // 微信加密签名 WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeComServerConstant.TOKEN, WeComServerConstant.EncodingAESKey, WeComServerConstant.CorpID); String sEchoStr = ""; //需要返回的明文 PrintWriter out; sEchoStr = wxcpt.VerifyURL(msgSignature, timestamp, nonce, echoStr); log.info("verifyurl echostr: " + sEchoStr); // 验证URL成功,将sEchoStr返回 out = response.getWriter(); out.print(sEchoStr); } catch (Exception e) { //验证URL失败,错误原因请查看异常 log.error("verifyGet error", e); } } /** * 刷新 ticket */ @PostMapping(value = "/verify") public String verifyPost(HttpServletRequest request) { try { // 微信加密签名 String msg_signature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); String type = request.getParameter("type"); String corpId = request.getParameter("corpid"); String id = ""; // 访问应用和企业回调传不同的ID if (type.equals("data")) { id = corpId; } else { id = WeComServerConstant.SuiteID; } WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeComServerConstant.TOKEN, WeComServerConstant.EncodingAESKey, id); String postData = ""; // 密文,对应POST请求的数据 //1.获取加密的请求消息:使用输入流获得加密请求消息postData ServletInputStream in = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String tempStr = ""; //作为输出字符串的临时串,用于判断是否读取完毕 while (null != (tempStr = reader.readLine())) { postData += tempStr; } String suiteXml = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData); log.info("suiteXml: " + suiteXml); Map suiteMap = WxUtil.transferXmlToMap(suiteXml); if (suiteMap.get("SuiteTicket") != null) { String suiteTicket = (String) suiteMap.get("SuiteTicket"); redisTemplate.opsForValue().set("suiteTicket", suiteTicket); } else if (suiteMap.get("AuthCode") != null) { String authCode = (String) suiteMap.get("AuthCode"); redisTemplate.opsForValue().set("authCode", authCode); } } catch (Exception e) { log.error("verifyPost error", e); } return "success"; } }