本文講述使用Senparc.Weixin框架來快速處理各種接收的普通消息。這里的消息指的是傳統(tǒng)的微信公眾平臺(tái)消息交互,微信用戶向公眾號(hào)發(fā)送消息后,公眾號(hào)回復(fù)消息給微信用戶。包括以下7種類型:
1 文本消息 2 圖片消息 3 語音消息 4 視頻消息 5 小視頻消息 6 地理位置消息 7 鏈接消息
實(shí)現(xiàn)非常簡單,自定義一個(gè)繼承MessageHandler的類,重寫這7種類型的方法即可。注意:DefaultResponseMessage必須重寫,用于返回沒有處理過的消息類型(也可以用于默認(rèn)消息,如幫助信息等);其中所有原OnXX的抽象方法已經(jīng)都改為虛方法,可以不必每個(gè)都重寫。若不重寫,默認(rèn)返回DefaultResponseMessage方法中的結(jié)果。
下面詳細(xì)介紹實(shí)現(xiàn)步驟:
PRivate readonly string Token = ConfigurationManager.AppSettings["token"];//與微信公眾賬號(hào)后臺(tái)的Token設(shè)置保持一致,區(qū)分大小寫。
protected void Page_Load(object sender, EventArgs e)
{string signature = Request["signature"];
string timestamp = Request["timestamp"];
string nonce = Request["nonce"];
string echostr = Request["echostr"];
if (Request.HttpMethod == "GET")
{//get method - 僅在微信后臺(tái)填寫URL驗(yàn)證時(shí)觸發(fā)
if (CheckSignature.Check(signature, timestamp, nonce, Token))
{WriteContent(echostr); //返回隨機(jī)字符串則表示驗(yàn)證通過
}
else
{ WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +"如果你在瀏覽器中看到這句話,說明此地址可以被作為微信公眾賬號(hào)后臺(tái)的Url,請(qǐng)注意保持Token一致。");
}
Response.End();
}
else
{//post method - 當(dāng)有用戶想公眾賬號(hào)發(fā)送消息時(shí)觸發(fā)
if (!CheckSignature.Check(signature, timestamp, nonce, Token))
{ WriteContent("參數(shù)錯(cuò)誤!");return;
}
//設(shè)置每個(gè)人上下文消息儲(chǔ)存的最大數(shù)量,防止內(nèi)存占用過多,如果該參數(shù)小于等于0,則不限制
var maxRecordCount = 10;
//自定義MessageHandler,對(duì)微信請(qǐng)求的詳細(xì)判斷操作都在這里面。
var messageHandler = new CustomMessageHandler(Request.InputStream, maxRecordCount);
try
{//測(cè)試時(shí)可開啟此記錄,幫助跟蹤數(shù)據(jù),使用前請(qǐng)確保App_Data文件夾存在,且有讀寫權(quán)限。
messageHandler.RequestDocument.Save(
Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" +messageHandler.RequestMessage.FromUserName + ".txt"));
//執(zhí)行微信處理過程
messageHandler.Execute();
//測(cè)試時(shí)可開啟,幫助跟蹤數(shù)據(jù)
messageHandler.ResponseDocument.Save(
Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" +messageHandler.ResponseMessage.ToUserName + ".txt"));
WriteContent(messageHandler.ResponseDocument.ToString());
return;
}
catch (Exception ex)
{//將程序運(yùn)行中發(fā)生的錯(cuò)誤記錄到App_Data文件夾
using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt"))) {tw.WriteLine(ex.Message);
tw.WriteLine(ex.InnerException.Message);
if (messageHandler.ResponseDocument != null)
{tw.WriteLine(messageHandler.ResponseDocument.ToString());
}
tw.Flush();
tw.Close();
}
WriteContent("");}
finally
{Response.End();
}
}
}
private void WriteContent(string str)
{Response.Output.Write(str);
}
1)當(dāng)Get請(qǐng)求時(shí),調(diào)用 CheckSignature.Check(signature, timestamp, nonce, Token) 方法驗(yàn)證url接入, 詳情參考 用c#開發(fā)微信(1)服務(wù)號(hào)的服務(wù)器配置和企業(yè)號(hào)的回調(diào)模式 - url接入 (源碼下載)
2) 當(dāng)有Post請(qǐng)求過來時(shí),調(diào)用自定義MessageHandler類,對(duì)微信請(qǐng)求的詳細(xì)判斷操作都在這里面。
var messageHandler = new CustomMessageHandler(Request.InputStream, maxRecordCount);
messageHandler.Execute();
定義CustomMessageHandler繼承MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
{public CustomMessageHandler(Stream inputStream, int maxRecordCount = 0)
: base(inputStream, null, maxRecordCount)
{WeixinContext.ExpireMinutes = 3;
}
public override void OnExecuting()
{//測(cè)試MessageContext.StorageData
if (CurrentMessageContext.StorageData == null)
{CurrentMessageContext.StorageData = 0;
}
base.OnExecuting();
}
public override void OnExecuted()
{base.OnExecuted();
CurrentMessageContext.StorageData = ((int)CurrentMessageContext.StorageData) + 1;
}
}
我們可以通過重寫MessageHandler里的這7種類型方法來處理我們的業(yè)務(wù),當(dāng)然也可以只重寫需要的部分類型,不需要的類型可以不重寫,只需要定義一個(gè)統(tǒng)一的DefaultResponseMessage
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{//所有沒有被處理的消息會(huì)默認(rèn)返回這里的結(jié)果
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = "這條消息來自DefaultResponseMessage。";
return responseMessage;
}
下面分別就這7種類型,各寫一個(gè)例子:
/// <summary>
/// 處理文字請(qǐng)求
/// </summary>
/// <returns></returns>
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{//注意:下面泛型ResponseMessageText即返回給客戶端的類型,可以根據(jù)自己的需要填寫ResponseMessageNews等不同類型。
var responseMessage = CreateResponseMessage<ResponseMessageText>();
var result = new
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注