微信公众号开发2——消息交互流程

本文详细介绍了微信公众号中用户与公众号之间消息交互的过程,包括消息的接收与发送流程,消息和事件的分类及封装方式,以及如何使用Dom4j和XStream处理XML格式的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇主要陈述了开发者模式启用以及校验流程,这一篇主要是消息的交互流程。

消息的交互流程

场景:用户给公众号发送消息,用户接收到公众号回复的消息

接收消息:用户给公众号发送消息,微信服务器将POST消息的XML数据包发送到开发者填写的url上

发送消息:对于发来的请求,开发者在响应包中返回特定xml结构,并对该消息进行响应

响应类型:文本,图片,语音,视频,音乐

参与交互的实体有三个:用户,微信服务器,公众账号服务器


微信服务器和公众账号服务器交互的信息可以分为三类:请求消息,事件,响应消息

微信服务器传给公众号服务器:请求消息,事件

公众号服务器传给微信服务器:响应消息

事件:用户对公众号做出某种操作时,微信服务器会将对应的事件推送给公众号服务器,这类操作有5种:关注公众账号,取消公众账号,扫描带参数二维码,同意上报地理位置并进入公众账号和点击自定义菜单

消息结构的封装:

1:请求消息基类(共有的参数):ToUserName,FromUserName,CreateTime,MsgType,MsgId,将参数封装到包装类

2:文本消息:用户给公众号发送文字,微信服务器会给公众号服务器发送如下格式消息:

content:文本消息内容,单独写一个包装类,消息内容需要继承BaseMessage

3 : 图片消息同上,content改为PicUrl:图片链接(开发者通过链接去微信服务器下载用户发的图片)

4:语音消息同上,除消息基类外加:


5:视频消息

6:地理位置信息

7:链接消息

事件的封装

1:事件基类:

2:关注/取消关注事件

关注/取消关注事件的消息类型都是Event,参数Event=subscribe时表示关注事件,参数Event=unsubscribe时表示取消事件

消息结构对应java类继承BaseEvent

3:扫描带参数二维码事件

用户未关注公众账号,关注后微信服务器会向公众账号推送如下格式数据:

在消息基类的基础上外加两个参数:

EventKey:事件Key值,qrscene_固定前缀,后面二维码参数值

Ticket:用于换取二维码图片

用户关注公众账号:微信服务器会向公众账号推送一条事件类型为scan的消息


扫描带参数二维码事件的两种消息结构完全相同,不同的只是事件类型和事件key值

4:上报地理位置事件


5:自定义菜单事件

EventKey要与自定义菜单接口中的Key值一致

封装响应消息

1:响应消息基类:ToUserName,FromUserName,CreateTime,MsgType

2:文本消息

公众号服务器收到用户发来消息,若回复文本消息给用户,消息格式如下:

content:消息内容,长度不能超过2048字节

3:图片消息

上传图片,语音,视频等多媒体消息时,需要预先上传文件到微信服务器,上传成功后微信服务器会返回多媒体文件的ID,MediaId是媒体文件的ID

4:语音消息

5:视频消息

6:音乐消息


7:图文消息


消息处理

公众号服务器和微信服务器交互数据传输格式是XML,处理xml,可以用到Dom4j和XStream来实现

1:Dom4j--读、写xml格式数据

2:XStream--实现XML和java对象之间的转换

解析请求消息过程:

微信服务器发送的请求消息被封装到request中,使用request.getInputStream()的方法获取输入流,再使用Dom4j读取输入流并解析XML格式的请求消息,将解析得到的消息参数放到HashMap中,取出map中的值ToUserName,FromUserName,CreateTime,MsgType,MsgId基本参数,然后判断MsgType类型,根据类型依次拿出其他参数

响应消息对象转XML

注:xml解析器会解析xml文档中的所有文本,当某个xml元素被解析时,其标签之间的文本也会被解析,所以“<”“&”是非法的,因为“<”会被解析器解析为新元素的开始, 对于这个问题有两种解决方法,用到转义字符或CDATA,XStream不支持CDATA,扩展XStream使其支持CDATA,在生成xml各元素值时添加CDATA标记,CDATA指的是不应由xml解析器解析的文本数据,CDATA标记由“<![CDATA[”开始"]]>"结束,标记内的所有文本都会被解析器忽略

总结:用户发送消息给公众号——微信服务器收到消息,将消息解析为XML,发给公众号服务器——公众号服务器用Dom4j读取XML格式的文件——根据文本类型回复消息给用户——将消息内容使用XStream转为xml——将xml格式的消息发给微信服务器——微信服务器将消息发给用户

### 使用Java开发微信公众号 #### API集成与消息处理最佳实践 对于希望利用Java进行微信公众号开发开发者来说,有多种途径可以选择。一种方式是通过原生HTTP请求直接调用微信提供的API接口来完成诸如模板消息推送等功能[^1]。然而,这种方式可能较为繁琐,尤其是在面对复杂的业务逻辑时。 另一种更为推荐的方式则是借助第三方库简化开发流程。例如`WeixinJava`工具库能够帮助减少编码复杂度并提高效率[^2]。特别是当采用Spring Boot作为应用框架时,可以通过引入特定于微信开发的支持包(如`weixin-java-mp`),使得整个过程更加顺畅[^3]。 具体而言,在基于Spring Boot构建的应用程序中集成本土化支持之前,需先完成必要的准备工作: - 注册微信公众平台账号,并获得相应的AppID和AppSecret; - 修改Maven项目的POM文件以添加所需的依赖项; - 编辑application.yml配置文件设置相关参数; - 创建对应的Java类用于管理属性和服务实现; 针对实际的消息交互部分,则可通过定义控制器接收来自用户的输入,并依据预设条件作出响应——无论是简单的文本回复还是更高级别的多媒体内容发送均能被妥善处理[^4]。 ```java @RestController @RequestMapping("/wechat") public class WeChatController { @Autowired private WxMpService wxService; @GetMapping public String handleGet(@RequestParam(name="signature", required=false) String signature, @RequestParam(name="timestamp", required=false) String timestamp, @RequestParam(name="nonce", required=false) String nonce, @RequestParam(name="echostr", required=false) String echostr){ if (StringUtils.isNotBlank(echostr)){ return this.wxService.checkSignature(timestamp, nonce, signature)? echostr : "error"; } return "hello world!"; } @PostMapping(produces = "text/plain;charset=utf-8") public String post(HttpServletRequest request)throws Exception{ // 处理POST请求... return ""; } } ``` 为了更好地理解和掌握这些概念和技术细节,建议参考官方文档以及其他社区资源中的实例代码片段来进行学习和实验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值