国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Rumah applet WeChat pembangunan WeChat 微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)

微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)

Feb 14, 2017 am 11:17 AM

項目GitHub地址https://github.com/Andyahui/xgyxsh_WeiXin

一:微信XML的POST請求處理

昨天我們已經(jīng)成為了開發(fā)者,說明get請求時可以到底,且是得到了相應(yīng)的處理,下面是我們通過瀏覽器我們配置的URL瀏覽到的。

微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)

我們可以發(fā)現(xiàn)在get請求中設(shè)置的返回值在這里出現(xiàn)了,說明我們的測試是成功的。下面我們需要設(shè)置POST請求對應(yīng)的Action。

? 注意:由于我們微信和網(wǎng)站服務(wù)器的每一次交互都是通過POST請求來得到自己想要的東西,我們就必須為傳輸進行加密。

        /// <summary>
        /// 用戶發(fā)送消息后,微信平臺自動Post一個請求到這里,并等待響應(yīng)XML。
        /// PS:此方法為簡化方法,效果與OldPost一致。
        /// v0.8之后的版本可以結(jié)合Senparc.Weixin.MP.MvcExtension擴展包,使用WeixinResult,見MiniPost方法。
        /// </summary>
        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(PostModel postModel)
        {
            postModel.Token = Token;
            // postModel.EncodingAESKey = "";          //根據(jù)自己后臺的設(shè)置保持一致
            // postModel.AppId = AppId;                       //根據(jù)自己后臺的設(shè)置保持一致  
            //驗證數(shù)字簽名
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                //??? 這里有問題,要是不注釋的話,就會在這里出錯,也就是數(shù)字簽名有問題。
                //return Content("參數(shù)錯誤!");
            }

            //  1:自定義MessageHandler,對微信請求的詳細判斷操作都在這里面。  實例化了一個類
            var messageHandler = new CustomMessageHandle(Request.InputStream, postModel);   //接收消息

            //  2:執(zhí)行微信處理過程----執(zhí)行完這里之后ResponseMessage才會有值。
            messageHandler.Execute();            

            //  3:return new FixWeixinBugWeixinResult(messageHandler); 這個有換行的問題。           
            //return new FixWeixinBugWeixinResult(messageHandler.ToString());

            //  3:注意第三個----為了解決官方微信5.0軟件換行bug暫時添加的方法,平時用下面一個方法即可
            return new WeixinResult(messageHandler);                 //v0.8+
        }

我們可以清楚的看到上面的每一行的意思,這里我有個疑問,驗證數(shù)字簽名的里面要是不注釋if判斷里面的就直接顯示“參數(shù)錯誤”不會繼續(xù)執(zhí)行下面的操作,但是官網(wǎng)博客里面沒有注釋,不知道為什么??(求大神解答。)

上面主要有三步:

先是實例化了CustomMessageHandle對象,并且傳遞了對應(yīng)的參數(shù),通過對應(yīng)的CTOR進行了初始化,接著調(diào)用它的Execute()方法,最后通過實例化WeixinResult來返回對應(yīng)的CustomMessageHandle對象,此時對象中就包含了我們網(wǎng)站后臺的邏輯處理方法。

這就是我們POST請求對于的處理,每一次微信服務(wù)器轉(zhuǎn)發(fā)的xml信息都會利用POST請求形式再次轉(zhuǎn)發(fā)到這里,我們進行處理。

二:了解MessageHandler

要完成微信開發(fā),SDK中關(guān)鍵類就需要了解,下面就簡單說下MessageHandler;

MessageHandler是SDK處理消息的核心,主要對于POST請求,進行對應(yīng)的處理。還可以進行邏輯判斷,說白了就是我們所有的業(yè)務(wù)邏輯都是在這個類下面進行的。<消息和事件>。這是一個抽象類,我們需要通過繼承重新實現(xiàn)它。下面是具體的實現(xiàn)?!哆@里是對應(yīng)官方的解釋WiKi》。

