有一个这样简单的需求,用户发送消息到公众号,经过Java后台的逻辑处理后,返回处理结果给用户。

1. 编写接入代码

编写代码之前我们需要引入两个依赖。

<!--编解码-->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version>
</dependency><!--解析xml-->
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.0.0</version>
</dependency>

我们需要向微信后台暴露一个接口,以供微信调用。这里采用get请求方式,请求路径自己定义。
微信会给我们传signaturetimestampnonceechostr 四个参数,我们需要做的是用前三个参数做校验,校验成功之后原封不动的返回echostr
这里需要自定义设置一个TOKEN的值,后续配置用得到。

@RestController
public class WxController {public static final String TOKEN = "123456";@GetMapping("/wx/echo")public String echo(HttpServletRequest req, HttpServletResponse resp) {// 1.获取微信传入的4个参数String signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");// 2.用timestamp, nonce, signature进行校验boolean result = check(timestamp, nonce, signature);if (result) {// 3.校验成功返回echostrreturn echostr;}return "error!";}public static boolean check(String timestamp, String nonce, String signature) {// 1.按字典序对TOKEN, timestamp和nonce排序String[] arr = new String[]{TOKEN,timestamp,nonce};Arrays.sort(arr);// 2.将3个参数拼成一个字符串进行sha1加密String str = arr[0]+arr[1]+arr[2];// 3.用commons-codec包中的工具类进行sha1加密str = DigestUtils.sha1Hex(str);// 4.将加密后的字符串和signature比较System.out.println(signature);return str.equalsIgnoreCase(signature);}
}

2.公众号配置

登陆公众号后台,选择基本配置。URL填入你的接口地址,Token与步骤1中定义的TOKEN保持一致。简单起见,EncodingAESKey随机生成,消息加密方式选择明文模式。

点击提交,提示提交成功。

由于URL使用的是80端口,而后台服务不一定是80端口,所以这里需要用nginx做一些反向代理。

location ~ / {proxy_pass http://127.0.0.1:8080;
}

3.接收用户消息

上述操作已经成功连接微信与Java后台,接下来接受用户发送的消息。
当普通微信用户向公众账号发消息时,微信服务器将 POST 消息的 XML 数据包到开发者填写的 URL 上。数据包格式如下。

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId><MsgDataId>xxxx</MsgDataId><Idx>xxxx</Idx>
</xml>

我们写一个post接口,用来解析消息、逻辑处理以及回复消息。路径与步骤二中的URL一致。

@PostMapping("/wx/echo")
public String echoPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.解析消息Map<String, String> param = parseRequest(req.getInputStream());// 2.逻辑处理(可以根据自身逻辑进行处理,这里略)// ...........// 3.回复消息String textMsg = "<xml>" +"<ToUserName><![CDATA["+ param.get("FromUserName")+"]]></ToUserName>" +"<FromUserName><![CDATA["+ param.get("ToUserName")+"]]></FromUserName>" +"<CreateTime>12345678</CreateTime>" +"<MsgType><![CDATA[text]]></MsgType>" +"<Content><![CDATA[你好]]></Content>" +"</xml>";return textMsg;
}// 利用dom4j中的类进行解析
public static Map<String, String> parseRequest(InputStream is) {Map<String,String> map = new HashMap();// 1. 通过io流得到文档对象SAXReader saxReader = new SAXReader();Document document = null;try {document = saxReader.read(is);} catch (DocumentException e) {e.printStackTrace();}// 2.通过文档对象得到根节点对象Element root = document.getRootElement();// 3.通过根节点对象获取所有子节点对象List<Element> elements = root.elements();// 4.将所有节点放入mapfor (Element element : elements) {map.put(element.getName(), element.getStringValue());}return map;
}

上述代码,无论我们发送什么消息给公众号,公众号都将回复你好
由于微信会进行超时重试,因此需要进行排重。建议使用redis进行排重,这里不做演示。

功能测试

