您的位置:首页 > 移动开发 > 微信开发

用c#开发微信(3)基于Senparc.Weixin框架的接收普通消息处理 (源码下载)

2015-05-22 08:52 627 查看
本文讲述使用Senparc.Weixin框架来快速处理各种接收的普通消息。这里的消息指的是传统的微信公众平台消息交互,微信用户向公众号发送消息后,公众号回复消息给微信用户。包括以下7种类型:

1文本消息
2图片消息
3语音消息
4视频消息
5小视频消息
6地理位置消息
7链接消息

实现非常简单,自定义一个继承MessageHandler的类,重写这7种类型的方法即可。注意:DefaultResponseMessage必须重写,用于返回没有处理过的消息类型(也可以用于默认消息,如帮助信息等);其中所有原OnXX的抽象方法已经都改为虚方法,可以不必每个都重写。若不重写,默认返回DefaultResponseMessage方法中的结果。

下面详细介绍实现步骤:

1.添加index页面

privatereadonlystringToken=ConfigurationManager.AppSettings["token"];//与微信公众账号后台的Token设置保持一致,区分大小写。


protectedvoidPage_Load(objectsender,EventArgse)


{


stringsignature=Request["signature"];


stringtimestamp=Request["timestamp"];


stringnonce=Request["nonce"];


stringechostr=Request["echostr"];


if(Request.HttpMethod=="GET")


{


//getmethod-仅在微信后台填写URL验证时触发


if(CheckSignature.Check(signature,timestamp,nonce,Token))


{


WriteContent(echostr);//返回随机字符串则表示验证通过


}


else


{


WriteContent("failed:"+signature+","+CheckSignature.GetSignature(timestamp,nonce,Token)+"。"+


"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");


}


Response.End();


}


else


{


//postmethod-当有用户想公众账号发送消息时触发


if(!CheckSignature.Check(signature,timestamp,nonce,Token))


{


WriteContent("参数错误!");


return;


}


//设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制


varmaxRecordCount=10;


//自定义MessageHandler,对微信请求的详细判断操作都在这里面。


varmessageHandler=newCustomMessageHandler(Request.InputStream,maxRecordCount);




try


{


//测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。


messageHandler.RequestDocument.Save(


Server.MapPath("~/App_Data/"+DateTime.Now.Ticks+"_Request_"+


messageHandler.RequestMessage.FromUserName+".txt"));


//执行微信处理过程


messageHandler.Execute();


//测试时可开启,帮助跟踪数据


messageHandler.ResponseDocument.Save(


Server.MapPath("~/App_Data/"+DateTime.Now.Ticks+"_Response_"+


messageHandler.ResponseMessage.ToUserName+".txt"));


WriteContent(messageHandler.ResponseDocument.ToString());


return;


}


catch(Exceptionex)


{


//将程序运行中发生的错误记录到App_Data文件夹


using(TextWritertw=newStreamWriter(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();


}


}


}


privatevoidWriteContent(stringstr)


{


Response.Output.Write(str);


}


1)当Get请求时,调用CheckSignature.Check(signature,timestamp,nonce,Token)方法验证url接入,详情参考用c#开发微信(1)服务号的服务器配置和企业号的回调模式-url接入(源码下载)

2)当有Post请求过来时,调用自定义MessageHandler类,对微信请求的详细判断操作都在这里面。


varmessageHandler=newCustomMessageHandler(Request.InputStream,maxRecordCount);



messageHandler.Execute();



2.自定义消息处理类

定义CustomMessageHandler继承MessageHandler<MessageContext<IRequestMessageBase,IResponseMessageBase>>

publicpartialclassCustomMessageHandler:MessageHandler<MessageContext<IRequestMessageBase,IResponseMessageBase>>


{


publicCustomMessageHandler(StreaminputStream,intmaxRecordCount=0)


:base(inputStream,null,maxRecordCount)


{


WeixinContext.ExpireMinutes=3;


}


publicoverridevoidOnExecuting()


{


//测试MessageContext.StorageData


if(CurrentMessageContext.StorageData==null)


{


CurrentMessageContext.StorageData=0;


}


base.OnExecuting();


}


publicoverridevoidOnExecuted()


{


base.OnExecuted();


CurrentMessageContext.StorageData=((int)CurrentMessageContext.StorageData)+1;


}


}


3.分别重写7种接收普通消息

我们可以通过重写MessageHandler里的这7种类型方法来处理我们的业务,当然也可以只重写需要的部分类型,不需要的类型可以不重写,只需要定义一个统一的DefaultResponseMessage

publicoverrideIResponseMessageBaseDefaultResponseMessage(IRequestMessageBaserequestMessage)


