微信服务器和第三方服务器之间究竟是通过什么方式进行对话的?
下面,我们先看下图:
其实我们可以简单的理解:
(1)首先,用户向微信服务器发送消息;
(2)微信服务器接收到用户的消息处理之后,通过开发者配置的URL和Token 来找到第三方服务器,并以XML形式向第三方服务器发送消息。
(3)第三方服务器获取这些消息之后,需要按照微信服务器传过来的XML的语言进行解析,获取到信息之后,根据用户的需求,提供服务,然后封装成XML数据,传回到微信服务器上去。
(4)微信服务器解析这些XML,并把相应的内容还回给用户。
基本就结束了一个基本的请求与相应。
一、封装请求信息
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
各消息类型的推送XML数据包结构如下:
----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------
详细的介绍可以参照 官网介绍
其中用户可以向微信服务器发送的消息类型大概可以分为:文本消息,图片消息,语音消息,视频消息,小视频消息,地理位置消息,链接消息。
根据观察可以知道这些消息中,都会传回来这些公共的字段如:
ToUserName(开发者微信号);
FromUserName(发送方帐 号,OPEN_ID);
CreateTime(消息的创建时间);
MsgType(消息类型);
MsgId(消息ID)。
我们把这些封装成一个基类,然后 不同的部分,分别封装为各自的类,这样提高代码的重用性。
这个请求消息的基类BaseMessage ,主要是封装了一些共同的字段。
(1)文本消息类Content ,主要是文本消息内容。
(2)图片消息:
PicUrl | 图片链接 |
MediaId | 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
(3) 语音消息:
MediaId | 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
Format | 语音格式,如amr,speex等 |
(4)视频消息:
MediaId | 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 |
(5)小视频消息:
MediaId | 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 |
(6) 地理位置消息:
Location_X | 地理位置维度 |
Location_Y | 地理位置经度 |
Scale | 地图缩放大小 |
Label | 地理位置信息 |
(7) 链接消息:
Title | 消息标题 |
Description | 消息描述 |
Url | 消息链接 |
二、封装事件
在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。
事件的数据格式为:
详细可以参照 官网
事件基类封装
(1)关注/取消关注事件
(2)扫描带参数二维码事件
(3)上报地理位置事件
(4)自定义菜单事件
三、封装响应消息
当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对 该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回 复。
各消息类型需要的XML数据包结构如下:
详细可以查看 官网
同样,把消息回复中定义的所有消息都有的字段提取出来,封装成一个基类,
这些公有的字段包括:
ToUserName(接收方帐号,用户的OPEN_ID);
FromUserName(开发者的微信号);
CreateTime(消 息的创建时间);
MsgType(消息类型);
FuncFlag(消息的星标标识)。
响应消息的基类BaseMessage:
(1)回复文本消息
(2)回复图片消息
(3)回复语音消息
(4)回复视频消息
(5)回复音乐消息
(6) 回复图文消息
封装结束。
为了方便,提供一下这些类的源码:
http://yunpan.cn/cL7KUQ4Q5tMeh 访问密码 75e7
其他文章关联:
第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备
第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装
第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单
第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息