分享
 
 
 

.NET微信公众号开发-4.0公众号消息处理

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们要认真阅读,官方给我们的文档:http://mp.weixin.QQ.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html。首先我们从最基本的文本消息处理开始。

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>12345678</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[你好]]></Content>

</xml>

我们可以看到这是消息处理的一个最基本的模式,有发送者,接受者,创建时间,类型,内容等等。

首先我们来创建一个消息处理的类,这个类用来捕获,所有的消息请求,根据不同的消息请求类型来处理不同的消息回复。

publicclassWeiXinService

{///<summary>///TOKEN///</summary>PRivateconststringTOKEN ="finder";///<summary>///签名///</summary>privateconststringSIGNATURE ="signature";///<summary>///时间戳///</summary>privateconststringTIMESTAMP ="timestamp";///<summary>///随机数///</summary>privateconststringNONCE ="nonce";///<summary>///随机字符串///</summary>privateconststringECHOSTR ="echostr";///<summary>//////</summary>privateHttpRequest Request {get;set; }///<summary>///构造函数///</summary>///<param name="request"></param>publicWeiXinService(HttpRequest request)

{this.Request =request;

}///<summary>///处理请求,产生响应///</summary>///<returns></returns>publicstringResponse()

{stringmethod =Request.HttpMethod.ToUpper();//验证签名if(method =="GET")

{if(CheckSignature())

{returnRequest.QueryString[ECHOSTR];

}else{return"error";

}

}//处理消息if(method =="POST")

{returnResponseMsg();

}else{return"无法处理";

}

}///<summary>///处理请求///</summary>///<returns></returns>privatestringResponseMsg()

{stringrequestXml = CommonWeiXin.ReadRequest(this.Request);

IHandler handler=HandlerFactory.CreateHandler(requestXml);if(handler !=null)

{returnhandler.HandleRequest();

}returnstring.Empty;

}///<summary>///检查签名///</summary>///<param name="request"></param>///<returns></returns>privateboolCheckSignature()

{stringsignature =Request.QueryString[SIGNATURE];stringtimestamp =Request.QueryString[TIMESTAMP];stringnonce =Request.QueryString[NONCE];

List<string> list =newList<string>();

list.Add(TOKEN);

list.Add(timestamp);

list.Add(nonce);//排序list.Sort();//拼串stringinput =string.Empty;foreach(variteminlist)

{

input+=item;

}//加密stringnew_signature =SecurityUtility.SHA1Encrypt(input);//验证if(new_signature ==signature)

{returntrue;

}else{returnfalse;

}

}

}

在来看看我们的首先是如何捕获消息的。首页Default.ashx的代码如下

publicvoidProcessRequest(HttpContext context)

{

context.Response.ContentType="text/html";stringpostString =string.Empty;if(HttpContext.Current.Request.HttpMethod.ToUpper() =="POST")

{//由微信服务接收请求,具体处理请求WeiXinService wxService =newWeiXinService(context.Request);stringresponseMsg =wxService.Response();

context.Response.Clear();

context.Response.Charset="UTF-8";

context.Response.Write(responseMsg);

context.Response.End();

}else{stringtoken ="wei2414201";if(string.IsNullOrEmpty(token))

{return;

}stringechoString = HttpContext.Current.Request.QueryString["echoStr"];stringsignature = HttpContext.Current.Request.QueryString["signature"];stringtimestamp = HttpContext.Current.Request.QueryString["timestamp"];stringnonce = HttpContext.Current.Request.QueryString["nonce"];if(!string.IsNullOrEmpty(echoString))

{

HttpContext.Current.Response.Write(echoString);

HttpContext.Current.Response.End();

}

}

}

从上面的代码中我们可以看到WeiXinService.cs类中的消息相应至关重要。

///<summary>///处理请求///</summary>///<returns></returns>privatestringResponseMsg()

{stringrequestXml = CommonWeiXin.ReadRequest(this.Request);

IHandler handler=HandlerFactory.CreateHandler(requestXml);if(handler !=null)

{returnhandler.HandleRequest();

}returnstring.Empty;

}

IHandler是一个消息处理接口,其下面有EventHandler,TextHandler处理类实现这个接口。代码如下

///<summary>///处理接口///</summary>publicinterfaceIHandler

{///<summary>///处理请求///</summary>///<returns></returns>stringHandleRequest();

}

EventHandler

classEventHandler : IHandler

{///<summary>///请求的xml///</summary>privatestringRequestXml {get;set; }///<summary>///构造函数///</summary>///<param name="requestXml"></param>publicEventHandler(stringrequestXml)

{this.RequestXml =requestXml;

}///<summary>///处理请求///</summary>///<returns></returns>publicstringHandleRequest()

{stringresponse =string.Empty;

EventMessage em=EventMessage.LoadFromXml(RequestXml);if(em.Event.Equals("subscribe", StringComparison.OrdinalIgnoreCase))//用来判断是不是首次关注{PicTextMessage tm=newPicTextMessage();//我自己创建的一个图文消息处理类tm.ToUserName=em.FromUserName;

tm.FromUserName=em.ToUserName;

tm.CreateTime=CommonWeiXin.GetNowTime();

response=tm.GenerateContent();

}returnresponse;

}

}

TextHandler