{


//所有没有被处理的消息会默认返回这里的结果


varresponseMessage=this.CreateResponseMessage<ResponseMessageText>();


responseMessage.Content="这条消息来自DefaultResponseMessage。";


returnresponseMessage;


}


下面分别就这7种类型,各写一个例子:

1)文本消息

///<summary>


///处理文字请求


///</summary>


///<returns></returns>


publicoverrideIResponseMessageBaseOnTextRequest(RequestMessageTextrequestMessage)


{


//注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。


varresponseMessage=CreateResponseMessage<ResponseMessageText>();




varresult=newStringBuilder();


result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n",requestMessage.Content);




if(CurrentMessageContext.RequestMessages.Count>1)


{


result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n",CurrentMessageContext.RequestMessages.Count,CurrentMessageContext.StorageData);


for(inti=CurrentMessageContext.RequestMessages.Count-2;i>=0;i--)


{


varhistoryMessage=CurrentMessageContext.RequestMessages[i];


result.AppendFormat("{0}【{1}】{2}\r\n",


historyMessage.CreateTime.ToShortTimeString(),


historyMessage.MsgType.ToString(),


(historyMessageisRequestMessageText)


?(historyMessageasRequestMessageText).Content


:"[非文字类型]"


);


}


result.AppendLine("\r\n");


}


result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n",WeixinContext.ExpireMinutes,WeixinContext.MaxRecordCount);


result.AppendLine("\r\n");


result.AppendLine("您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。");


responseMessage.Content=result.ToString();


returnresponseMessage;


}


2)图片消息

///<summary>


///处理图片请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnImageRequest(RequestMessageImagerequestMessage)


{


varresponseMessage=CreateResponseMessage<ResponseMessageNews>();


responseMessage.Articles.Add(newArticle()


{


Title="您刚才发送了图片信息",


Description="您发送的图片将会显示在边上",


PicUrl=requestMessage.PicUrl,


Url="http://www.hp.com"


});


responseMessage.Articles.Add(newArticle()


{


Title="第二条",


Description="第二条带连接的内容",


PicUrl=requestMessage.PicUrl,


Url="http://www.hp.com"


});


returnresponseMessage;


}


3)语音消息

///<summary>


///处理语音请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnVoiceRequest(RequestMessageVoicerequestMessage)


{


varresponseMessage=CreateResponseMessage<ResponseMessageMusic>();


responseMessage.Music.MusicUrl="http://www.qxuninfo.com/music.mp3";


responseMessage.Music.Title="这里是一条音乐消息";


responseMessage.Music.Description="时间都去哪儿了";


returnresponseMessage;


}


4)视频消息

///<summary>


///处理视频请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnVideoRequest(RequestMessageVideorequestMessage)


{


varresponseMessage=CreateResponseMessage<ResponseMessageText>();


responseMessage.Content="您发送了一条视频信息,ID:"+requestMessage.MediaId;


returnresponseMessage;


}


5)小视频消息

///<summary>


///处理小视频请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnShortVideoRequest(RequestMessageShortVideorequestMessage)


{


varresponseMessage=this.CreateResponseMessage<ResponseMessageText>();


responseMessage.Content="您刚才发送的是小视频";


returnresponseMessage;


}


6)地理位置消息

///<summary>


///处理位置请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnLocationRequest(RequestMessageLocationrequestMessage)


{


varresponseMessage=CreateResponseMessage<ResponseMessageText>();


responseMessage.Content=string.Format("您刚才发送了地理位置信息。Location_X:{0},Location_Y:{1},Scale:{2},标签:{3}",


requestMessage.Location_X,requestMessage.Location_Y,


requestMessage.Scale,requestMessage.Label);


returnresponseMessage;


}


7)链接消息

///<summary>


///处理链接消息请求


///</summary>


///<paramname="requestMessage"></param>


///<returns></returns>


publicoverrideIResponseMessageBaseOnLinkRequest(RequestMessageLinkrequestMessage)


{


varresponseMessage=CreateResponseMessage<ResponseMessageText>();


responseMessage.Content=string.Format(@"您发送了一条连接信息:


Title:{0}


Description:{1}


Url:{2}",requestMessage.Title,requestMessage.Description,requestMessage.Url);


returnresponseMessage;


}


从上面的例子中可以看出,回复的消息类型可以多种多样,不一定要跟请求的消息类型一样。

框架里的请求类型:





框架里的回复类型:





4.最后发布到自己的服务器上,可以尝试给公众号发各种类型的消息,验证公众号回复的内容

5.源码

最后整个程序结构如下:





源码下载:http://yunpan.cn/cwsftnRtzK599访问密码4247

同样的,使用源码前,要先把配置文件里的参数修改成自己的公众号。

部份类型效果截图:





官方文档:接收普通消息

用c#开发微信系列汇总
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航