阅读量:0
企业微信的接收消息服务器的程序用Java代码实现以下功能
1.接收并解析企业微信发送的消息
2.验证消息的合法性(签名验证)
3.根据消息内容进行相应的业务处理
接受消息服务器配置
登录企业微信后台管理
参考链接
企业微信 开发者 官方文档
https://developer.work.weixin.qq.com/tutorial/detail/38
java加解密库下载
https://developer.work.weixin.qq.com/devtool/introduce?id=10128
,这里,我下载的是json版本的
下载后解压如图
Sample 是一个测试类,com\qq\weixin\mp\aes 里是一些工具类,直接粘贴到项目使用,
实现代码
pom文件可能需要加入的依赖,(如果不是maven项目,直接用lib里的jar)
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20200518</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>org.gavaghan</groupId> <artifactId>geodesy</artifactId> <version>1.1.3</version> </dependency>
controller代码
import lombok.extern.slf4j.Slf4j; import org.example.common.wei.WXBizJsonMsgCrypt; import org.springframework.web.bind.annotation.GetMapping; 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.PrintWriter; @Slf4j @RestController @RequestMapping("/weChat") public class WeChatCallBackController { @GetMapping( "/callBackUrl") public void callbackUrl(HttpServletRequest request, HttpServletResponse response) throws Exception{ // 微信加密签名 String sVerifyMsgSig = request.getParameter("msg_signature"); // 时间戳 String sVerifyTimeStamp = request.getParameter("timestamp"); // 随机数 String sVerifyNonce = request.getParameter("nonce"); // 随机字符串 String sVerifyEchoStr = request.getParameter("echostr"); System.out.println("request=" + request.getRequestURL()); String sToken = "XXXXXXXXXXXX";// 和设置服务器接受页面的保持一样,直接随机形成粘贴过来 String sCorpID = "XXXXXXXXXXXX";//企业id String sEncodingAESKey = "XXXXXXXXXXXX;// 和设置服务器接受页面的保持一样,直接随机形成粘贴过来使用 PrintWriter out = response.getWriter(); // 通过检验msg_signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 String sEchoStr = null; try { WXBizJsonMsgCrypt wxcpt = new WXBizJsonMsgCrypt(sToken, sEncodingAESKey, sCorpID); sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr); System.out.println("verifyurl echostr: " + sEchoStr); // 验证URL成功,将sEchoStr返回 // HttpUtils.SetResponse(sEchoStr); } catch (Exception e) { //验证URL失败,错误原因请查看异常 e.printStackTrace(); } if (sEchoStr == null) { sEchoStr = sToken; } out.print(sEchoStr); out.close(); out = null; } }
将上面服务 发布到外网,暴露接口,可公网访问的,
然后配置到页面上(https://XXXXXX/weChat/callBackUrl)
内网穿透,可公网访问的方法
自己临时测试时,采用内网穿透 将自己本地的地址打到公网上
1. 钉钉内网穿透方法
2. cloudflare内网穿透
https://blog.51cto.com/u_16099345/9937648
3. Localtunnel端口映射工具
官方后端服务器源码 https://github.com/localtunnel/server
winds 上 cmd 打开黑窗口 (localtunnel是用Node.js写的,所以必须先安装NodeJS环境)
安装 npm install -g localtunnel 执行 假设你的本地服务器在端口 8000 上运行,只需使用 LT 命令来启动隧道 lt --port 8000 lt --port 8000 --subdomain xxxxx 上面两个lt命令都行,第一个是默认域名随机生成一个,第二个指定域名 port:指定连接本地指定的服务端口 subdomain:设置固定的访问域名前缀(默认为随机字符),不要使用驼峰命名 直接访问 lt命令执行后的 your url is 后面的地址,就是代理后的地址