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 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 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 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 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 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

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

兆欧 (MΩ)到欧姆 (Ω)转换器|辭典檢視