微信公众号自动提取资源
案例目录
《微信公众号自动提取资源系统》
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
为了方便大家更好的学习,本平台经常分享一些完整的单个功能案例代码给大家去练习,如果本平台没有你要学习的功能案例,你可以联系小编,提供你的小需求给我,我安排我们这边的开发团队免费帮你完成你的案例。