Java-Spring Boot-微信公众号(二)用户关注
2021-10-05 本文已影响0人
唔哒喂
完整代码见文末
文末直接复制内容到自己的程序中就可运行
本篇并未写在用户关注后如何返回内容
用户在关注与取消关注公众号时,微信会把这个事件推送(POST)到开发者填写的URL。(与连接的URL相同,只是请求方式为Post。)
image.png
Maven中添加这两个jar包
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
接收微信Post的XML字段
使用dom4j中SaxReader类读取信息
SAXReader saxReader = new SAXReader();
Document read = saxReader.read(req.getInputStream());
将读取到的信息存入一个Map中
//得到根节点
Element rootElement = read.getRootElement();
//获得子节点
List<Element> elements = rootElement.elements();
for (Element e:
elements) {
//将数据存进map
map.put(e.getName(), e.getStringValue());
}
判断是否为关注
根据官方文档,用户关注会给我们发送这些信息。
image.png
image.png
在上一步中,信息已被存入Map。所以我们可以比对存入的Key为 Event对应的Value值是否为subscribe,即可得是否为用户关注。
首先要判断一下是否包含Event这个Key,不然直接取会报错。
if (map.containsKey("Event") && map.get("Event").equals("subscribe"))
在这之后就可以做用户关注对应的处理了。
处理关注
我的只是简单回复一个关注的友好提示。
这个就是微信中的返回文本信息的方式,返回文本信息见下一篇。
见下。
image.png
完整代码
Maven添加
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
接收用户关注Post(不包含返回信息)
@PostMapping(value = "/connect")
public void getXml(HttpServletRequest req, HttpServletResponse resp) throws IOException, DocumentException {
req.setCharacterEncoding("UTF-8"); // 接收请求时的编码。
resp.setCharacterEncoding("UTF-8"); // 响应给浏览器的编码。
// 个人理解设置编码的原因是 由于 xml解析时编码要一致。
SAXReader saxReader = new SAXReader();
BasicInfo backInfo = null;
XStream xStream = new XStream();
Map<String, String> map = new HashMap<>();
Document read = saxReader.read(req.getInputStream());
//得到根节点
Element rootElement = read.getRootElement();
//获得子节点
List<Element> elements = rootElement.elements();
for (Element e:
elements) {
//将数据存进map
map.put(e.getName(), e.getStringValue());
}
// 判断用户是否为关注
if (map.containsKey("Event") && map.get("Event").equals("subscribe")) {
// 处理关注
//backInfo = wxService.setSubscribe(map);
System.out.println("关注");
//xStream.alias("xml", BackTextInfo.class);
}