溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)

發(fā)布時(shí)間:2021-01-30 10:17:35 來(lái)源:億速云 閱讀:341 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章給大家分享的是有關(guān)微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

一:微信XML的POST請(qǐng)求處理

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

微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)

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

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

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

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

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

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

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

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

上面主要有三步:

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

<CustomMessageHandle主要是繼承了MessageHandle抽象類,是我們自定義的>

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

二:了解MessageHandler

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

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

namespace XGY_WeiXin.WeiXinHelper
{
    public class CustomMessageHandle : MessageHandler<CustomMessageContext>
    {
        //PostModel:表示的都是從微信服務(wù)器里面得到的值,時(shí)間戳,字符串等。(WeiXinController中使用過(guò))
        //構(gòu)造函數(shù)的inputStream用于接收來(lái)自微信服務(wù)器的請(qǐng)求流(如果需要在外部處理,這里也可以傳入XDocument)。
        public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel)
        {            
        }
        /// <summary>
        /// 必須實(shí)現(xiàn)抽象的類------作用:用于放回一條信息,當(dāng)沒(méi)有對(duì)應(yīng)類型的微信消息沒(méi)有被代碼處理,那么默認(rèn)會(huì)執(zhí)行返回這里的結(jié)果。
        /// </summary>
        /// <param name="requestMessage">請(qǐng)求消息</param>
        /// <returns></returns>
    public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
    {
        //CreateResponseMessage<T>  這里是創(chuàng)建一個(gè)放回的對(duì)象,代表不同的類型,
        var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更換為別的類型
        responseMessage.Content = "這條消息來(lái)自DefaultResponseMessage。";
        return responseMessage;
    }
         /// <summary>
        ///1: 處理用戶發(fā)送過(guò)來(lái)的文字消息。重寫OnTextRequest方法。
       /// --------(總結(jié):)方法里面可以自由發(fā)揮,讀取DB,判斷關(guān)鍵字,甚至返回不同的ResponseMessageXX類型(只要最終的類型都是在IResponseMessageBase接口下的即可)。
        /// </summary>
        /// <param name="requestMessage">請(qǐng)求消息</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但是它后面還有個(gè)CustomMessageContext,此時(shí)對(duì)于MessageHandler有了重新的認(rèn)識(shí),這貨原來(lái)是個(gè)泛型的抽象類,我們需要往里面填寫個(gè)類型,查看官方說(shuō)明說(shuō)這個(gè)CustomMessageContext是個(gè)自定義的上下文類,到底是什么了,我也沒(méi)仔細(xì)研究,看官方的介紹吧(WiKi)。接著下面是個(gè)CTOR,主要是實(shí)例化的時(shí)候使用<POST請(qǐng)求的時(shí)候使用過(guò)>,注意里面的參數(shù),一個(gè)是請(qǐng)求流inputSrream,一個(gè)是微信服務(wù)器發(fā)送的數(shù)據(jù)類PostModel。在接著就是我們實(shí)現(xiàn)的方法了,第一個(gè)是DefaultResponseMessage方法,這個(gè)是必須實(shí)現(xiàn)的。因?yàn)樗翘幚砦⑿耪?qǐng)求來(lái)沒(méi)有響應(yīng)的數(shù)據(jù),默認(rèn)給微信服務(wù)器發(fā)送消息的。最后到了文本處理了,這里override了OnTextRequest方法,從而可以對(duì)應(yīng)響應(yīng)用戶的文本信息請(qǐng)求。我們要是需要實(shí)現(xiàn)別的處理,比如圖片,語(yǔ)音,地理位置等,分別重寫別的方法,返回對(duì)應(yīng)的消息類型就可以實(shí)現(xiàn)。

三:自定義上下文CustomMessageContext

下面是自定義上下文類CustomMessageContext,主要是繼承自MessageContext<IRequestMessageBase,IResponseMessageBase>來(lái)實(shí)現(xiàn)對(duì)于的功能。

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

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

四:微信測(cè)試號(hào)效果展示

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

微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)

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

微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)

感謝各位的閱讀!關(guān)于“微信開發(fā)中如何實(shí)現(xiàn)POST請(qǐng)求響應(yīng)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI