WechatGatewayController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package com.java110.front.controller;
  2. import com.java110.core.base.controller.BaseController;
  3. import com.java110.core.factory.AuthenticationFactory;
  4. import com.java110.core.factory.WechatFactory;
  5. import com.java110.utils.constant.WechatConstant;
  6. import com.java110.utils.util.StringUtil;
  7. import org.dom4j.Document;
  8. import org.dom4j.DocumentHelper;
  9. import org.dom4j.Element;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.http.HttpStatus;
  13. import org.springframework.http.ResponseEntity;
  14. import org.springframework.web.bind.annotation.RequestBody;
  15. import org.springframework.web.bind.annotation.RequestMapping;
  16. import org.springframework.web.bind.annotation.RequestMethod;
  17. import org.springframework.web.bind.annotation.RestController;
  18. import javax.servlet.ServletInputStream;
  19. import javax.servlet.http.HttpServletRequest;
  20. import java.io.BufferedReader;
  21. import java.io.IOException;
  22. import java.io.InputStreamReader;
  23. import java.util.Arrays;
  24. /**
  25. * @ClassName WechatController
  26. * @Description TODO 微信 对接类
  27. * @Author wuxw
  28. * @Date 2020/6/13 21:48
  29. * @Version 1.0
  30. * add by wuxw 2020/6/13
  31. **/
  32. @RestController
  33. @RequestMapping(path = "/app/wechat")
  34. public class WechatGatewayController extends BaseController {
  35. private final static Logger logger = LoggerFactory.getLogger(WechatGatewayController.class);
  36. /**
  37. * 微信登录接口
  38. *
  39. * @param request
  40. */
  41. @RequestMapping(path = "/gateway", method = RequestMethod.GET)
  42. public ResponseEntity<String> gateway(HttpServletRequest request) {
  43. String token = WechatConstant.TOKEN;
  44. String signature = request.getParameter("signature");
  45. String timestamp = request.getParameter("timestamp");
  46. String nonce = request.getParameter("nonce");
  47. String echostr = request.getParameter("echostr");
  48. String responseStr = "";
  49. logger.debug("token = " + token + "||||" + "signature = " + signature + "|||" + "timestamp = "
  50. + timestamp + "|||" + "nonce = " + nonce + "|||" + "echostr = " + echostr);
  51. String sourceString = "";
  52. String[] ss = new String[]{token, timestamp, nonce};
  53. Arrays.sort(ss);
  54. for (String s : ss) {
  55. sourceString += s;
  56. }
  57. String signature1 = AuthenticationFactory.SHA1Encode(sourceString).toLowerCase();
  58. logger.debug("sourceString = " + sourceString + "||||" + "signature1 = " + signature1);
  59. try {
  60. if (signature1.equals(signature)) {
  61. if (echostr == null) {
  62. String postStr = this.readStreamParameter(request.getInputStream());
  63. if (StringUtil.isEmpty(postStr)) {
  64. responseStr = "未输入任何内容";
  65. } else {
  66. /*if (postStr.equals(new String(postStr.getBytes("ISO-8859-1"), "ISO-8859-1"))) {
  67. logger.debug(" This type is iso-8859-1");
  68. postStr = new String(postStr.getBytes("ISO-8859-1"), "UTF-8");
  69. }
  70. if (postStr.equals(new String(postStr.getBytes("GB2312"), "GB2312"))) {
  71. logger.debug(" This type is GB2312" + postStr);
  72. postStr = new String(postStr.getBytes("GB2312"), "UTF-8");
  73. logger.debug(" change postStr to utf-8 " + postStr);
  74. }
  75. if (postStr.equals(new String(postStr.getBytes("GBK"), "GBK"))) {
  76. logger.debug(" This type is GBK");
  77. postStr = new String(postStr.getBytes("GBK"), "UTF-8");
  78. }
  79. postStr = new String(postStr.getBytes("GB2312"), "UTF-8");*/
  80. Document document = DocumentHelper.parseText(postStr);
  81. Element root = document.getRootElement();
  82. String fromUserName = root.elementText("FromUserName");
  83. String toUserName = root.elementText("ToUserName");
  84. String keyword = root.elementTextTrim("Content");
  85. String msgType = root.elementTextTrim("MsgType");
  86. String event = root.elementText("Event");
  87. String eventKey = root.elementText("EventKey");
  88. if (WechatConstant.MSG_TYPE_TEXT.equals(msgType)) {
  89. responseStr = textResponseHandler(fromUserName, toUserName, keyword);
  90. } else if (WechatConstant.MSG_TYPE_EVENT.equals(msgType)) {
  91. responseStr = eventResponseHandler(fromUserName, toUserName, keyword, event, eventKey);
  92. } else {
  93. responseStr = eventResponseHandler(fromUserName, toUserName, keyword, event, eventKey);
  94. }
  95. }
  96. } else {
  97. responseStr = echostr;
  98. }
  99. logger.debug(">>>>>>>>>>>>>..responseStr>>>>>>>>>>>>>>>" + responseStr);
  100. } else {
  101. responseStr = "亲,非法访问,签名失败";
  102. }
  103. } catch (Exception e) {
  104. // TODO Auto-generated catch block
  105. logger.error("处理失败", e);
  106. responseStr = "亲,网络超时,请稍后重试";
  107. }
  108. return new ResponseEntity<String>(responseStr, HttpStatus.OK);
  109. }
  110. /**
  111. * 微信登录接口
  112. *
  113. * @param request
  114. */
  115. @RequestMapping(path = "/gateway", method = RequestMethod.POST)
  116. public ResponseEntity<String> gateway(@RequestBody String param, HttpServletRequest request) {
  117. String token = WechatConstant.TOKEN;
  118. String signature = request.getParameter("signature");
  119. String timestamp = request.getParameter("timestamp");
  120. String nonce = request.getParameter("nonce");
  121. String responseStr = "";
  122. logger.debug("token = " + token + "||||" + "signature = " + signature + "|||" + "timestamp = "
  123. + timestamp + "|||" + "nonce = " + nonce);
  124. String sourceString = "";
  125. String[] ss = new String[]{token, timestamp, nonce};
  126. Arrays.sort(ss);
  127. for (String s : ss) {
  128. sourceString += s;
  129. }
  130. String signature1 = AuthenticationFactory.SHA1Encode(sourceString).toLowerCase();
  131. logger.debug("sourceString = " + sourceString + "||||" + "signature1 = " + signature1);
  132. try {
  133. if (signature1.equals(signature)) {
  134. String postStr = param;//this.readStreamParameter(request.getInputStream());
  135. if (StringUtil.isEmpty(postStr)) {
  136. responseStr = "未输入任何内容";
  137. } else {
  138. /*if (postStr.equals(new String(postStr.getBytes("ISO-8859-1"), "ISO-8859-1"))) {
  139. logger.debug(" This type is iso-8859-1");
  140. postStr = new String(postStr.getBytes("ISO-8859-1"), "UTF-8");
  141. }
  142. if (postStr.equals(new String(postStr.getBytes("GB2312"), "GB2312"))) {
  143. logger.debug(" This type is GB2312" + postStr);
  144. postStr = new String(postStr.getBytes("GB2312"), "UTF-8");
  145. logger.debug(" change postStr to utf-8 " + postStr);
  146. }
  147. if (postStr.equals(new String(postStr.getBytes("GBK"), "GBK"))) {
  148. logger.debug(" This type is GBK");
  149. postStr = new String(postStr.getBytes("GBK"), "UTF-8");
  150. }
  151. postStr = new String(postStr.getBytes("GB2312"), "UTF-8");*/
  152. Document document = DocumentHelper.parseText(postStr);
  153. Element root = document.getRootElement();
  154. String fromUserName = root.elementText("FromUserName");
  155. String toUserName = root.elementText("ToUserName");
  156. String keyword = root.elementTextTrim("Content");
  157. String msgType = root.elementTextTrim("MsgType");
  158. String event = root.elementText("Event");
  159. String eventKey = root.elementText("EventKey");
  160. if (WechatConstant.MSG_TYPE_TEXT.equals(msgType)) {
  161. responseStr = textResponseHandler(fromUserName, toUserName, keyword);
  162. } else if (WechatConstant.MSG_TYPE_EVENT.equals(msgType)) {
  163. responseStr = eventResponseHandler(fromUserName, toUserName, keyword, event, eventKey);
  164. } else {
  165. responseStr = eventResponseHandler(fromUserName, toUserName, keyword, event, eventKey);
  166. }
  167. }
  168. logger.debug(">>>>>>>>>>>>>..responseStr>>>>>>>>>>>>>>>" + responseStr);
  169. } else {
  170. responseStr = "亲,非法访问,签名失败";
  171. }
  172. } catch (Exception e) {
  173. // TODO Auto-generated catch block
  174. logger.error("处理失败", e);
  175. responseStr = "亲,网络超时,请稍后重试";
  176. }
  177. return new ResponseEntity<String>(responseStr, HttpStatus.OK);
  178. }
  179. /**
  180. * 鏂囨湰淇℃伅鍥炲
  181. *
  182. * @param fromUserName
  183. * @param toUserName
  184. * @param keyword
  185. * @return
  186. */
  187. private String textResponseHandler(String fromUserName, String toUserName,
  188. String keyword) {
  189. if (keyword == null || keyword.length() == 0) {
  190. return WechatFactory
  191. .formatText(toUserName, fromUserName, "未包含任何信息");
  192. } else {
  193. String responseStr = keyWordHandler(fromUserName, toUserName,
  194. keyword);
  195. return WechatFactory
  196. .formatText(toUserName, fromUserName, responseStr);
  197. }
  198. }
  199. private String keyWordHandler(String fromUserName, String toUserName,
  200. String keyword) {
  201. // TODO Auto-generated method stub
  202. String domain = WechatConstant.TOKEN;
  203. //String url = domain + "/IMSS/indexPage.do";
  204. return "HC小区物业管理系统是由java110团队于2017年4月份发起的前后端分离、分布式架构开源项目,目前我们的代码开源在github 和gitee上,开源项目由HC小区管理系统后端,HC小区管理系统前端,HC小区管理系统业主手机版和HC小区管理系统物业手机版,业务技术交流群:827669685";
  205. }
  206. /**
  207. * 事件处理
  208. *
  209. * @param fromUserName
  210. * @param toUserName
  211. * @param event
  212. * @param eventKey
  213. * @return
  214. * @throws Exception
  215. */
  216. @SuppressWarnings({"unchecked"})
  217. public String eventResponseHandler(String fromUserName, String toUserName, String keyWords, String event,
  218. String eventKey) throws Exception {
  219. String resultStr = "";
  220. //
  221. if (event.equals("subscribe")) {
  222. resultStr = "HC小区物业管理系统是由java110团队于2017年4月份发起的前后端分离、分布式架构开源项目,目前我们的代码开源在github 和gitee上,开源项目由HC小区管理系统后端,HC小区管理系统前端,HC小区管理系统业主手机版和HC小区管理系统物业手机版,业务技术交流群:827669685";
  223. } else if (event.equals("unsubscribe")) {
  224. } else if (event.equalsIgnoreCase("CLICK")) {
  225. resultStr = textResponseHandler(fromUserName, toUserName,
  226. eventKey);
  227. } else {
  228. }
  229. return WechatFactory.formatText(toUserName, fromUserName, resultStr);
  230. }
  231. public String readStreamParameter(ServletInputStream in) {
  232. StringBuilder buffer = new StringBuilder();
  233. BufferedReader reader = null;
  234. try {
  235. reader = new BufferedReader(new InputStreamReader(in));
  236. String line = null;
  237. while ((line = reader.readLine()) != null) {
  238. buffer.append(line);
  239. }
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. } finally {
  243. if (null != reader) {
  244. try {
  245. reader.close();
  246. } catch (IOException e) {
  247. e.printStackTrace();
  248. }
  249. }
  250. }
  251. logger.debug("公众号内容:" + buffer.toString());
  252. return buffer.toString();
  253. }
  254. }