專案GitHub地址:https://github.com/Andyahui/xgyxsh_WeiXin
一:微信XML的POST請求處理
一:微信XML的POST請求處理時可以到底,且是得到了對應(yīng)的處理,以下是我們透過瀏覽器我們配置的URL瀏覽到的。
我們可以發(fā)現(xiàn)在get請求中設(shè)定的回傳值在這裡出現(xiàn)了,說明我們的測試是成功的。下面我們要設(shè)定POST請求對應(yīng)的Action。
? 注意:由於我們微信和網(wǎng)站伺服器的每一次互動都是透過POST請求來得到自己想要的東西,我們就必須為傳輸進(jìn)行加密。
/// <summary> /// 用戶發(fā)送消息后,微信平臺自動Post一個請求到這里,并等待響應(yīng)XML。 /// PS:此方法為簡化方法,效果與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ù)自己后臺的設(shè)置保持一致 // postModel.AppId = AppId; //根據(jù)自己后臺的設(shè)置保持一致 //驗證數(shù)字簽名 if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { //??? 這里有問題,要是不注釋的話,就會在這里出錯,也就是數(shù)字簽名有問題。 //return Content("參數(shù)錯誤!"); } // 1:自定義MessageHandler,對微信請求的詳細(xì)判斷操作都在這里面。 實例化了一個類 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進(jìn)行了初始化,接著調(diào)用它的初始化,接著調(diào)用它的Execute()方法,最後透過實例化WeixinResult來傳回對應(yīng)的CustomMessageHandle對象,此時物件中就包含了我們網(wǎng)站後臺的邏輯處理方法。
?? 這就是我們POST請求對於的處理,每一次微信伺服器轉(zhuǎn)發(fā)的信息?? 這就是我們POST請求對於的處理,每一次微信服務(wù)器轉(zhuǎn)發(fā)的信息
?xml ,我們進(jìn)行處理。二:了解MessageHandler
????
要完成微信開發(fā),SDK中關(guān)鍵類就需要了解,下面就簡單說下MessageHandler; ,進(jìn)行對應(yīng)的處理。也可以進(jìn)行邏輯判斷,說白了就是我們所有的業(yè)務(wù)邏輯都是在這個類別下面進(jì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)類型的微信消息沒有被代碼處理,那么默認(rèn)會執(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;
}
}
}
WiKi)。 接著下面是個CTOR,主要是實例化的時候使用
三:自訂上下文CustomMessageContext
下面是自定義上下文類CustomMessageContext,主要是繼承自MessageContext
/// <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)了。
這是微信的二維碼可以關(guān)注下,可以實現(xiàn)簡單的互動。
更多微信開發(fā)系列----02:實現(xiàn)POST請求響應(yīng)?相關(guān)文章請關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)