本文共 7385 字,大约阅读时间需要 24 分钟。
package com.tian.spring_boot.controller;import cn.hutool.core.util.XmlUtil;import com.tian.spring_boot.service.WxService;import com.tian.spring_boot.utils.WeiXinParamesUtil;import com.tian.spring_boot.weixin.mp.aes.AesException;import com.tian.spring_boot.weixin.mp.aes.WXBizMsgCrypt;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RestController;import org.w3c.dom.Document;import org.w3c.dom.Element;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import java.io.IOException;import java.io.PrintWriter;/** * @ProjectName: spring_boot * @Package: com.tian.spring_boot.controller * @ClassName: WxController * @Author: TZQ * @Date: 2021/5/14 16:22 * @Version: 1.0 */@RestControllerpublic class WxController { @Autowired private WxService wxService; @GetMapping("/WxReceiveMessage") public void coreJoinGet(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 微信加密签名 String msg_signature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); System.out.println("msg_signature = " + msg_signature); System.out.println("timestamp = " + timestamp); System.out.println("nonce = " + nonce); System.out.println("echostr = " + echostr); System.out.println("request=" + request.getRequestURL()); PrintWriter out = response.getWriter(); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 String result = null; try { WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId); result = crypt.verifyUrl(msg_signature, timestamp, nonce, echostr); } catch (AesException e) { e.printStackTrace(); } if (result == null) { result = WeiXinParamesUtil.token; } out.write(result); out.close(); out = null; } @PostMapping("/WxReceiveMessage") public void coreJoinPost(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String timeMillis = System.currentTimeMillis() + ""; // 微信加密签名 String msg_signature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); PrintWriter out = response.getWriter(); String result = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(request.getInputStream()); Element root = document.getDocumentElement(); String corpID = root.getElementsByTagName("ToUserName").item(0).getTextContent(); String agentID = root.getElementsByTagName("AgentID").item(0).getTextContent(); String encrypt = root.getElementsByTagName("Encrypt").item(0).getTextContent();//用户发送的内容 System.out.println("CorpID = " + corpID); System.out.println("agentID = " + agentID); System.out.println("encrypt = " + encrypt); WXBizMsgCrypt crypt = new WXBizMsgCrypt(WeiXinParamesUtil.token, WeiXinParamesUtil.encodingAESKey, WeiXinParamesUtil.corpId); result = crypt.verifyUrl(msg_signature, timestamp, nonce, encrypt); System.out.println("result = " + result); Document parse = XmlUtil.readXML(result); String fromUserName = parse.getElementsByTagName("FromUserName").item(0).getTextContent(); String createTime = parse.getElementsByTagName("CreateTime").item(0).getTextContent(); String msgType = parse.getElementsByTagName("MsgType").item(0).getTextContent(); String content = parse.getElementsByTagName("Content").item(0).getTextContent(); String msgId = parse.getElementsByTagName("MsgId").item(0).getTextContent(); System.out.println("FromUserName = " + fromUserName); System.out.println("CreateTime = " + createTime); System.out.println("MsgType = " + msgType); System.out.println("Content = " + content); System.out.println("MsgId = " + msgId); String msg = ""; //对用户发送过来的内容选择要回复的内容 //PS:这边你就可以对用户传过来的参数进行一个除了根据回复的内容配合自己的业务 if (content.contains("df")) { content = content.substring(2); if (wxService.confirmPayment(fromUserName, content)) { msg = "党费确认成功!"; } } String replyMsg = "" + " "; System.out.println("replyMsg = " + replyMsg);//打印出来 //这里可以存放你要自动回复给用户的信息 String encryptMsg = crypt.encryptMsg(replyMsg, timeMillis, nonce); System.out.println("encryptMsg = " + encryptMsg); out.println(encryptMsg);//回复 } catch (Exception e) { System.out.println(e.toString()); } }}"//成员UserID + " "//企业微信CorpID + " " + timeMillis + " "//消息创建时间(整型) + ""//消息类型,此时固定为:text + " "//文本消息内容,最长不超过2048个字节,超过将截断 + "
WeiXinParamesUtil类
package com.tian.spring_boot.utils;/** * @ProjectName: spring_boot * @Package: com.tian.spring_boot.utils * @ClassName: WeiXinParamesUtil * @Author: TZQ * @Date: 2021/5/16 14:49 * @Version: 1.0 */public class WeiXinParamesUtil { //token public final static String token = "ttzzqq"; // encodingAESKey public final static String encodingAESKey = "aJx22afLihLkcLdTQJg0C4wB5qUApoDg3tS6KOvUSCj"; //企业ID,可以在企业微信后台->我的企业->企业信息->拉到最下面能看见 public final static String corpId = "ww0971b514e055647b"; //应用的凭证密钥 public final static String corpsecret = "7LFu67ghtdsQGaJOcc_y4RLX61y0qqYXZ8O39x6J46I";}
大致的代码就这些,然后主要说一下里面的坑
有些时候你本地进行测试的时候发送官方给的请求例子可以访问成功 但是放在官方测试的时候就不可以,这个时候你要试一下你本地项目能不能被外网进行访问 如果不能访问的话可以关闭防火墙试试,也可以进行内网穿透来完成 我这边用的是内网穿透,如果有小伙伴要跟我一样方法解决可以看下面这个文章 有其他问题也可以进行留言和私聊,主要看网上没有一个最新的教程,就想着自己琢磨出来的就记录一下,供大家进行一个参考转载地址:http://fbezi.baihongyu.com/