微信服务器和第三方服务器之间究竟是通过什么方式进行对话的?

下面,我们先看下图:

其实我们可以简单的理解:

(1)首先,用户向微信服务器发送消息;

(2)微信服务器接收到用户的消息处理之后,通过开发者配置的URL和Token 来找到第三方服务器,并以XML形式向第三方服务器发送消息。

(3)第三方服务器获取这些消息之后,需要按照微信服务器传过来的XML的语言进行解析,获取到信息之后,根据用户的需求,提供服务,然后封装成XML数据,传回到微信服务器上去。

(4)微信服务器解析这些XML,并把相应的内容还回给用户。

基本就结束了一个基本的请求与相应。

一、封装请求信息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

各消息类型的推送XML数据包结构如下:

----------------------------------------------------------------------------------------------------------------------------------------

文本消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId></xml>参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    text
Content    文本消息内容
MsgId    消息id,64位整型图片消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[this is a url]]></PicUrl><MediaId><![CDATA[media_id]]></MediaId><MsgId>1234567890123456</MsgId></xml>参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    image
PicUrl    图片链接
MediaId    图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId    消息id,64位整型语音消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    语音为voice
MediaId    语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
Format    语音格式,如amr,speex等
MsgID    消息id,64位整型请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段 (注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启 语音识别后的语音XML数据包如下:<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。
视频消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    视频为video
MediaId    视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId    视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId    消息id,64位整型小视频消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    小视频为shortvideo
MediaId    视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId    视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId    消息id,64位整型地理位置消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml> 参数    描述
ToUserName    开发者微信号
FromUserName    发送方帐号(一个OpenID)
CreateTime    消息创建时间 (整型)
MsgType    location
Location_X    地理位置维度
Location_Y    地理位置经度
Scale    地图缩放大小
Label    地理位置信息
MsgId    消息id,64位整型链接消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml> 参数    描述
ToUserName    接收方微信号
FromUserName    发送方微信号,若为普通用户,则是一个OpenID
CreateTime    消息创建时间
MsgType    消息类型,link
Title    消息标题
Description    消息描述
Url    消息链接
MsgId    消息id,64位整型

View Code

----------------------------------------------------------------------------------------------------------------------------------------

详细的介绍可以参照  官网介绍

其中用户可以向微信服务器发送的消息类型大概可以分为:文本消息图片消息语音消息视频消息小视频消息地理位置消息链接消息

根据观察可以知道这些消息中,都会传回来这些公共的字段如:

ToUserName(开发者微信号);

FromUserName(发送方帐 号,OPEN_ID);

CreateTime(消息的创建时间);

MsgType(消息类型);

MsgId(消息ID)。

我们把这些封装成一个基类,然后 不同的部分,分别封装为各自的类,这样提高代码的重用性。

这个请求消息的基类BaseMessage ,主要是封装了一些共同的字段。

package com.souvc.weixin.message.req;/**
* 类名: BaseMessage </br>
* 描述: 请求消息的基类 </br>
* 开发人员: souvc</br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class BaseMessage {// 开发者微信号private String ToUserName;// 发送方帐号(一个OpenID)private String FromUserName;// 消息创建时间 (整型)private long CreateTime;// 消息类型(text/image/location/link)private String MsgType;// 消息id,64位整型private long MsgId;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}public long getMsgId() {return MsgId;}public void setMsgId(long msgId) {MsgId = msgId;}
}

View Code

(1)文本消息类Content ,主要是文本消息内容。

package com.souvc.weixin.message.req;/**
* 类名: TextMessage </br>
* 描述: 请求消息之文本消息 </br>
* 开发人员: souvc </br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/public class TextMessage extends BaseMessage {// 消息内容private String Content;public String getContent() {return Content;}public void setContent(String content) {Content = content;}
}

View Code

(2)图片消息:

PicUrl 图片链接
MediaId 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

package com.souvc.weixin.message.req;/**
* 类名: ImageMessage </br>
* 描述: 请求消息之图片消息 </br>
* 开发人员: souvc </br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class ImageMessage extends BaseMessage {// 图片链接private String PicUrl;private String MediaId;public String getPicUrl() {return PicUrl;}public void setPicUrl(String picUrl) {PicUrl = picUrl;}public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}}

View Code

(3) 语音消息:

MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
Format 语音格式,如amr,speex等

package com.souvc.weixin.message.req;/**
* 类名: VoiceMessage </br>
* 描述: 请求消息之语音消息 </br>
* 开发人员: souvc </br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class VoiceMessage extends BaseMessage {// 媒体IDprivate String MediaId;// 语音格式private String Format;public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}public String getFormat() {return Format;}public void setFormat(String format) {Format = format;}
}

View Code

(4)视频消息:

MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

package com.souvc.weixin.message.req;
/**
* 类名: VideoMessage </br>
* 描述: 请求消息之视频消息 </br>
* 开发人员: souvc </br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class VideoMessage  extends BaseMessage{// 媒体IDprivate String MediaId;// 语音格式private String ThumbMediaId;public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}public String getThumbMediaId() {return ThumbMediaId;}public void setThumbMediaId(String thumbMediaId) {ThumbMediaId = thumbMediaId;}}

View Code

(5)小视频消息:

MediaId 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

(6) 地理位置消息:

Location_X 地理位置维度
Location_Y 地理位置经度
Scale 地图缩放大小
Label 地理位置信息

package com.souvc.weixin.message.req;/**
* 类名: LocationMessage </br>
* 描述: 请求消息之地理位置消息 </br>
* 开发人员:souvc</br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class LocationMessage extends BaseMessage {// 地理位置维度private String Location_X;// 地理位置经度private String Location_Y;// 地图缩放大小private String Scale;// 地理位置信息private String Label;public String getLocation_X() {return Location_X;}public void setLocation_X(String location_X) {Location_X = location_X;}public String getLocation_Y() {return Location_Y;}public void setLocation_Y(String location_Y) {Location_Y = location_Y;}public String getScale() {return Scale;}public void setScale(String scale) {Scale = scale;}public String getLabel() {return Label;}public void setLabel(String label) {Label = label;}
}

View Code

(7) 链接消息:

Title 消息标题
Description 消息描述
Url 消息链接

package com.souvc.weixin.message.req;/**
* 类名: LinkMessage </br>
* 描述: 请求消息之链接消息 </br>
* 开发人员: souvc </br>
* 创建时间:  Sep 29, 2015 </br>
* 发布版本:V1.0  </br>*/
public class LinkMessage extends BaseMessage {// 消息标题private String Title;// 消息描述private String Description;// 消息链接private String Url;public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String getDescription() {return Description;}public void setDescription(String description) {Description = description;}public String getUrl() {return Url;}public void setUrl(String url) {Url = url;}
}

View Code

二、封装事件

在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。

事件的数据格式为:

关注/取消关注事件用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。 推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,subscribe(订阅)、unsubscribe(取消订阅)  使用网页调试工具调试该接口 扫描带参数二维码事件用户扫描带场景值二维码时,可能推送以下两种事件:
1. 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
2. 如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。 1. 用户未关注时,进行关注后的事件推送 推送XML数据包示例:
<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,subscribe
EventKey  事件KEY值,qrscene_为前缀,后面为二维码的参数值
Ticket  二维码的ticket,可用来换取二维码图片  2. 用户已关注时的事件推送 推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,SCAN
EventKey  事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
Ticket  二维码的ticket,可用来换取二维码图片  使用网页调试工具调试该接口 上报地理位置事件用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。 推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[LOCATION]]></Event>
<Latitude>23.137466</Latitude>
<Longitude>113.352425</Longitude>
<Precision>119.385040</Precision>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,LOCATION
Latitude  地理位置纬度
Longitude  地理位置经度
Precision  地理位置精度  使用网页调试工具调试该接口 自定义菜单事件用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。 点击菜单拉取消息时的事件推送 推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,CLICK
EventKey  事件KEY值,与自定义菜单接口中KEY值对应  点击菜单跳转链接时的事件推送 推送XML数据包示例:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[VIEW]]></Event>
<EventKey><![CDATA[www.qq.com]]></EventKey>
</xml>参数说明: 参数 描述 ToUserName  开发者微信号
FromUserName  发送方帐号(一个OpenID)
CreateTime  消息创建时间 (整型)
MsgType  消息类型,event
Event  事件类型,VIEW
EventKey  事件KEY值,设置的跳转URL  