///<summary>///文本信息处理类///</summary>publicclassTextHandler : IHandler

{stringopenid {get;set; }stringaccess_token {get;set; }///<summary>///请求的XML///</summary>privatestringRequestXml {get;set; }///<summary>///构造函数///</summary>///<param name="requestXml">请求的xml</param>publicTextHandler(stringrequestXml)

{this.RequestXml =requestXml;

}///<summary>///处理请求///</summary>///<returns></returns>publicstringHandleRequest()

{stringresponse =string.Empty;

TextMessage tm=TextMessage.LoadFromXml(RequestXml);stringcontent =tm.Content.Trim();if(string.IsNullOrEmpty(content))

{

response="您什么都没输入,没法帮您啊。";

}else{stringusername = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();

AccessToken token=AccessToken.Get(username);

access_token=token.access_token;

openid=tm.FromUserName;

response=HandleOther(content);

}

tm.Content=response;//进行发送者、接收者转换stringtemp =tm.ToUserName;

tm.ToUserName=tm.FromUserName;

tm.FromUserName=temp;

response=tm.GenerateContent();returnresponse;

}///<summary>///处理其他消息///</summary>///<param name="tm"></param>///<returns></returns>privatestringHandleOther(stringrequestContent)

{stringresponse =string.Empty;if(requestContent.Contains("你好") || requestContent.Contains("您好"))

{

response="您也好~";}elseif(requestContent.Contains("openid") || requestContent.Contains("id") || requestContent.Contains("ID"))//用来匹配用户输入的关键字{

response="你的Openid:"+openid;

}elseif(requestContent.Contains("token") || requestContent.Contains("access_token"))

{

response="你的access_token:"+access_token;

}else{

response="试试其他关键字吧。";

}returnresponse;

}

}

HandlerFactory

///<summary>///处理器工厂类///</summary>publicclassHandlerFactory

{///<summary>///创建处理器///</summary>///<param name="requestXml">请求的xml</param>///<returns>IHandler对象</returns>publicstaticIHandler CreateHandler(stringrequestXml)

{

IHandler handler=null;if(!string.IsNullOrEmpty(requestXml))

{//解析数据XmlDocument doc =newSystem.Xml.XmlDocument();

doc.LoadXml(requestXml);

XmlNode node= doc.SelectSingleNode("/xml/MsgType");if(node !=null)

{

XmlCDataSection section= node.FirstChildasXmlCDataSection;if(section !=null)

{stringmsgType =section.Value;switch(msgType)

{case"text":

handler=newTextHandler(requestXml);

break;case"event":

handler=newEventHandler(requestXml);

break;

}

}

}

}returnhandler;

}

}

在这里基本的一些类已经完成了,现在我们来完成,关注我们的微信公众号,我们就发送一条图文消息,同时输入我们的一些关键字,返回一些消息,比如输入id返回用户的openid等等。

二.PicTextMessagepublicclassPicTextMessage : Message

{///<summary>///模板静态字段///</summary>privatestaticstringm_Template;///<summary>///默认构造函数///</summary>publicPicTextMessage()

{this.MsgType ="news";

}///<summary>///从xml数据加载文本消息///</summary>///<param name="xml"></param>publicstaticPicTextMessage LoadFromXml(stringxml)

{

PicTextMessage tm=null;if(!string.IsNullOrEmpty(xml))

{

XElement element=XElement.Parse(xml);if(element !=null)

{

tm=newPicTextMessage();

tm.FromUserName=element.Element(CommonWeiXin.FROM_USERNAME).Value;

tm.ToUserName=element.Element(CommonWeiXin.TO_USERNAME).Value;

tm.CreateTime=element.Element(CommonWeiXin.CREATE_TIME).Value;

}

}returntm;

}///<summary>///模板///</summary>publicoverridestringTemplate

{get{if(string.IsNullOrEmpty(m_Template))

{

LoadTemplate();

}returnm_Template;

}

}///<summary>///生成内容///</summary>///<returns></returns>publicoverridestringGenerateContent()

{this.CreateTime =CommonWeiXin.GetNowTime();stringstr=string.Format(this.Template,this.ToUserName,this.FromUserName,this.CreateTime);returnstr;

}///<summary>///加载模板///</summary>privatestaticvoidLoadTemplate()

{

m_Template=@"<xml>

<ToUserName><![CDATA[{0}]]></ToUserName>

<FromUserName><![CDATA[{1}]]></FromUserName>

<CreateTime>{2}</CreateTime>

<MsgType><![CDATA[news]]></MsgType>

<ArticleCount>1</ArticleCount>

<Articles>

<item>

<Title><![CDATA[有位停车欢迎你!]]></Title>

<Description><![CDATA[如有问题请致电400-6238-136或直接在微信留言,我们将第一时间为您服务!]]></Description>

<PicUrl><![CDATA[http://www.baidu.com/youwei.jpg]]></PicUrl>

<Url><![CDATA[http://www.baidu.com]]></Url>

</item>

</Articles>

</xml>";

}}

最后我们的效果如下所示;

本人能力有限,希望大家多多包涵.

三.微信公众号开发系列导航1.0初始微信公众号

2.0创建自定义菜单

3.0查询自定义菜单

4.0公众号消息处理

5.0微信支付

6.0模板消息

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有