在上一篇博客中,我們只是簡單地與微信服務器建立了連接,接下來就是從微信服務器中接收信息了。在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 class ImageMessage extends BaseMessage {
//圖片鏈接
private String PicUrl;
}
- 鏈接消息實體
public class LinkMessage extends BaseMessage {
//消息標題
private String Title;
//消息描述
private String Description;
//消息鏈接
private String Url;
}
- 地理位置消息實體
public class LocationMessage extends BaseMessage {
//地理位置緯度
private String Location_X;
//地理位置經度
private String Location_Y;
//地圖縮放大小
private String Scale;
//地圖位置信息
private String Label;
}
- 文本消息實體
public class TextMessage extends BaseMessage {
//消息內容
private String Content;
}
- 視頻消息實體
public class VideoMessage extends BaseMessage {
//視頻消息媒體id,可以調用多媒體文件下載接口拉取數據
private String MediaId;
//視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據
private String ThumbMediaId;
}
- 語音消息實體
public class VoiceMessage extends BaseMessage {
//媒體Id
private String MediaId;
//語音格式
private String Format;
}
(四)反饋信息的分類和實體的創建
篇幅關係,將省略所有實體類的Get和Set方法。
根據各種反饋信息類型,我們將其分爲一個基礎類和六個實體(五個信息體)。
1. 反饋信息基礎類
public class BaseMessage {
//接收方賬號(OpenID)
private String ToUserName;
//開發者微信號
private String FromUserName;
//消息創建時間(整型)
private long CreateTime;
//消息類型(text/music/news……)
private String MsgType;
}
- 文本信息實體
public class TextMessage extends BaseMessage {
//回覆消息內容
private String Content;
}
- 圖片信息體 和 圖片信息實體
public class Image {
//圖片信息id
private String MediaId;
}
public class ImageMessage extends BaseMessage {
private Image image;
}
- 圖文信息體 和 圖文信息實體
public class Article {
//圖文消息名稱
private String Title;
//圖文消息描述
private String Description;
//圖片鏈接,支持JPG、PNG格式
private String PicUrl;
//點擊圖文消息跳轉鏈接
private String Url;
}
public class NewsMessage extends BaseMessage {
//圖文消息個數,一般限制爲10條以內
private int ArticleCount;
//多圖文消息信息
private List<Article> Articles;
}
- 語音信息體 和 語音信息實體
public class Voice {
private String MediaId;
}
public class VoiceMessage extends BaseMessage {
private Voice voice;
}
- 音樂信息體 和 音樂信息實體
public class Music {
//音樂名稱
private String Title;
//音樂描述
private String Description;
//音樂鏈接
private String MusicUrl;
//高質量音樂鏈接,WIFI環境下優先使用該鏈接
private String HQMusicUrl;
}
public class MusicMessage extends BaseMessage {
private Music music;
}
- 視頻信息體 和 視頻信息實體
public class Video {
//多媒體鏈接
private String MediaId;
//視頻標題
private String Title;
//視頻描述
private String Description;
}
public class VideoMessage extends BaseMessage {
private Video video;
}
(五)總結
這一篇博客主要爲我們服務器與用戶進行交流時,準備好各種實體類型。通過對開發者文檔的閱讀,我們可以很快就完成實體的創建。但在閱讀的過程中,我們也將考慮到許多問題:如何進行實體與XML格式之間的轉化?什麼鬼之類的。
接下來的,我們下一篇博客再講ヾ( ̄▽ ̄)Bye~Bye~