View Code

详细可以参照   官网

 事件基类封装

package com.souvc.weixin.message.event;/**
* 类名: BaseEvent </br>
* 描述: 事件基类</br>
* 开发人员: souvc</br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class BaseEvent {// 开发者微信号private String ToUserName;// 发送方帐号(一个OpenID)private String FromUserName;// 消息创建时间 (整型)private long CreateTime;// 消息类型private String MsgType;// 事件类型private String Event;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}public String getEvent() {return Event;}public void setEvent(String event) {Event = event;}
}

View Code

 (1)关注/取消关注事件

package com.souvc.weixin.message.event;/**
* 类名: SubscribeEvent </br>
* 描述: 关注/取消关注事件 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class SubscribeEvent extends BaseEvent {}

View Code

(2)扫描带参数二维码事件

package com.souvc.weixin.message.event;/**
* 类名: QRCodeEvent </br>
* 描述: 扫描带参数二维码事件 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class QRCodeEvent extends BaseEvent {// 事件KEY值private String EventKey;// 用于换取二维码图片private String Ticket;public String getEventKey() {return EventKey;}public void setEventKey(String eventKey) {EventKey = eventKey;}public String getTicket() {return Ticket;}public void setTicket(String ticket) {Ticket = ticket;}
}

View Code

(3)上报地理位置事件

package com.souvc.weixin.message.event;/**
* 类名: LocationEvent </br>
* 描述: 上报地理位置事件 </br>
* 开发人员: liuhf </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class LocationEvent extends BaseEvent {// 地理位置纬度private String Latitude;// 地理位置经度private String Longitude;// 地理位置精度private String Precision;public String getLatitude() {return Latitude;}public void setLatitude(String latitude) {Latitude = latitude;}public String getLongitude() {return Longitude;}public void setLongitude(String longitude) {Longitude = longitude;}public String getPrecision() {return Precision;}public void setPrecision(String precision) {Precision = precision;}
}

View Code

(4)自定义菜单事件

package com.souvc.weixin.message.event;/**
* 类名: MenuEvent </br>
* 描述: 自定义菜单事件 </br>
* 开发人员: liuhf </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class MenuEvent extends BaseEvent {// 事件KEY值,与自定义菜单接口中KEY值对应private String EventKey;public String getEventKey() {return EventKey;}public void setEventKey(String eventKey) {EventKey = eventKey;}
}

View Code

三、封装响应消息

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对 该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回 复。

各消息类型需要的XML数据包结构如下:

 回复文本消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>参数     是否必须     描述
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间 (整型)
MsgType     是     text
Content     是     回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
回复图片消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>参数     是否必须     说明
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间 (整型)
MsgType     是     image
MediaId     是     通过素材管理接口上传多媒体文件,得到的id。回复语音消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>参数     是否必须     说明
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间戳 (整型)
MsgType     是     语音,voice
MediaId     是     通过素材管理接口上传多媒体文件,得到的id回复视频消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[media_id]]></MediaId>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
</Video>
</xml>参数     是否必须     说明
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间 (整型)
MsgType     是     video
MediaId     是     通过素材管理接口上传多媒体文件,得到的id
Title     否     视频消息的标题
Description     否     视频消息的描述
回复音乐消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
<Music>
<Title><![CDATA[TITLE]]></Title>
<Description><![CDATA[DESCRIPTION]]></Description>
<MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
<HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
<ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
</Music>
</xml>参数     是否必须     说明
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间 (整型)
MsgType     是     music
Title     否     音乐标题
Description     否     音乐描述
MusicURL     否     音乐链接
HQMusicUrl     否     高质量音乐链接,WIFI环境优先使用该链接播放音乐
ThumbMediaId     否     缩略图的媒体id,通过素材管理接口上传多媒体文件,得到的id
回复图文消息<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml> 参数     是否必须     说明
ToUserName     是     接收方帐号(收到的OpenID)
FromUserName     是     开发者微信号
CreateTime     是     消息创建时间 (整型)
MsgType     是     news
ArticleCount     是     图文消息个数,限制为10条以内
Articles     是     多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
Title     否     图文消息标题
Description     否     图文消息描述
PicUrl     否     图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
Url     否     点击图文消息跳转链接 

View Code

详细可以查看  官网

同样,把消息回复中定义的所有消息都有的字段提取出来,封装成一个基类,

这些公有的字段包括:

ToUserName(接收方帐号,用户的OPEN_ID);

FromUserName(开发者的微信号);

CreateTime(消 息的创建时间);

MsgType(消息类型);

FuncFlag(消息的星标标识)。

响应消息的基类BaseMessage:

package com.souvc.weixin.message.resp;/**
* 类名: BaseMessage </br>
* 描述: 消息基类(公众帐号 -> 普通用户) </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class BaseMessage {// 接收方帐号(收到的OpenID)private String ToUserName;// 开发者微信号private String FromUserName;// 消息创建时间 (整型)private long CreateTime;// 消息类型private String MsgType;public String getToUserName() {return ToUserName;}public void setToUserName(String toUserName) {ToUserName = toUserName;}public String getFromUserName() {return FromUserName;}public void setFromUserName(String fromUserName) {FromUserName = fromUserName;}public long getCreateTime() {return CreateTime;}public void setCreateTime(long createTime) {CreateTime = createTime;}public String getMsgType() {return MsgType;}public void setMsgType(String msgType) {MsgType = msgType;}
}

View Code

(1)回复文本消息

package com.souvc.weixin.message.resp;/**
* 类名: TextMessage </br>
* 描述: 文本消息 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class TextMessage extends BaseMessage {// 回复的消息内容private String Content;public String getContent() {return Content;}public void setContent(String content) {Content = content;}
}

View Code

(2)回复图片消息

package com.souvc.weixin.message.resp;/**
* 类名: Image </br>
* 描述: 图片 </br>
* 开发人员:souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class Image {private String MediaId;public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}
}

View Code

package com.souvc.weixin.message.resp;/**
* 类名: ImageMessage </br>
* 描述: 图片消息</br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class ImageMessage extends BaseMessage {private Image Image;public Image getImage() {return Image;}public void setImage(Image image) {Image = image;}
}

View Code

(3)回复语音消息

package com.souvc.weixin.message.resp;/**
* 类名: Voice </br>
* 描述: 语音model </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class Voice {// 媒体文件idprivate String MediaId;public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}
}

View Code

package com.souvc.weixin.message.resp;/**
* 类名: VoiceMessage </br>
* 描述: 语音消息</br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class VoiceMessage extends BaseMessage {// 语音private Voice Voice;public Voice getVoice() {return Voice;}public void setVoice(Voice voice) {Voice = voice;}
}

View Code

(4)回复视频消息

package com.souvc.weixin.message.resp;/**
* 类名: Video </br>
* 描述: 视频model </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class Video {// 媒体文件idprivate String MediaId;// 缩略图的媒体idprivate String ThumbMediaId;public String getMediaId() {return MediaId;}public void setMediaId(String mediaId) {MediaId = mediaId;}public String getThumbMediaId() {return ThumbMediaId;}public void setThumbMediaId(String thumbMediaId) {ThumbMediaId = thumbMediaId;}
}

View Code

package com.souvc.weixin.message.resp;/**
* 类名: VideoMessage </br>
* 描述: 视频消息 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class VideoMessage extends BaseMessage {// 视频private Video Video;public Video getVideo() {return Video;}public void setVideo(Video video) {Video = video;}
}

View Code

(5)回复音乐消息

package com.souvc.weixin.message.resp;/**
* 类名: Music </br>
* 描述: 音乐model </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class Music {// 音乐标题private String Title;// 音乐描述private String Description;// 音乐链接private String MusicUrl;// 高质量音乐链接,WIFI环境优先使用该链接播放音乐private String HQMusicUrl;// 缩略图的媒体id,通过上传多媒体文件得到的idprivate String ThumbMediaId;public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String getDescription() {return Description;}public void setDescription(String description) {Description = description;}public String getMusicUrl() {return MusicUrl;}public void setMusicUrl(String musicUrl) {MusicUrl = musicUrl;}public String getHQMusicUrl() {return HQMusicUrl;}public void setHQMusicUrl(String musicUrl) {HQMusicUrl = musicUrl;}public String getThumbMediaId() {return ThumbMediaId;}public void setThumbMediaId(String thumbMediaId) {ThumbMediaId = thumbMediaId;}
}

View Code

package com.souvc.weixin.message.resp;/**
* 类名: MusicMessage </br>
* 描述: 音乐消息 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class MusicMessage extends BaseMessage {// 音乐private Music Music;public Music getMusic() {return Music;}public void setMusic(Music music) {Music = music;}
}

View Code

(6) 回复图文消息

package com.souvc.weixin.message.resp;/**
* 类名: Article </br>
* 描述: 图文model </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class Article {// 图文消息名称private String Title;// 图文消息描述private String Description;// 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80private String PicUrl;// 点击图文消息跳转链接private String Url;public String getTitle() {return Title;}public void setTitle(String title) {Title = title;}public String getDescription() {return null == Description ? "" : Description;}public void setDescription(String description) {Description = description;}public String getPicUrl() {return null == PicUrl ? "" : PicUrl;}public void setPicUrl(String picUrl) {PicUrl = picUrl;}public String getUrl() {return null == Url ? "" : Url;}public void setUrl(String url) {Url = url;}
}

View Code

package com.souvc.weixin.message.resp;import java.util.List;/**
* 类名: NewsMessage </br>
* 描述: 文本消息 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-9-30 </br>
* 发布版本:V1.0  </br>*/
public class NewsMessage extends BaseMessage {// 图文消息个数,限制为10条以内private int ArticleCount;// 多条图文消息信息,默认第一个item为大图private List<Article> Articles;public int getArticleCount() {return ArticleCount;}public void setArticleCount(int articleCount) {ArticleCount = articleCount;}public List<Article> getArticles() {return Articles;}public void setArticles(List<Article> articles) {Articles = articles;}
}

View Code

封装结束。

为了方便,提供一下这些类的源码:

http://yunpan.cn/cL7KUQ4Q5tMeh  访问密码 75e7

其他文章关联:

第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备

第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

其他:Web开发须知:URL编码与解码

转载于:https://www.cnblogs.com/liuhongfeng/p/4846882.html

第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...相关推荐

  1. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  2. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  3. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结. 所以下面给大家分享一下我的经验: 第一部分   介绍微信公众号的一些简单 ...

  4. 视频教程-微信公众平台开发实战PHP版-微信开发

    微信公众平台开发实战PHP版 互联商通创始人/架构师, 在IT领域摸爬滚打20年的全栈老程序员(架构师.培训讲师).熟悉iOS.Android及LNMP的架构下快速开发互联网相关项目.精通微信和支付宝 ...

  5. 微信公众平台开发教程Java版(六) 事件处理(菜单点击/关注/取消关注)

    前言: 事件处理是非常重要的,这一章讲讲常见的事件处理 1.关注/取消关注 2.菜单点击 事件类型介绍: 在微信中有事件请求是消息请求中的一种.请求类型为:event 而event事件类型又分多种事件 ...

  6. 微信公众平台开发教程Java版(一)环境准备篇

    准备写系列博客,记录下我的微信公众平台学习记录,也为那些摸索中的开发者提供点参考. 希望与大家共同进步. 微信3.0的时候我开始做微信公众账号,那时候没时间研究开发,先用的是编辑者模式,后用开发者模式 ...

  7. 微信公众平台开发教程Java版(三) 消息接收和发送

    前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息,发送消息) http://mp.weixin.qq.com/wiki/index.ph ...

  8. java 微信 接收消息_微信公众平台开发教程Java版(三) 消息接收和发送

    https://www.iteye.com/blog/tuposky-2017429 前面两章已经介绍了如何接入微信公众平台,这一章说说消息的接收和发送 可以先了解公众平台的消息api接口(接收消息, ...

  9. 微信公众平台开发实战

    第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众平台开发实战Java版之 ...

