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);
        }
上一篇下一篇

猜你喜欢

热点阅读