微信公众号如何接入Java后台相关推荐

  1. 微信公众号简单接入springboot集成weixin4j

    微信公众号简单接入springboot集成weixin4j 内网穿透 登录地址:https://natapp.cn/ 注册用户,购买免费渠道 进行配置端口号(我配置的是8802) 根据网址进行下一步操 ...

  2. 微信公众号HTML5接入腾讯云人脸核身

    微信公众号HTML5接入腾讯云人脸核身 概述 接入流程 原生H5对行业的要求 概述 针对微信公众号接入腾讯云,腾讯云提供了两种方案,一种是通用H5接入,另外一种是通过微信的原生H5来接入,但是一般都是 ...

  3. 用php搭建公众号服务器,如何快速给自己的微信公众号搭建自己的后台服务端

    想要快速给自己的微信公众号搭建自己的后台服务端,该怎么办呢,那么如何快速给自己的微信公众号搭建自己的后台服务端的呢?下面是学习啦小编收集整理的如何快速给自己的微信公众号搭建自己的后台服务端,希望对大家 ...

  4. 微信公众号开发java流程_微信公众号开发教程java 编程语言的特点及选择

    微信公众号开发教程java 编程语言的特点及选择 微信公众号为用户提供了相关的工具,来对微信公众号进行一个简单的开发.但是如果想实现一些复杂的功能,其实还是要借助于一些编程语言的使用.所以要了解,在微 ...

  5. 网络架构、云平台和微信公众号开发接入--基于嵌入式工程师的视觉

    云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智 ...

  6. 微信公众号开发-接入

    一 首先实现内网穿透,公众号需要连接我们的服务器,内外无法访问,所以先实现自己的内网可以测试时连接外网,下载natapp,选择windows,顺便下载config,ini 配置文件.注册好购买免费的隧 ...

  7. wechat-0010,微信公众号,接入微信公众平台

    demo:https://github.com/wenrongyao/wechat-demo 接入准备: 1.有一个能在公网上访问的项目 可以用内网穿透(推荐使用natapp),微信接入必须使用80端 ...

  8. 微信公众号 授权登录 JAVA

    微信授权登录 java 首先 腾讯那么大的公司 文档写的那么low 微信那么火 demo写的那么差 我就想说一句  微信简直就是在歧视Java 我这边自己整合了下 微信支付和微信登录 java的代码  ...

  9. 微信公众号如何接入ChatGPT机器人

    不难,代码总共也就25行,大致逻辑如下. 总共分为是下面两步 文章目录 在云服务器上部署自定义消息处理服务 微信公众号配置自己的消息处理服务器 在云服务器上部署自定义消息处理服务 这里需要我们自定义来 ...

最新文章

  1. 【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
  2. 缓存失效策略(FIFO,LRU,LFU)
  3. 泰拉瑞亚服务器config修改,泰拉瑞亚配置怎么修改_泰拉瑞亚配置修改方法介绍...
  4. 洛谷 P1890 gcd区间
  5. fetch结合(async函数来使用)
  6. Java的结构之美【2】——销毁对象
  7. python3实现国密SM4算法
  8. 【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
  9. vr电力作业安全培训覆盖三大板块,为学员提供高仿真的技能培训
  10. 设计模式之策略模式:鸭子模式
  11. MFC 创建模态与非模态对话框
  12. 华为手机怎么进入recovery模式
  13. 建立学习型组织 - 解决了我几年的困惑
  14. clap与slap_clap什么意思(slap与clap的区别)
  15. 使用PDF补丁丁批量导入书签的办法
  16. postgresql 通过制作函数实现16进制转换为10进制
  17. Thinkphp源码分析系列–开篇
  18. 免费常用API大全,程序员必备
  19. 【DB宝48】JumpServer:多云环境下更好用的堡垒机
  20. Nginx 网页加密访问功能

热门文章

  1. 基于SpringBoot家庭理财系统(Java项目)
  2. Jena的简单理解和一个例子
  3. 阿里云python轻应用学习笔记(二)---开发一个LED跑马灯程序
  4. STM32如何使用STLINK下载程序:点亮LED跑马灯(库版本)
  5. 神经网络的构建过程,图神经网络的实现
  6. EM算法实例及python实现
  7. 字节跳动抖音研发---测试开发三面---面经(附答案)【接口/自动化/web】测试面试题
  8. Java千百问_07JVM架构(009)_什么是新生代的复制算法
  9. 简单直白教你理解Java中四大引用强引用,软引用,弱引用,虚引用
  10. 指纹识别-(8)指纹图像预处理算法之图像分割