最新文章

  1. pyCharm编辑器激活使用
  2. 文巾解题 1711. 大餐计数
  3. mmdnn TensorFlow is outdated
  4. forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务
  5. html编辑器设置为publisher,将PDF转换为Publisher的简单方法
  6. Python进阶丨如何创建你的第一个Python元类?
  7. MATLAB基础学习笔记02:掌握MATLAB运算
  8. 应急照明市电检测_应急照明供电及接线(图析)
  9. ctfshow-WEB-web3
  10. Webpack 配置摘要
  11. 【svn】Centos搭建svn服务器环境
  12. restsharp text html,c# – 使用RestSharp发送HTTP POST Multipart / form-data字段
  13. 自然语言推断:微调BERT
  14. 嵌入式设备的启动过程
  15. html表单中下拉列表,HTML select下拉列表标签
  16. [Java并发包学习]深度剖析ConcurrentHashMap
  17. jsp计算机网络学习网站
  18. 网站常用的五种布局方案
  19. 【学习笔记】噬菌体的应用与展望
  20. 进程调度之时间片轮转调度算法(实验三)

热门文章

  1. Linux操作Oracle(14)——Oracle数据库 使用VMware虚拟网卡 配置 TnsListener 解决 无法启动的问题
  2. 帆软报表跨域之插件开发中Controller中定义的方法实现JSONP跨域
  3. 几何分布的期望_超几何分布与二项分布的数学期望
  4. Django3与Vue3前后端分离搭建
  5. python面向对象(特征,原则)01
  6. P3:线性分类、损失函数与梯度下降
  7. OpenCV:使用python-cv2实现Harr+Adaboost人脸识别
  8. ~~朴素版prim算法
  9. 目标检测——模型效率的优化
  10. leetcode691:Stickers to Spell Word