namespace XGY_WeiXin.WeiXinHelper
{
    public class CustomMessageHandle : MessageHandler<CustomMessageContext>
    {
        //PostModel:表示的都是從微信服務(wù)器里面得到的值,時間戳,字符串等。(WeiXinController中使用過)
        //構(gòu)造函數(shù)的inputStream用于接收來自微信服務(wù)器的請求流(如果需要在外部處理,這里也可以傳入XDocument)。
        public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel)
        {            
        }
        /// <summary>
        /// 必須實現(xiàn)抽象的類------作用:用于放回一條信息,當(dāng)沒有對應(yīng)類型的微信消息沒有被代碼處理,那么默認會執(zhí)行返回這里的結(jié)果。
        /// </summary>
        /// <param name="requestMessage">請求消息</param>
        /// <returns></returns>
    public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
    {
        //CreateResponseMessage<T>  這里是創(chuàng)建一個放回的對象,代表不同的類型,
        var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更換為別的類型
        responseMessage.Content = "這條消息來自DefaultResponseMessage。";
        return responseMessage;
    }
         /// <summary>
        ///1: 處理用戶發(fā)送過來的文字消息。重寫OnTextRequest方法。
       /// --------(總結(jié):)方法里面可以自由發(fā)揮,讀取DB,判斷關(guān)鍵字,甚至返回不同的ResponseMessageXX類型(只要最終的類型都是在IResponseMessageBase接口下的即可)。
        /// </summary>
        /// <param name="requestMessage">請求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //CreateResponseMessage<類型>根據(jù)當(dāng)前的RequestMessage創(chuàng)建指定類型的ResponseMessage;創(chuàng)建相應(yīng)消息.
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您發(fā)送了文字信息:" +
                                      requestMessage.Content;
            return responseMessage;
        }
    }
}

從上到下分析。發(fā)現(xiàn)它是繼承自MessageHandler但是它后面還有個CustomMessageContext,此時對于MessageHandler有了重新的認識,這貨原來是個泛型的抽象類,我們需要往里面填寫個類型,查看官方說明說這個CustomMessageContext是個自定義的上下文類,到底是什么了,我也沒仔細研究,看官方的介紹吧(WiKi)。接著下面是個CTOR,主要是實例化的時候使用,注意里面的參數(shù),一個是請求流inputSrream,一個是微信服務(wù)器發(fā)送的數(shù)據(jù)類PostModel。在接著就是我們實現(xiàn)的方法了,第一個是DefaultResponseMessage方法,這個是必須實現(xiàn)的。因為它是處理微信請求來沒有響應(yīng)的數(shù)據(jù),默認給微信服務(wù)器發(fā)送消息的。最后到了文本處理了,這里override了OnTextRequest方法,從而可以對應(yīng)響應(yīng)用戶的文本信息請求。我們要是需要實現(xiàn)別的處理,比如圖片,語音,地理位置等,分別重寫別的方法,返回對應(yīng)的消息類型就可以實現(xiàn)。

三:自定義上下文CustomMessageContext

下面是自定義上下文類CustomMessageContext,主要是繼承自MessageContext來實現(xiàn)對于的功能。

    /// <summary>
    /// 自定義的上下文類---->處理單個用戶的對話狀態(tài)。
    /// </summary>
    public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved;
        }
        /// <summary>
        /// 當(dāng)上下文過期,被移除的時候觸發(fā)的時間
        /// </summary>
        private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
        {
            /* 注意,這個事件不是實時觸發(fā)的(當(dāng)然你也可以專門寫一個線程監(jiān)控)
            * 為了提高效率,根據(jù)WeixinContext中的算法,這里的過期消息會在過期后下一條請求執(zhí)行之前被清除
            */
            var messageContext = e.MessageContext as CustomMessageContext;
            if (messageContext==null)
            {
                //如果是正常的調(diào)用,messageContext不會為null
                return ;                 
            }
            //TODO:這里根據(jù)需要執(zhí)行消息過期時候的邏輯,下面的代碼僅供參考
            //Log.InfoFormat("{0}的消息上下文已過期",e.OpenId);
            //api.SendMessage(e.OpenId, "由于長時間未搭理客服,您的客服狀態(tài)已退出!");
        }
    }

?? 解釋參考官方給的解釋,版本升級了(WiKi),我覺得這里以后還是會做大文章的。

四:微信測試號效果展示

?? 此時我們大體的底層框架就搭建成功了,我們發(fā)布部署到服務(wù)器上面就可以看到文本處理的響應(yīng)了。

微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)

這是微信的二維碼可以關(guān)注下,可以實現(xiàn)簡單的互動。

微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)

更多微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)?相關(guān)文章請關(guān)注PHP中文網(wǎng)!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276