微信應用使用場景和商機很多,所以這也是一個技術的方向,因此,有空研究下、學習下微信的相關開發(fā),也就成為SNF完善的必要條件了。本系列文章希望從一個循序漸進的角度上,全面介紹微信的相關開發(fā)過程和相關經(jīng)驗總結,希望給大家了解一下相關的開發(fā)歷程。本篇隨筆主要基于上一篇《C#-MVC開發(fā)微信應用(1)--開始使用微信接口》的基礎上進行深入的介紹,介紹微信消息的處理和應答的過程。
1、微信的消息應答交互
我們知道,微信的服務器架起了客戶手機和開發(fā)者服務器的一個橋梁,通過消息的傳遞和響應,實現(xiàn)了與用戶的交互操作,下面是它的消息流程圖。
微信向開發(fā)者服務器請求的消息包含了多種類型,不過基本來說,分為了文本消息處理、事件消息處理、語音消息的識別,以及成為開發(fā)者之前的那個消息認證操作基本分類,下面是我繪制的一個消息分類圖,其中介紹了這幾種關系,以及各自的消息細化分類。
對于這些消息的請求,我們在開發(fā)服務器端,需要編寫相關的邏輯進行對應給的處理,然后給微信服務器平臺回應消息即可。
在前一篇的隨筆里面我貼過代碼,介紹微信消息處理的入口操作,代碼如下所示。
/// <summary> /// 用戶發(fā)送消息后,微信平臺自動Post一個請求到這里,并等待響應XML。 /// </summary> [HttpPost] [ActionName("Index")] public ActionResult Post(string signature, string timestamp, string nonce, string echostr) { Stream requestStream = System.Web.HttpContext.Current.Request.InputStream; byte[] requestByte = new byte[requestStream.Length]; requestStream.Read(requestByte, 0, (int)requestStream.Length); string requestStr = Encoding.UTF8.GetString(requestByte); SNFWeiXinProcess.Log("請求值:" + requestStr); return Content(SNFWeiXinProcess.Run(requestStr)); //return Content(sss(signature, timestamp, nonce, echostr) ); //return Content(ReceiveXml()); }
SNFWeiXinProcess.Run(requestStr)就是對消息的處理函數(shù),它實現(xiàn)了對不同消息的分發(fā)處理過程?!?/pre>public static string Run(string requestStr) { BaseMessage info = new BaseMessage(); if (!string.IsNullOrEmpty(requestStr)) { info = XmlHelper.Deserialize<BaseMessage>(requestStr, info); } //創(chuàng)建 分發(fā)器 IDistributor distributor = new SNFWeiXinDistributor(); string result = "抱歉,此功能暫未開通"; switch (info.MsgType) { case "text": //01.接收文本信息 RequestText text = new RequestText(); text = XmlHelper.Deserialize<RequestText>(requestStr, text); result = distributor.OnActionText(text); break; default: throw new Exception("找不到處理類型:" + info.MsgType); } return result; }里面的SNFWeiXinProcess就是一個分發(fā)的管理類,它提取請求消息的內容,并構建不同類型的消息參數(shù),傳遞給不同的響應函數(shù)進行處理,然后返回封裝好的XML內容,作為響應。
具體的代碼處理邏輯如下圖所示。
這個消息處理接口,其實就是定義好一系列的對請求消息的處理操作,參數(shù)是不同給的消息對象,具體的代碼定義如下所示(由于篇幅原因,省略部分接口,具體可以參考上圖)。
public interface IDistributor { #region 01.文本信息處理 OnActionText(RequestText text) /// <summary> /// 文本信息處理 /// </summary> /// <param name="text"></param> /// <returns>返回值</returns> string OnActionText(RequestText text); #endregion #region 02.圖片信息處理 OnActionImage(RequestImage image) /// <summary> /// 圖片信息處理 /// </summary> /// <param name="image"></param> /// <returns>返回值</returns> string OnActionImage(RequestImage image); #endregion #region 03.接收的語音消息 OnActionVoice(RequestVoice voice) /// <summary> /// 接收的語音消息 /// </summary> /// <param name="voice"></param> /// <returns>返回值</returns> string OnActionVoice(RequestVoice voice); #endregion ......................................................... #region 02.訂閱 OnActionEventSubscribe(RequestEventSubscribe subscribe) /// <summary> /// 取消訂閱 /// </summary> /// <param name="subscribe"></param> /// <returns>返回值</returns> string OnActionEventSubscribe(RequestEventSubscribe subscribe); #endregion.........................................................#region 06.點擊菜單跳轉鏈接時的事件推送 OnActionEventView(RequestEventView view)
/// <summary>
/// 點擊菜單跳轉鏈接時的事件推送
/// </summary>
/// <param name="view"></param>
/// <returns>返回值</returns>
string OnActionEventView(RequestEventView view);
#endregion
}}
?從上面的代碼可以看出,不同的消息,到處理函數(shù)這里,就以不同的消息實體類的方式傳遞過來了(注意:實體類是我根據(jù)程序開發(fā)需要自己定義的,非微信本身的實體類),這樣非常方便我們處理操作,否則每次需要解析不同的消息內容,很容易出現(xiàn)問題,這樣強類型的數(shù)據(jù)類型,提高了我們開發(fā)微信應用的強壯型和高效性。這些實體類的對象有一定的繼承關系的,他們的繼承關系如下所示。
效果:
?
? 如果覺得還不錯,歡迎轉載。
C#-MVC開發(fā)微信應用(7)--在管理系統(tǒng)中同步微信用戶分組信息
C#-MVC開發(fā)微信應用(5)--自動應答系統(tǒng)-自動回復機器人
C#-MVC開發(fā)微信應用(4)--微信門戶菜單的管理操作
C#-MVC開發(fā)微信應用(3)--文本消息和圖文消息的應答
?
作者: 王春天
QQ群:322581894 關于作者: 大連天翼信息科技有限公司 技術總監(jiān)。 SNF快速開發(fā)平臺 創(chuàng)始人。應用平臺架構師、IT規(guī)劃咨詢專家、業(yè)務流程設計專家。 專注于快速開發(fā)平臺的開發(fā)、代碼生成器。同時專注于微軟平臺項目架構、管理和企業(yè)解決方案,多年項目開發(fā)與管理經(jīng)驗,精通DotNet系列技術Vue、.NetCore、MVC、Webapi、C#、WinForm等,DB(SqlServer、Oracle等)技術,移動端開發(fā)。熟悉Java、VB及PB開發(fā)語言。在面向對象、面向服務以及數(shù)據(jù)庫領域有一定的造詣?,F(xiàn)從事項目實施、開發(fā)、架構等工作。并從事用友軟件產品U8、U9、PLM 客開工作。 如有問題或建議,請多多賜教! 本文版權歸作者和CNBLOGS博客共有,歡迎轉載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過郵箱或QQ 聯(lián)系我,非常感謝。
?
本文摘自 :https://blog.51cto.com/u