在上一篇博客中,我们只是简单地与微信服务器建立了连接,接下来就是从微信服务器中接收信息了。在SecurityController中,我定义了两个方法(get和post)。Get方法是我们用来与微信服务器建立连接,而我们将通过Post方法来接收微信服务器发给我们的响应。
当我们完成服务器验证后,以后用户对公众号的每个事件,微信服务器都会通过我们配置的URL推送到我们自己的服务器,然后我们服务器根据自身业务逻辑进行响应!
在正式实现用户与服务器之间的沟通前,我们需要进行一些知识储备和对信息的分类。
(一)消息体的类型:
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
1. 普通消息类型:文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息和链接消息等;
2. 事件推送类型:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件、点击菜单拉取消息时的事件推送、点击菜单跳转链接时的事件推送等。
(二)额外知识
- 消息重试机制:
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
- 信息加密/解密机制:
为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。
关于消息加解密的详细说明,请见“[消息加解密说明]”。
(三)接收信息的分类和实体的创建
篇幅关系,将省略所有实体类的Get和Set方法。
根据各种信息类型,我们将其分为一个基础类和六个实体。
1. 接收消息基础类
public class BaseMessage {
//开发者微信号
private String ToUserName;
//发送方账号(OpenID)
private String FromUserName;
//消息创建时间(整型)
private long CreateTime;
//消息类型(text/image/location/link/video/shortvideo)
private String MsgType;
//消息id,64位整型
private long MsgId;
}
- 图片消息实体
public