Springboot实现《微信公众号自动提取资源系统》(二)接收公众号消息、指定回复内容、配置公众号自动回复

微信公众号自动提取资源

案例目录
《微信公众号自动提取资源系统》
1、准备工作、项目搭建、服务器校验
2、接收公众号消息、指定回复内容、配置公众号自动回复
3、接入数据库,查询数据库的资源、使用客服消息

项目技术栈介绍
后端:Springboot+mybatisPlus
jdk:1.8以上
数据库:mysql

源码获取地址(以上前后端代码已经全部打包好了)

https://gitee.com/xuxiaofei1996/case-source-code.git

为了方便大家更好的学习,本平台经常分享一些完整的单个功能案例代码给大家去练习,如果本平台没有你要学习的功能案例,你可以联系小编,提供你的小需求给我,我安排我们这边的开发团队免费帮你完成你的案例。

接收公众号消息

根据微信的官方文档,微信会将用户发送到公众号的消息以xml的格式发送到用户填写的url上,和上面验证服务器不同的是,虽然都会发送到同一个url上,但是校验服务器的是GET请求,而接收消息使用的POST请求,所以我们需要编写一个POST的wx/urlR接口



wx/urlR接口编写

根据微信公众号的要求,如果5秒内未收到回信,微信会再次发起请求,一共会重试三次。如果三次都失败了,则会提示用户服务器故障。所以这里我们会在接收到消息的时候先回复一个空字符串,代表我们已经收到了消息,此时微信则不会再重复发送请求。


Message.java

@Data
public class Message {

    //开发者微信号
    private String ToUserName;

    //发送方账号(openId)
    private String FromUserName;

    //发送时间
    private int CreateTime;

    //消息类型,文本为text
    private String MsgType;

    //消息内容
    private String Content;

    //消息id,64位整型
    private int MsgId;

    //消息的数据ID(消息如果来自文章时才有)
    private int MsgDataId;

    //多图文时第几篇文章,从1开始(消息如果来自文章时才有)
    private int Idx;
}

这里我们用到hutool工具类中的XmlUtil将xml的字符串转为Map,再将map封装到message对象中,我们就得到了对象类型的微信消息。

WxMessageController.java

    @RequestMapping(value="/urlR",method= RequestMethod.POST)
    public void index(@RequestBody String xml,HttpServletResponse resp) throws IOException  {
        //将接收到的xml消息转为map
        Map<String, Object> stringObjectMap = XmlUtil.xmlToMap(xml);
        //将map转为标准的message对象
        Message message = BeanUtil.fillBeanWithMap(stringObjectMap, new Message(), false);
        log.info("接收到微信发来的消息:{}",message);
        log.info("接收到来自"+message.getFromUserName()+"的消息,内容是"+message.getContent());

        
        resp.setContentType("text/xml;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write("");

    }

测试

我们发送消息test test,看到控制台会打印日志,则代表我们接收成功!

接收到微信发来的消息:Message(ToUserName=gh_717656549a1c, FromUserName=osBUr6zviLjaPapLM09--HUGyATw, CreateTime=1692192636, MsgType=text, Content=test test, MsgId=0, MsgDataId=0, Idx=0)
接收到来自osBUr6zviLjaPapLM09--HUGyATw的消息,内容是test test

指定回复内容

微信公众号的开发文档规定,我们回复消息时同样需要恢复xml格式的消息,所以我们需要将要返回的内容编辑为xml格式的数据后再返回。



我们将构建好的返回值封装到map中,最后使用hutool工具类中的mapToXmlStr方法将map转为xml的字符串返回。

代码编写

WxMessageController.java

@RequestMapping(value="/urlR",method= RequestMethod.POST)
    public void index(@RequestBody String xml,HttpServletResponse resp) throws IOException  {
        //将接收到的xml消息转为map
        Map<String, Object> stringObjectMap = XmlUtil.xmlToMap(xml);
        //将map转为标准的message对象
        Message message = BeanUtil.fillBeanWithMap(stringObjectMap, new Message(), false);
        log.info("接收到微信发来的消息:{}",message);
        log.info("接收到来自"+message.getFromUserName()+"的消息,内容是"+message.getContent());

        //返回的内容
        String resStr = "收到您发送的{"+message.getContent()+"}消息";

        //构建返回的map
        Map<Object, Object> resMap = new HashMap<>();
        resMap.put("ToUserName",message.getFromUserName());
        resMap.put("FromUserName",message.getToUserName());
        resMap.put("CreateTime",System.currentTimeMillis());
        resMap.put("MsgType","text");
        resMap.put("Content",resStr);

        resp.setContentType("text/xml;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write(XmlUtil.mapToXmlStr(resMap,"xml"));

    }

测试

再次发送消息测试,返回指定内容成功!



配置公众号自动回复

代码编写

通过对不同微信发来消息的不同类型来进行用户关注公众号的动作。

@RequestMapping(value="/urlR",method= RequestMethod.POST)
    public void index(@RequestBody String xml,HttpServletResponse resp) throws IOException  {
        //将接收到的xml消息转为map
        Map<String, Object> stringObjectMap = XmlUtil.xmlToMap(xml);
        //将map转为标准的message对象
        Message message = BeanUtil.fillBeanWithMap(stringObjectMap, new Message(), false);
        log.info("接收到微信发来的消息:{}",message);

        //返回的内容
        String resStr = "收到您发送的{"+message.getContent()+"}消息";

        if("event".equals(message.getMsgType())){
            resStr = "Hello!欢迎关注我。\n我是您的网盘资源获取小助手\n" +
                    "通过查看公众号往期文章来获取资源的提取码\n" +
                    "将对应的提取码发给我,我会把指定的资料发给您!";
        }

        //构建返回的map
        Map<Object, Object> resMap = new HashMap<>();
        resMap.put("ToUserName",message.getFromUserName());
        resMap.put("FromUserName",message.getToUserName());
        resMap.put("CreateTime",System.currentTimeMillis());
        resMap.put("MsgType","text");
        resMap.put("Content",resStr);

        //因处理消息的时间可能在5秒之外,所以这里回复空串,使用客服消息接口回复消息即可
        resp.setContentType("text/xml;charset=UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().write(XmlUtil.mapToXmlStr(resMap,"xml"));

    }

测试

将公众号重新关注,接口会判断收到的消息类型是event,则代表是用户关注事件。将使用指定的内容替换平时回复的消息即可实现关注后的自动回复。

源码获取地址(以上前后端代码已经全部打包好了)

https://gitee.com/xuxiaofei1996/case-source-code.git

为了方便大家更好的学习,本平台经常分享一些完整的单个功能案例代码给大家去练习,如果本平台没有你要学习的功能案例,你可以联系小编,提供你的小需求给我,我安排我们这边的开发团队免费帮你完成你的案例。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

累人猿-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值