您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關微信開發中如何實現POST請求響應的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一:微信XML的POST請求處理
昨天我們已經成為了開發者,說明get請求時可以到底,且是得到了相應的處理,下面是我們通過瀏覽器我們配置的URL瀏覽到的。
我們可以發現在get請求中設置的返回值在這里出現了,說明我們的測試是成功的。下面我們需要設置POST請求對應的Action。
注意:由于我們微信和網站服務器的每一次交互都是通過POST請求來得到自己想要的東西,我們就必須為傳輸進行加密。
/// <summary> /// 用戶發送消息后,微信平臺自動Post一個請求到這里,并等待響應XML。 /// PS:此方法為簡化方法,效果與OldPost一致。 /// v0.8之后的版本可以結合Senparc.Weixin.MP.MvcExtension擴展包,使用WeixinResult,見MiniPost方法。 /// </summary> [HttpPost] [ActionName("Index")] public ActionResult Post(PostModel postModel) { postModel.Token = Token; // postModel.EncodingAESKey = ""; //根據自己后臺的設置保持一致 // postModel.AppId = AppId; //根據自己后臺的設置保持一致 //驗證數字簽名 if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { //??? 這里有問題,要是不注釋的話,就會在這里出錯,也就是數字簽名有問題。 //return Content("參數錯誤!"); } // 1:自定義MessageHandler,對微信請求的詳細判斷操作都在這里面。 實例化了一個類 var messageHandler = new CustomMessageHandle(Request.InputStream, postModel); //接收消息 // 2:執行微信處理過程----執行完這里之后ResponseMessage才會有值。 messageHandler.Execute(); // 3:return new FixWeixinBugWeixinResult(messageHandler); 這個有換行的問題。 //return new FixWeixinBugWeixinResult(messageHandler.ToString()); // 3:注意第三個----為了解決官方微信5.0軟件換行bug暫時添加的方法,平時用下面一個方法即可 return new WeixinResult(messageHandler); //v0.8+ }
我們可以清楚的看到上面的每一行的意思,這里我有個疑問,驗證數字簽名的里面要是不注釋if判斷里面的就直接顯示“參數錯誤”不會繼續執行下面的操作,但是官網博客里面沒有注釋,不知道為什么??(求大神解答。)
上面主要有三步:
先是實例化了CustomMessageHandle對象,并且傳遞了對應的參數,通過對應的CTOR進行了初始化,接著調用它的Execute()方法,最后通過實例化WeixinResult來返回對應的CustomMessageHandle對象,此時對象中就包含了我們網站后臺的邏輯處理方法。
<CustomMessageHandle主要是繼承了MessageHandle抽象類,是我們自定義的>
這就是我們POST請求對于的處理,每一次微信服務器轉發的xml信息都會利用POST請求形式再次轉發到這里,我們進行處理。
二:了解MessageHandler
要完成微信開發,SDK中關鍵類就需要了解,下面就簡單說下MessageHandler;
MessageHandler是SDK處理消息的核心,主要對于POST請求,進行對應的處理。還可以進行邏輯判斷,說白了就是我們所有的業務邏輯都是在這個類下面進行的。<消息和事件>。這是一個抽象類,我們需要通過繼承重新實現它。下面是具體的實現。《這里是對應官方的解釋WiKi》。
namespace XGY_WeiXin.WeiXinHelper { public class CustomMessageHandle : MessageHandler<CustomMessageContext> { //PostModel:表示的都是從微信服務器里面得到的值,時間戳,字符串等。(WeiXinController中使用過) //構造函數的inputStream用于接收來自微信服務器的請求流(如果需要在外部處理,這里也可以傳入XDocument)。 public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel) { } /// <summary> /// 必須實現抽象的類------作用:用于放回一條信息,當沒有對應類型的微信消息沒有被代碼處理,那么默認會執行返回這里的結果。 /// </summary> /// <param name="requestMessage">請求消息</param> /// <returns></returns> public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage) { //CreateResponseMessage<T> 這里是創建一個放回的對象,代表不同的類型, var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更換為別的類型 responseMessage.Content = "這條消息來自DefaultResponseMessage。"; return responseMessage; } /// <summary> ///1: 處理用戶發送過來的文字消息。重寫OnTextRequest方法。 /// --------(總結:)方法里面可以自由發揮,讀取DB,判斷關鍵字,甚至返回不同的ResponseMessageXX類型(只要最終的類型都是在IResponseMessageBase接口下的即可)。 /// </summary> /// <param name="requestMessage">請求消息</param> /// <returns></returns> public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //CreateResponseMessage<類型>根據當前的RequestMessage創建指定類型的ResponseMessage;創建相應消息. var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您發送了文字信息:" + requestMessage.Content; return responseMessage; } } }
從上到下分析。發現它是繼承自MessageHandler但是它后面還有個CustomMessageContext,此時對于MessageHandler有了重新的認識,這貨原來是個泛型的抽象類,我們需要往里面填寫個類型,查看官方說明說這個CustomMessageContext是個自定義的上下文類,到底是什么了,我也沒仔細研究,看官方的介紹吧(WiKi)。接著下面是個CTOR,主要是實例化的時候使用<POST請求的時候使用過>,注意里面的參數,一個是請求流inputSrream,一個是微信服務器發送的數據類PostModel。在接著就是我們實現的方法了,第一個是DefaultResponseMessage方法,這個是必須實現的。因為它是處理微信請求來沒有響應的數據,默認給微信服務器發送消息的。最后到了文本處理了,這里override了OnTextRequest方法,從而可以對應響應用戶的文本信息請求。我們要是需要實現別的處理,比如圖片,語音,地理位置等,分別重寫別的方法,返回對應的消息類型就可以實現。
三:自定義上下文CustomMessageContext
下面是自定義上下文類CustomMessageContext,主要是繼承自MessageContext<IRequestMessageBase,IResponseMessageBase>來實現對于的功能。
/// <summary> /// 自定義的上下文類---->處理單個用戶的對話狀態。 /// </summary> public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase> { public CustomMessageContext() { base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved; } /// <summary> /// 當上下文過期,被移除的時候觸發的時間 /// </summary> private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e) { /* 注意,這個事件不是實時觸發的(當然你也可以專門寫一個線程監控) * 為了提高效率,根據WeixinContext中的算法,這里的過期消息會在過期后下一條請求執行之前被清除 */ var messageContext = e.MessageContext as CustomMessageContext; if (messageContext==null) { //如果是正常的調用,messageContext不會為null return ; } //TODO:這里根據需要執行消息過期時候的邏輯,下面的代碼僅供參考 //Log.InfoFormat("{0}的消息上下文已過期",e.OpenId); //api.SendMessage(e.OpenId, "由于長時間未搭理客服,您的客服狀態已退出!"); } }
解釋參考官方給的解釋,版本升級了(WiKi),我覺得這里以后還是會做大文章的。
四:微信測試號效果展示
此時我們大體的底層框架就搭建成功了,我們發布部署到服務器上面就可以看到文本處理的響應了。
這是微信的二維碼可以關注下,可以實現簡單的互動。
感謝各位的閱讀!關于“微信開發中如何實現POST請求響應”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。