WeComController.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package com.tzld.piaoquan.wecom.controller;
  2. import com.tzld.piaoquan.wecom.common.constant.WeComServerConstant;
  3. import com.tzld.piaoquan.wecom.utils.wecom.AesException;
  4. import com.tzld.piaoquan.wecom.utils.wecom.WXBizMsgCrypt;
  5. import com.tzld.piaoquan.wecom.utils.wecom.WxUtil;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.redis.core.RedisTemplate;
  9. import org.springframework.web.bind.annotation.*;
  10. import javax.servlet.ServletInputStream;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import java.io.BufferedReader;
  14. import java.io.InputStreamReader;
  15. import java.io.PrintWriter;
  16. import java.util.Map;
  17. @Slf4j
  18. @RestController
  19. @RequestMapping("/wecom/server")
  20. public class WeComController {
  21. @Autowired
  22. RedisTemplate<String, Object> redisTemplate;
  23. @GetMapping("/verify")
  24. public void verifyGet(HttpServletRequest request, HttpServletResponse response) {
  25. try {
  26. // 微信加密签名
  27. String msgSignature = request.getParameter("msg_signature");
  28. // 时间戳
  29. String timestamp = request.getParameter("timestamp");
  30. // 随机数
  31. String nonce = request.getParameter("nonce");
  32. // 随机字符串
  33. // 如果是刷新,需返回原echostr
  34. String echoStr = request.getParameter("echostr");
  35. // 微信加密签名
  36. WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeComServerConstant.TOKEN, WeComServerConstant.EncodingAESKey, WeComServerConstant.CorpID);
  37. String sEchoStr = ""; //需要返回的明文
  38. PrintWriter out;
  39. sEchoStr = wxcpt.VerifyURL(msgSignature, timestamp,
  40. nonce, echoStr);
  41. log.info("verifyurl echostr: " + sEchoStr);
  42. // 验证URL成功,将sEchoStr返回
  43. out = response.getWriter();
  44. out.print(sEchoStr);
  45. } catch (Exception e) {
  46. //验证URL失败,错误原因请查看异常
  47. log.error("verifyGet error", e);
  48. }
  49. }
  50. /**
  51. * 刷新 ticket
  52. */
  53. @PostMapping(value = "/verify")
  54. public String verifyPost(HttpServletRequest request) {
  55. try {
  56. // 微信加密签名
  57. String msg_signature = request.getParameter("msg_signature");
  58. // 时间戳
  59. String timestamp = request.getParameter("timestamp");
  60. // 随机数
  61. String nonce = request.getParameter("nonce");
  62. String type = request.getParameter("type");
  63. String corpId = request.getParameter("corpid");
  64. String id = "";
  65. // 访问应用和企业回调传不同的ID
  66. if (type.equals("data")) {
  67. id = corpId;
  68. } else {
  69. id = WeComServerConstant.SuiteID;
  70. }
  71. WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(WeComServerConstant.TOKEN, WeComServerConstant.EncodingAESKey, id);
  72. String postData = ""; // 密文,对应POST请求的数据
  73. //1.获取加密的请求消息:使用输入流获得加密请求消息postData
  74. ServletInputStream in = request.getInputStream();
  75. BufferedReader reader = new BufferedReader(new InputStreamReader(in));
  76. String tempStr = ""; //作为输出字符串的临时串,用于判断是否读取完毕
  77. while (null != (tempStr = reader.readLine())) {
  78. postData += tempStr;
  79. }
  80. String suiteXml = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData);
  81. log.info("suiteXml: " + suiteXml);
  82. Map suiteMap = WxUtil.transferXmlToMap(suiteXml);
  83. if (suiteMap.get("SuiteTicket") != null) {
  84. String suiteTicket = (String) suiteMap.get("SuiteTicket");
  85. redisTemplate.opsForValue().set("suiteTicket", suiteTicket);
  86. } else if (suiteMap.get("AuthCode") != null) {
  87. String authCode = (String) suiteMap.get("AuthCode");
  88. redisTemplate.opsForValue().set("authCode", authCode);
  89. }
  90. } catch (Exception e) {
  91. log.error("verifyPost error", e);
  92. }
  93. return "success";
  94. }
  95. }