ASP.NET MVC5+EF6+EasyUI 后台管理系統(72)-微信公眾平台開發-消息處理


系列目錄

前言

Senparc.Weixin.MP SDK提供了MessageHandler消息處理類

在作者的Wiki中也詳細說明了如何定義這個類,下面我們來演示,消息的回復,及效果

了解MessageHandler

 引用作者的話:CustomMessageHandle.cs需要繼承Senparc.Weixin.MP.MessageHandlers<TC>這個抽象類,並實現部分方法。最初步的CustomMessageHandle.cs代碼

public class CustomMessageHandler : MessageHandler<CustomMessageContext>
    {
        public CustomMessageHandler(Stream inputStream, PostModel postModel)
            : base(inputStream, postModel)
        {
 
        }
 
        public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
        {
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>(); //ResponseMessageText也可以是News等其他類型
            responseMessage.Content = "這條消息來自DefaultResponseMessage。";
            return responseMessage;
        }
    }

這個類繼承接口IResponseMessageBase並可以選擇重寫下面事件

         // 摘要:
        //     Event事件類型請求
        public virtual IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage);
        //
        // 摘要:
        //     卡券未通過審核
        public virtual IResponseMessageBase OnEvent_Card_Not_Pass_CheckRequest(RequestMessageEvent_Card_Not_Pass_Check requestMessage);
        //
        // 摘要:
        //     卡券通過審核
        public virtual IResponseMessageBase OnEvent_Card_Pass_CheckRequest(RequestMessageEvent_Card_Pass_Check requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之CLICK
        public virtual IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之ENTER
        public virtual IResponseMessageBase OnEvent_EnterRequest(RequestMessageEvent_Enter requestMessage);
        //
        // 摘要:
        //     多客服關閉會話
        public virtual IResponseMessageBase OnEvent_Kf_Close_SessionRequest(RequestMessageEvent_Kf_Close_Session requestMessage);
        //
        // 摘要:
        //     多客服接入會話
        public virtual IResponseMessageBase OnEvent_Kf_Create_SessionRequest(RequestMessageEvent_Kf_Create_Session requestMessage);
        //
        // 摘要:
        //     多客服轉接會話
        public virtual IResponseMessageBase OnEvent_Kf_Switch_SessionRequest(RequestMessageEvent_Kf_Switch_Session requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之LOCATION
        public virtual IResponseMessageBase OnEvent_LocationRequest(RequestMessageEvent_Location requestMessage);
        //
        // 摘要:
        //     彈出地理位置選擇器
        public virtual IResponseMessageBase OnEvent_LocationSelectRequest(RequestMessageEvent_Location_Select requestMessage);
        //
        // 摘要:
        //     事件推送群發結果
        public virtual IResponseMessageBase OnEvent_MassSendJobFinishRequest(RequestMessageEvent_MassSendJobFinish requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之微小店訂單付款通知
        public virtual IResponseMessageBase OnEvent_Merchant_Order(RequestMessageEvent_Merchant_Order requestMessage);
        //
        // 摘要:
        //     彈出拍照或者相冊發圖
        public virtual IResponseMessageBase OnEvent_PicPhotoOrAlbumRequest(RequestMessageEvent_Pic_Photo_Or_Album requestMessage);
        //
        // 摘要:
        //     彈出系統拍照發圖
        public virtual IResponseMessageBase OnEvent_PicSysphotoRequest(RequestMessageEvent_Pic_Sysphoto requestMessage);
        //
        // 摘要:
        //     彈出微信相冊發圖器
        public virtual IResponseMessageBase OnEvent_PicWeixinRequest(RequestMessageEvent_Pic_Weixin requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之審核結果事件推送
        public virtual IResponseMessageBase OnEvent_Poi_Check_NotifyRequest(RequestMessageEvent_Poi_Check_Notify requestMessage);
        //
        // 摘要:
        //     掃碼推事件
        public virtual IResponseMessageBase OnEvent_ScancodePushRequest(RequestMessageEvent_Scancode_Push requestMessage);
        //
        // 摘要:
        //     掃碼推事件且彈出“消息接收中”提示框
        public virtual IResponseMessageBase OnEvent_ScancodeWaitmsgRequest(RequestMessageEvent_Scancode_Waitmsg requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之scan
        public virtual IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之搖一搖事件通知
        public virtual IResponseMessageBase OnEvent_ShakearoundUserShake(RequestMessageEvent_ShakearoundUserShake requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之接收會員信息事件通知
        public virtual IResponseMessageBase OnEvent_Submit_Membercard_User_Info(RequestMessageEvent_Submit_Membercard_User_Info requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之subscribe
        public virtual IResponseMessageBase OnEvent_SubscribeRequest(RequestMessageEvent_Subscribe requestMessage);
        //
        // 摘要:
        //     發送模板消息返回結果
        public virtual IResponseMessageBase OnEvent_TemplateSendJobFinishRequest(RequestMessageEvent_TemplateSendJobFinish requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之unsubscribe
        public virtual IResponseMessageBase OnEvent_UnsubscribeRequest(RequestMessageEvent_Unsubscribe requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之卡券核銷
        public virtual IResponseMessageBase OnEvent_User_Consume_Card(RequestMessageEvent_User_Consume_Card requestMessage);
        //
        // 摘要:
        //     刪除卡券
        public virtual IResponseMessageBase OnEvent_User_Del_CardRequest(RequestMessageEvent_User_Del_Card requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之從卡券進入公眾號會話
        public virtual IResponseMessageBase OnEvent_User_Enter_Session_From_Card(RequestMessageEvent_User_Enter_Session_From_Card requestMessage);
        //
        // 摘要:
        //     領取卡券
        public virtual IResponseMessageBase OnEvent_User_Get_CardRequest(RequestMessageEvent_User_Get_Card requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之進入會員卡
        public virtual IResponseMessageBase OnEvent_User_View_Card(RequestMessageEvent_User_View_Card requestMessage);
        //
        // 摘要:
        //     事件之URL跳轉視圖(View)
        public virtual IResponseMessageBase OnEvent_ViewRequest(RequestMessageEvent_View requestMessage);
        //
        // 摘要:
        //     Event事件類型請求之Wi-Fi連網成功
        public virtual IResponseMessageBase OnEvent_WifiConnected(RequestMessageEvent_WifiConnected requestMessage);
        public virtual void OnExecuted();
        public virtual void OnExecuting();
        //
        // 摘要:
        //     圖片類型請求
        public virtual IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage);
        //
        // 摘要:
        //     鏈接消息類型請求
        public virtual IResponseMessageBase OnLinkRequest(RequestMessageLink requestMessage);
        //
        // 摘要:
        //     位置類型請求
        public virtual IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage);
        //
        // 摘要:
        //     小視頻類型請求
        public virtual IResponseMessageBase OnShortVideoRequest(RequestMessageShortVideo requestMessage);
        //
        // 摘要:
        //     預處理文字或事件類型請求。 這個請求是一個比較特殊的請求,通常用於統一處理來自文字或菜單按鈕的同一個執行邏輯, 會在執行OnTextRequest或OnEventRequest之前觸發,具有以下一些特征:
        //     1、如果返回null,則繼續執行OnTextRequest或OnEventRequest 2、如果返回不為null,則終止執行OnTextRequest或OnEventRequest,返回最終ResponseMessage
        //     3、如果是事件,則會將RequestMessageEvent自動轉為RequestMessageText類型,其中RequestMessageText.Content就是RequestMessageEvent.EventKey
        public virtual IResponseMessageBase OnTextOrEventRequest(RequestMessageText requestMessage);
        //
        // 摘要:
        //     文字類型請求
        public virtual IResponseMessageBase OnTextRequest(RequestMessageText requestMessage);
        //
        // 摘要:
        //     視頻類型請求
        public virtual IResponseMessageBase OnVideoRequest(RequestMessageVideo requestMessage);
        //
        // 摘要:
        //     語音類型請求
        public virtual IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage);

基本列出了用戶不同類型的請求,比如用戶向我們發送一條信息,那么會最終會調用OnTextRequest這個方法。

所以我們在CustomMessageHandler中可以重寫方法OnTextRequest

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
    var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
    responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName      //這里的requestMessage.FromUserName也可以直接寫成base.WeixinOpenId
                            + "。\r\n您發送了文字信息:" + requestMessage.Content;  //\r\n用於換行,requestMessage.Content即用戶發過來的文字內容
    return responseMessage;
}

上面代碼給用戶回復了一條文本消息(下面有其他類型可供選擇,但是我們一般使用的是文本和圖文形式,其他情景基本不用)

  • ResponseMessageText - 對應文本消息
  • ResponseMessageNews - 對應圖文消息
  • ResponseMessageMusic - 對應音樂消息
  • ResponseMessageXXX - 其他類型以此類推

同時用戶不僅可以給公眾號發送文本,也是可以發送語音,位置,視頻的(但是實際應用中我們一般不處理這些場景),需要重寫

  • OnImageRequest -對應圖文的請求
  • OnLinkRequest - 對應超鏈接的請求
  • OnTextRequest - 對應文本的請求
  • OnLocationRequest - 對應位置的請求
  • ......  - 其他請求類型或者時間

最后返回最用戶的處理

     [HttpPost]
        [ActionName("Post")]
        public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
        {
            if (!CheckSignature.Check(signature, timestamp, nonce, Token))
            {
                return Content("參數錯誤!");
            }

            var messageHandler = new CustomerMessageHandler(Request.InputStream);
            messageHandler.Execute();//執行微信處理過程
            return Content(messageHandler.ResponseDocument.ToString());
        }

返回圖文的類型

上面代碼提供了文本的,我們這次再來提供一個圖文本的吧,這個比較陌生:

當只是一條組合的時候是這樣的

 

 var responseMessage = CreateResponseMessage<ResponseMessageNews>();
                    responseMessage.Articles.Add(new Article()
                    {
                        Title = "十三妹",
                        Description = "十三妹",
                        PicUrl = "http://ymnets.imwork.net/uplouad/pic/20160903/1.png",
                        Url = "http://ymnets.cnblogs.com"
                    });
                    return responseMessage;

多條對應:只需要在responseMessage.Articles.Add添加Article就可以了

 

var responseMessage = CreateResponseMessage<ResponseMessageNews>();
                    responseMessage.Articles.Add(new Article()
                    {
                        Title = "陳浩南01",
                        Description = "陳浩南01",
                        PicUrl = "http://ymnets.imwork.net/uplouad/pic/20160903/2.png",
                        Url = "http://ymnets.cnblogs.com"
                    });
                    responseMessage.Articles.Add(new Article()
                    {
                        Title = "陳浩南02",
                        Description = "陳浩南02",
                        PicUrl = "http://ymnets.imwork.net/uplouad/pic/20160903/4.png",
                        Url = "http://ymnets.cnblogs.com"
                    });
                    responseMessage.Articles.Add(new Article()
                    {
                        Title = "陳浩南03",
                        Description = "陳浩南03",
                        PicUrl = "http://ymnets.imwork.net/uplouad/pic/20160903/5.png",
                        Url = "http://ymnets.cnblogs.com"
                    });
                    return responseMessage;

 

這一節,主要為我們后面創建自動回復模塊進行鋪墊,知道要返回的格式,才能對應的設計好數據庫的表

參考資料

如何使用MessageHandler簡化消息處理流程


免責聲明!

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



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