asp.net微信开发(消息应答)

asp.net微信开发(消息应答),第1张

概述当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
请注意:

1、关于重试的消息排重,推荐使用msgid排重。 2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。 3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。

各消息类型的推送XML数据包结构如下:
文本消息

 <xml> <ToUsername><![cdaTA[toUser]]></ToUsername> <FromUsername><![cdaTA[fromUser]]></FromUsername>  <CreateTime>1348831860</CreateTime> <MsgType><![cdaTA[text]]></MsgType> <Content><![cdaTA[this is a test]]></Content> <Msgid>1234567890123456</Msgid> </xml>

  图片消息 

<xml> <ToUsername><![cdaTA[toUser]]></ToUsername> <FromUsername><![cdaTA[fromUser]]></FromUsername> <CreateTime>1348831860</CreateTime> <MsgType><![cdaTA[image]]></MsgType> <PicUrl><![cdaTA[this is a url]]></PicUrl> <MediaID><![cdaTA[media_ID]]></MediaID> <Msgid>1234567890123456</Msgid> </xml>

 

语音消息

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1357290913</CreateTime><MsgType><![cdaTA[voice]]></MsgType><MediaID><![cdaTA[media_ID]]></MediaID><Format><![cdaTA[Format]]></Format><Msgid>1234567890123456</Msgid></xml>

 请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段 (注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1357290913</CreateTime><MsgType><![cdaTA[voice]]></MsgType><MediaID><![cdaTA[media_ID]]></MediaID><Format><![cdaTA[Format]]></Format><Recognition><![cdaTA[腾讯微信团队]]></Recognition><Msgid>1234567890123456</Msgid></xml>

多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。
视频消息

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1357290913</CreateTime><MsgType><![cdaTA[vIDeo]]></MsgType><MediaID><![cdaTA[media_ID]]></MediaID><ThumbMediaID><![cdaTA[thumb_media_ID]]></ThumbMediaID><Msgid>1234567890123456</Msgid></xml>

 

小视频消息

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1357290913</CreateTime><MsgType><![cdaTA[shortvIDeo]]></MsgType><MediaID><![cdaTA[media_ID]]></MediaID><ThumbMediaID><![cdaTA[thumb_media_ID]]></ThumbMediaID><Msgid>1234567890123456</Msgid></xml>

 地理位置消息

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1351776360</CreateTime><MsgType><![cdaTA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![cdaTA[位置信息]]></Label><Msgid>1234567890123456</Msgid></xml> 

 

链接消息

<xml><ToUsername><![cdaTA[toUser]]></ToUsername><FromUsername><![cdaTA[fromUser]]></FromUsername><CreateTime>1351776360</CreateTime><MsgType><![cdaTA[link]]></MsgType><Title><![cdaTA[公众平台官网链接]]></Title><Description><![cdaTA[公众平台官网链接]]></Description><Url><![cdaTA[url]]></Url><Msgid>1234567890123456</Msgid></xml> 

 

接上篇,看ResponseXML(poststring);方法如下

 /// <summary> /// 获取用户发送的消息 /// </summary> /// <param name="poststring"></param> private voID ResponseXML(string poststring) { //使用XMLdocument加载信息结构   Xmldocument xmlDoc = new Xmldocument(); xmlDoc.LoadXml(poststring); XmlElement rootElement = xmlDoc.documentElement;//获取文档的根 XmlNode MsgType = rootElement.SelectSingleNode("MsgType"); //获取消息的文本类型 RequestXML requestXML = new RequestXML();//声明实例,获取各个属性并赋值 requestXML.ToUsername = rootElement.SelectSingleNode("ToUsername").InnerText;//公众号 requestXML.FromUsername = rootElement.SelectSingleNode("FromUsername").InnerText;//用户 requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;//创建时间 requestXML.MsgType = MsgType.InnerText;//消息类型     ///对消息的不同类型进行赋值 if (requestXML.MsgType == "text") { //赋值文本信息内容 requestXML.Content = rootElement.SelectSingleNode("Content").InnerText; } if (requestXML.MsgType.Trim() == "location") { ///赋值地理位置纬度,经度,地图缩放比例,地理位置说明 requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText; requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText; requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText; requestXML.Label = rootElement.SelectSingleNode("Label").InnerText; } if (requestXML.MsgType.Trim().Tolower() == "event") { ///赋值事件名称和事件key值 requestXML.Eventname = rootElement.SelectSingleNode("Event").InnerText; requestXML.EventKey = rootElement.SelectSingleNode("EventKey").InnerText; }      if (requestXML.MsgType.Trim().Tolower() == "voice") { ///赋值语音识别结果,赋值之前一定要记得在开发者模式下,把语音识别功能开启,否则获取不到 requestXML.Recognition = rootElement.SelectSingleNode("Recognition").InnerText; } ResponseMsg(requestXML);}

语音识别功能开启如下:

 

requestXML是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:

 /// <summary> /// 接收消息的实体类 /// </summary> public class RequestXML { private String toUsername = String.Empty; /// <summary> /// 本公众号 /// </summary> public String ToUsername{get;set;} /// <summary> /// 用户微信号 /// </summary> public String FromUsername{get;set;} /// <summary> /// 创建时间 /// </summary> public String CreateTime{get;set;} /// <summary> /// 信息类型  /// </summary> public String MsgType{get;set;} /// <summary> /// 信息内容 /// </summary> public String Content{get;set;}  /*以下为事件类型的消息特有的属性*/ /// <summary> /// 事件名称 /// </summary> public String Eventname{get;set;} /// <summary> /// 事件值 /// </summary> public string EventKey { get; set; }  /*以下为图文类型的消息特有的属性*/ /// <summary> /// 图文消息的个数 /// </summary> public int ArticleCount { get; set; } /// <summary> /// 图文消息的标题 /// </summary> public string Title { get; set; } /// <summary> /// 图文消息的简介 /// </summary> public string Description { get; set; } /// <summary> /// 图文消息图片的链接地址 /// </summary> public string PicUrl { get; set; } /// <summary> /// 图文消息详情链接地址 /// </summary> public string Url { get; set; } /// <summary> /// 图文消息集合 /// </summary> public List<RequestXML> Articles { get; set;}  /*以下为地理位置类型的消息特有的属性*/ /// <summary> /// 地理位置纬度 /// </summary> public String Location_X { get; set; } /// <summary> /// 地理位置经度 /// </summary> public String Location_Y { get; set; } /// <summary> /// 地图缩放比例 /// </summary> public String Scale { get; set; } /// <summary> /// 地图位置说明 /// </summary> public String Label { get; set; }   /// <summary> /// 语音消息特有字段 /// </summary> public String Recognition { get; set; }  }

继续关注  ResponseMsg(requestXML);方法如下

 private voID ResponseMsg(RequestXML requestXML) { string MsgType = requestXML.MsgType; try { //根据消息类型判断发送何种类型消息 switch (MsgType) {  case "text":  SendTextCase(requestXML);//发送文本消息  break;  case "event"://发送事件消息  if (!string.IsNullOrWhiteSpace(requestXML.Eventname) && requestXML.Eventname.ToString().Trim().Equals("subscribe"))  {  SenDWelComeMsg(requestXML);//关注时返回的图文消息  }  else if (!string.IsNullOrWhiteSpace(requestXML.Eventname) && requestXML.Eventname.ToString().Trim().Equals("CliCK"))  {  SendEventMsg(requestXML);//发送事件消息  }  break;         case "voice":  SendVoiceMsg(requestXML);//发送语音消息  break;  case "location"://发送位置消息  SendMapMsg(requestXML);  break;  default:  break; } } catch (Exception ex) { httpContext.Current.Response.Write(ex.ToString()); } }

先来关注发送文本消息,SendTextCase(requestXML);//发送文本消息

 /// <summary> /// 发送文本 /// </summary> /// <param name="requestXML"></param> private voID SendTextCase(RequestXML requestXML) {  string responseContent = FormattextxML(requestXML.FromUsername,requestXML.ToUsername,requestXML.Content);  httpContext.Current.Response.ContentType = "text/xml";  httpContext.Current.Response.ContentEnCoding = EnCoding.UTF8;  httpContext.Current.Response.Write(responseContent);  httpContext.Current.Response.End(); }

 FormattextxML方法制定格式

 

 /// <summary> /// 返回格式化的Xml格式内容 /// </summary> /// <param name="p1">公众号</param> /// <param name="p2">用户号</param> /// <param name="p3">回复内容</param> /// <returns></returns> private string FormattextxML(string p1,string p2,string p3) { return "<xml><ToUsername><![cdaTA[" + p1 + "]]></ToUsername><FromUsername><![cdaTA[" + p2 + "]]></FromUsername><CreateTime>" + DateTime.Now.Subtract(new DateTime(1970,1,8,0)).TotalSeconds.ToString() + "</CreateTime><MsgType><![cdaTA[text]]></MsgType><Content><![cdaTA[" + p3 + "]]></Content><FuncFlag>1</FuncFlag></xml>"; } 

这样就能实现消息的应答,如果用户点击的按钮,如下代码:

 case "event"://发送事件消息  if (!string.IsNullOrWhiteSpace(requestXML.Eventname) && requestXML.Eventname.ToString().Trim().Equals("subscribe"))  {  SenDWelComeMsg(requestXML);//关注时返回的图文消息  }  else if (!string.IsNullOrWhiteSpace(requestXML.Eventname) && requestXML.Eventname.ToString().Trim().Equals("CliCK"))  {  SendEventMsg(requestXML);//发送事件消息  }  break; /// <summary> /// 发送响应事件消息 /// </summary> /// <param name="requestXML"></param> private voID SendEventMsg(RequestXML requestXML) { string keyStr = requestXML.EventKey.ToString(); switch (keyStr) { case "mypay":  SendPayDetails(requestXML);//发送薪资账单  break; case "tianqiyubao":  SenDWeaterMessage(requestXML);//发送天气预报  break; case "kaixinyixiao":  SendKaiXinMessage(requestXML);//发送开心一笑结果集  break; case "updateMessage":  SendUpdateMessage(requestXML);//发送修改信息链接  break; case "yuangonghuodong":  SendYuanGongHuodong(requestXML);//发送学生活动  break; case "yuangongtongzhi":  SendYuanGongTongZhi(requestXML);//发送员工通知  break; case "youwenbIDa":  SenDWenti(requestXML);//发送员工提交问题链接  break; case "mywen":  SenDWentiList(requestXML);//发送问题列表链接  break; case "Phoneserices":  SendKeFuMessage(requestXML);//接入客服  break; default:  String responseContent = String.Empty;  responseContent = FormattextxML(requestXML.FromUsername,"此功能暂未开放!敬请期待!");  httpContext.Current.Response.ContentType = "text/xml";  httpContext.Current.Response.ContentEnCoding = EnCoding.UTF8;  httpContext.Current.Response.Write(responseContent);  httpContext.Current.Response.End();  break; } }

 SenDWelComeMsg(requestXML);//关注时返回的图文消息

 /// <summary> /// 发送关注时的图文消息 /// </summary> /// <param name="requestXML"></param> private voID SenDWelComeMsg(RequestXML requestXML) { String responseContent = String.Empty; string newdate = DateTime.Now.Subtract(new DateTime(1970,0)).TotalSeconds.ToString(); string PUrlfilename = "http://www.deqiaohr.com.cn/weixin/welcome.jpg"; responseContent = string.Format(Message_News_Main,requestXML.FromUsername,newdate,"1",string.Format(Message_News_Item,"欢迎关注德桥员工服务中心","苏州德桥人力资源创立于2002年...",PUrlfilename,"http://www.deqiaohr.com.cn/weixin/WxGsjianjIE.aspx")); httpContext.Current.Response.ContentType = "text/xml"; httpContext.Current.Response.ContentEnCoding = EnCoding.UTF8; httpContext.Current.Response.Write(responseContent); httpContext.Current.Response.End(); }

 Message_News_Main 和Message_News_Item是图文消息格式化

 /// <summary> /// 返回图文消息主体 /// </summary> public static string Message_News_Main { get { return @"<xml>  <ToUsername><![cdaTA[{0}]]></ToUsername>  <FromUsername><![cdaTA[{1}]]></FromUsername>  <CreateTime>{2}</CreateTime>  <MsgType><![cdaTA[news]]></MsgType>  <ArticleCount>{3}</ArticleCount>  <Articles>  {4}  </Articles>  </xml> "; } } /// <summary> /// 返回图文消息项 /// </summary> public static string Message_News_Item { get { return @"<item>  <Title><![cdaTA[{0}]]></Title>   <Description><![cdaTA[{1}]]></Description>  <PicUrl><![cdaTA[{2}]]></PicUrl>  <Url><![cdaTA[{3}]]></Url>  </item>"; } } /// <summary> /// 发送响应语音识别结果 /// </summary> /// <param name="requestXML"></param> private voID SendVoiceMsg(RequestXML requestXML) { string responseContent = FormattextxML(requestXML.FromUsername,"您刚才说的语音消息识别结果为:" + requestXML.Recognition.ToString()); httpContext.Current.Response.ContentType = "text/xml"; httpContext.Current.Response.ContentEnCoding = EnCoding.UTF8; httpContext.Current.Response.Write(responseContent); httpContext.Current.Response.End(); }

精彩专题分享:ASP.NET微信开发教程汇总,欢迎大家学习。

以上就是关于asp.net微信开发的第二篇,针对消息应答进行学习,之后会有更新更多关于asp.net微信开发的文章,希望大家持续关注。

总结

以上是内存溢出为你收集整理的asp.net微信开发(消息应答)全部内容,希望文章能够帮你解决asp.net微信开发(消息应答)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1260843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存