第三篇 :微信公眾平台開發實戰Java版之請求消息,響應消息以及事件消息類的封裝


 

微信服務器和第三方服務器之間究竟是通過什么方式進行對話的?

 

下面,我們先看下圖:

 

其實我們可以簡單的理解:

(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 {

    // 媒體ID
    private 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{

    // 媒體ID
    private 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 {
    // 媒體文件id
    private 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 {
    // 媒體文件id
    private String MediaId;
    // 縮略圖的媒體id
    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

 

 

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,通過上傳多媒體文件得到的id
    private 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*80
    private 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編碼與解碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM