您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何處理微信公眾號開發(fā)中的消息與事件”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何處理微信公眾號開發(fā)中的消息與事件”這篇文章吧。
1 消息(事件)概況
當普通微信用戶向公眾號發(fā)消息或者微信服務器向公眾號推送事件時,微信服務器將POST消息(事件)的XML數(shù)據(jù)包到開發(fā)者填寫的公眾號服務器URL上;公眾號服務器然后對消息作出響應。
1.1 消息的流轉過程
為了便于區(qū)分,我們將微信服務器發(fā)往公眾號服務器的消息稱為請求(Request)消息;將公眾號服務器發(fā)往微信服務器的消息稱為響應(Response)消息;將推送事件看成特殊的請求消息。
請求與響應消息的流轉過程如下圖所示:
1.2 請求消息
請求消息有很多種,我們?yōu)槠湟灰唤⒘藢念?,類層次結構如下圖所示:
有些請求消息,我們可以做出響應,有些則不能,詳見下表:
消息類型 | 是否事件 | 能夠被動回復 | 備注 |
文本 | × | √ | |
圖片 | × | √ | |
聲音 | × | √ | |
視頻 | × | 未知 | 接收不到視頻消息,不知道是否能被動回復 |
地理位置 | × | √ | |
鏈接 | × | √ | |
訂閱 | √ | √ | |
取消訂閱 | √ | × | |
掃描二維碼 | √ | × | |
上報地理位置 | √ | × | |
點擊菜單拉取消息 | √ | √ | |
點擊菜單跳轉鏈接 | √ | × | |
點擊菜單掃碼推 | √ | × | |
點擊菜單掃碼等待回復 | √ | √ | |
點擊菜單系統(tǒng)發(fā)圖 | √ | 未知 | 接收不到系統(tǒng)發(fā)圖事件;微信服務器會發(fā)送圖片消息,可回復 |
點擊菜單拍照或相冊發(fā)圖 | √ | × | 微信服務器會發(fā)送圖片消息,可回復 |
點擊菜單微信發(fā)圖 | √ | × | 微信服務器會發(fā)送圖片消息,可回復 |
點擊菜單選擇地理位置 | √ | × | 微信服務器會發(fā)送地理位置消息,可回復 |
推送群發(fā)消息結果 | √ | × | |
推送發(fā)送模板消息結果 | √ | × |
1.3 響應消息
響應消息的類層次結構如下圖所示:
2 驗證消息的真實性
公眾號服務器接收到微信服務器的請求之后,第一件事情是驗證消息的真實性。
Utility.CheckSignature方法用于驗證消息簽名是否正確。
示例如下:
/// <summary> /// 驗證消息的有效性 /// </summary> /// <param name="context"></param> /// <returns>如果消息有效,返回true;否則返回false。</returns> private bool Validate(HttpContext context) { string username = RequestEx.TryGetQueryString("username"); //在接口配置的URL中加入了username參數(shù),表示哪個微信公眾號 AccountInfo account = AccountInfoCollection.GetAccountInfo(username); if (account == null) return false; string token = account.Token; string signature = RequestEx.TryGetQueryString("signature"); string timestamp = RequestEx.TryGetQueryString("timestamp"); string nonce = RequestEx.TryGetQueryString("nonce"); if (string.IsNullOrWhiteSpace(signature) || string.IsNullOrWhiteSpace(timestamp) || string.IsNullOrWhiteSpace(nonce)) return false; return xrwang.weixin.PublicAccount.Utility.CheckSignature(signature, token, timestamp, nonce); } 驗證消息真實性
驗證消息真實性
3 解析消息
如果消息簽名通過驗證,我們需要將XML格式的消息文本解析成請求消息對象,RequestMessageHelper類用于完成這項工作。
RequestMessageHelper helper = new RequestMessageHelper(context.Request); if(helper.Message != null) { //消息解析成功,對它進行處理 }
消息解析成功之后,helper.Message為消息基類RequestBaseMessage,我們可以根據(jù)屬性MsgType及Event判斷到底是哪種消息(事件),并轉換成適當?shù)淖宇愋?。例如?/p>
RequestBaseMessage bm=helper.Message; switch(bm.MsgType) { case RequestMessageTypeEnum.text: //文本消息 HandleTextMessage((RequestTextMessage)bm); break; case RequestMessageTypeEnum.image: //圖片消息 HandleImageMessage((RequestImageMessage)bm); break; //處理其他消息 case RequestMessageTypeEnum.event: //事件 RequestEventMessage ev=(RequestEventMessage)bm; switch(ev.Event) { case RequestEventTypeEnum.subscribe: //訂閱 HandleSubscribeMessage((RequestSubscribeMessage)ev); break; case RequestEventTypeEnum.unsubscribe: //取消訂閱 HandleUnsubscribeMessage((RequestUnsubscribeMessage)ev); break; //處理其他事件 } break; default: break; }
解析消息的細節(jié)請參看源代碼:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/blob/master/PublicAccount/RequestMessage/RequestMessageHelper.cs
4 被動回復消息
從微信服務器接收到消息(事件)之后,我們可以在5秒之內(nèi)直接(被動)回復消息;也可以先直接回復空字符串,然后再在48小時內(nèi)回復客服消息。
先初始化ResponseXxxMessage,然后用ToXml方法得到響應消息內(nèi)容。
被動回復消息的示例如下:
/// <summary> /// 處理微信的POST請求 /// </summary> /// <param name="context"></param> /// <returns>返回xml響應</returns> private string HandlePost(HttpContext context) { RequestMessageHelper helper = new RequestMessageHelper(context.Request); if (helper.Message != null) { ResponseBaseMessage responseMessage = HandleRequestMessage(helper.Message); return responseMessage.ToXml(helper.EncryptType); } else return string.Empty; } /// <summary> /// 處理請求消息,返回響應消息 /// </summary> /// <returns>返回響應消息</returns> private ResponseBaseMessage HandleRequestMessage(RequestBaseMessage requestMessage) { ResponseTextMessage response = new ResponseTextMessage(requestMessage.FromUserName, requestMessage.ToUserName, DateTime.Now, string.Format("自動回復,請求內(nèi)容如下:\r\n{0}", requestMessage)); return response; }
以上是“如何處理微信公眾號開發(fā)中的消息與事件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。