引言

公众号经常会有一些自动回复,最近顺便研究了一下公众号被动回复的代码实现,并不是特别难;下面我用代码演示一下;

注:公众号的一些准备工作已经在《获取公众号二维码》一文中说过了,这里就不多说了,配置步骤是一样的;

看文档

先以文档为主,文档说的关键一句就是:

这里我们填写的url已经配置好了,就是上次配置的这个:

这个post消息一开始我不明白,其实就是实现一个post接口,和填入的接口对应即可:

这个接口其实在配置时我们实现的是一个get请求接口,而这里是post请求

先不用急着实现接口功能,可以打个断点在这个接口上,然后关注公众号,或者给公众号发送消息,就会发现请求会走该接口;

接下来就是具体接收并回复消息了;

代码逻辑

看文档可以发现,微信的消息交互好像都是通过xml文件格式进行交互的,其实和使用json交互没什么区别,我们就只需要把request中的xml文本拿到,然后把xml解析成为对应数据就好了;(代码中是将xml解析成了map,这样更易于取数据)

当然回复数据也要变成xml格式,然后只需要把该xml字符串返回即可;

下面就是具体代码:

/*** 接收微信公众号消息*/
@PostMapping("/callback")
public String responseMsg(HttpServletRequest req, HttpServletResponse resp) throws IOException {req.setCharacterEncoding("UTF-8");String message = "success";// 把微信返回的xml信息转义成maptry {Map<String, String> xmlMessage = WxMessageUtil.xmlToMap(req);String fromUserName = xmlMessage.get("FromUserName"); // 这个就是你关注公众号的openIdString toUserName = xmlMessage.get("ToUserName"); // 这个是用户微信的idString msgType = xmlMessage.get("MsgType"); // 消息类型(event或者text)String createTime = xmlMessage.get("CreateTime"); // 消息创建时间 (整型)log.info("消息来自(公众号的openId)=>" + fromUserName);log.info("用户微信的id=>" + toUserName);log.info("消息类型为=>" + msgType);log.info("消息创建时间 (整型)=>" + createTime);if ("event".equals(msgType)) { // 如果是事件推送String eventType = xmlMessage.get("Event"); // 事件类型if ("subscribe".equals(eventType)) { // 如果是订阅消息String subscribeContent = "感谢关注";String subscribeReturnXml = WxMessageUtil.getWxReturnMsg(xmlMessage, subscribeContent);return subscribeReturnXml;}if ("SCAN".equals(eventType)) { // 如果是扫码消息String scanContent = "扫码成功";String scanReturnXml = WxMessageUtil.getWxReturnMsg(xmlMessage, scanContent);return scanReturnXml;}}if ("text".equals(msgType)) { // 如果是文本消息推送String content = xmlMessage.get("Content"); // 接收到的消息内容String textReturnXml = WxMessageUtil.getWxReturnMsg(xmlMessage, content);return textReturnXml; // 将接收到的文本消息变成xml格式再返回}} catch (Exception e) {e.printStackTrace();}return message;
}

可以看看效果:

后台输出

当然你可以看文档实现更多类型的消息互动,就是加几个if的问题;


上面示例代码中用到了一个WxMessageUtil工具类,这里放一下工具类的代码:

需要先引入一个dom4j依赖:

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>
import com.yang.model.wx.TextMessage;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 微信消息处理类(微信消息交互大部分就是xml格式交互)*/
@Slf4j
public class WxMessageUtil {/** xml转map*/public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException {HashMap<String, String> map = new HashMap<String,String>();SAXReader reader = new SAXReader();InputStream ins = request.getInputStream();Document doc = reader.read(ins);Element root = doc.getRootElement();@SuppressWarnings("unchecked")List<Element> list = (List<Element>)root.elements();for(Element e:list){map.put(e.getName(), e.getText());}ins.close();return map;}/*** 获取公众号回复信息(xml格式)*/public static String getWxReturnMsg(Map<String, String> decryptMap, String content) throws UnsupportedEncodingException {log.info("---开始封装xml---decryptMap:" + decryptMap.toString());TextMessage textMessage = new TextMessage();textMessage.setToUserName(decryptMap.get("FromUserName"));textMessage.setFromUserName(decryptMap.get("ToUserName"));textMessage.setCreateTime(System.currentTimeMillis());textMessage.setMsgType("text"); // 设置回复消息类型textMessage.setContent(content); // 设置回复内容String xmlMsg = getXmlString(textMessage);// 设置返回信息编码,防止中文乱码String encodeXmlMsg = new String(xmlMsg.getBytes(), "ISO-8859-1");return encodeXmlMsg;}/*** 设置回复消息xml格式*/private static String getXmlString(TextMessage textMessage) {String xml = "";if (textMessage != null) {xml = "<xml>";xml += "<ToUserName><![CDATA[";xml += textMessage.getToUserName();xml += "]]></ToUserName>";xml += "<FromUserName><![CDATA[";xml += textMessage.getFromUserName();xml += "]]></FromUserName>";xml += "<CreateTime>";xml += textMessage.getCreateTime();xml += "</CreateTime>";xml += "<MsgType><![CDATA[";xml += textMessage.getMsgType();xml += "]]></MsgType>";xml += "<Content><![CDATA[";xml += textMessage.getContent();xml += "]]></Content>";xml += "</xml>";}log.info("xml封装结果=>" + xml);return xml;}
}

其中封装的消息模板TextMessage的代码:

import lombok.Data;/*** 微信消息自动回复模板类*/
@Data
public class TextMessage {private String toUserName;private String fromUserName;private Long createTime;private String msgType;private String content;
}

总结

其实消息回复并不是特别难的,主要是能看懂文档就很容易就实现,但是微信文档有点抽象(其实是我菜)不好看懂,所以还是需要自己多尝试一下;

文档地址:传送门

微信公众号被动消息回复实现相关推荐

  1. php公众号被动回复,微信公众号被动消息回复原理解析

    背景:某分厂需要实时查询工件堆放的位置,要求快速便捷,因此设计了采用微信公众号被动回复信息的方案. 技术实现:开发者服务器--基于Angular2框架的已发布网站,编程语言为Python,后台存储数据 ...

  2. 2014-07-24 .NET实现微信公众号的消息回复与自定义菜单

    今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpCo ...

  3. 【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复

    前言 在进行微信公众号业务开发的时候,微信公众号的消息回复是非常重要的一环,而微信公众号消息回复分为:普通消息自动回复和模板消息回复.该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,并且每 ...

  4. 教程: nodejs 做微信公众号开发,回复 xml 消息

    教程: nodejs 做微信公众号开发,回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接,这个不再冗述看官方教程就好 接入指南 .此篇介绍的是如何获取用户发来的信息,并回复它. 一.接收 ...

  5. 公众号php怎么限制回复次数,刚刚上线!打破微信公众号48小时回复粉丝消息限制!...

    原标题:刚刚上线!打破微信公众号48小时回复粉丝消息限制! 众所周知微信公众号一直以来和粉丝的关系是比较封闭的,除了订阅号每日一次的推送,服务号每月四次的推送外,公众号很难主动联系粉丝. 如果粉丝没有 ...

  6. 微信测试号中被动消息回复的测试

    微信测试号中被动消息回复的测试 这里只贴相关的代码,具体的操作步骤(注册微信订阅号.测试号等)不再提及. 测试号的路径配置         这是使用的是花生壳的内网穿透,至于具体使用请参照花生壳官网说 ...

  7. Java微信公众号发送消息-保姆级教程附源码

    目录 1. 概念说明: 2. 开发准备: 3. 测试demo(更改配置信息即可使用) 3.1. 服务器配置 3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校 ...

  8. 微信公众号三方平台开发【代微信公众号接收消息事件并响应】

    今天要讲的是代微信公众号接收消息并进行回复,这里要用到的就是咱们之前在微信公众号三方平台开发[帐号注册.平台创建]里写到的"公众号消息与事件接收URL",在接收的目标方法里,我们首 ...

  9. 实现微信公众号H5消息推送的超级详细步骤

    前言 前段时间在项目中做了一个给H5消息推送的功能,特此记录一下,感兴趣或者有需要的小伙伴可以查阅一下,因为其实代码并不难,我觉得对于初学者来说难的是一些概念和具体实现的过程,所以我会先使用微信提供的 ...

最新文章

  1. 准确判断他人忠诚度的有效办法
  2. echarts 折线图悬停拐点大小不变_echarts-折线图(折线虚实/颜色与拐点样式修改)...
  3. [POJ2184] Cow Exhibition
  4. ReviewForJob(2)算法分析
  5. 动态规划 所有题型的总结
  6. 九和一 Hidove聚合在线图床PHP源码
  7. 微博关注者数量在计算中的作用
  8. 运算符重载——拷贝构造函数与赋值运算符的区别、如何实现赋值运算符的深拷贝
  9. hadoop-执行mapreduce时hang住的问题
  10. 将caj转换成pdf
  11. 腾讯云物联网通信MQTT数据转发到第三方服务
  12. [Python人工智能] 十八.Keras搭建卷积神经网络及CNN原理详解
  13. 基于大数据的线上线下电商用户数据挖掘研究
  14. php yii2框架仿站教程,从零开始学YII2框架(六)高级应用程序模板,yii2框架
  15. Note For Linux By Jes(18)-X Window 配置介绍
  16. jvm原理解析——不疯魔不成活 1
  17. 电芯容量在前期循环中容量增加_新发现!18650电池钢芯提升电池低温循环性能...
  18. 基于 Gin 的会议室预约 API 设计 (二)
  19. uCOSii中的互斥信号量
  20. XMind ,印象笔记, Effie 哪个更加适合影评人?

热门文章

  1. 最新计算机cpu简介,计算机cpu的类型是什么?计算机CPU分类简介
  2. Cortex-M3 (NXP LPC1788)之RTC
  3. 苹果平板做ppt方便吗_苹果手机和平板有什么软件可以做笔记
  4. Boolean value of Tensor with more than one value is ambiguous
  5. SVN :Cannot verify lock on path XXX,no username available
  6. 迷途中的融担:在下沉与专注中寻找未来
  7. Spring源码理解
  8. 征途手机版服务器维护,征途手机版手游开服表_征途手机版手游开服时间表_新服新区预告_第一手游网...
  9. 胎儿式保姆级教程:Jetson Xavier NX镜像烧录、开机配置、中文配置、风扇设置、远程桌面、文件传输配置、pycharm安装环境配置,QQ,opencv(cuda编译),torch(GPU).
  10. 20176408李俊 栈和队列