这篇文章主要介绍了asp.net微信开发中有关消息应答的相关内容,需要的朋友可以参考下
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
请注意:
1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
3、为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“消息加解密说明”。
各消息类型的推送XML数据包结构如下:
文本消息
1348831860 1234567890123456
登录后复制
图片消息
1348831860 1234567890123456
登录后复制
语音消息
13572909131234567890123456
登录后复制
请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段 (注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:
13572909131234567890123456
登录后复制
多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。
视频消息
13572909131234567890123456
登录后复制登录后复制
小视频消息
13572909131234567890123456
登录后复制登录后复制
地理位置消息
135177636023.134521113.358803201234567890123456
登录后复制
链接消息
13517763601234567890123456
登录后复制
接上篇,看ResponseXML(postString);方法如下
////// 获取用户发送的消息 /// /// 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是我单独创建的一个类,该类声明了消息中常用的属性字段,如下:
////// 接收消息的实体类 /// public class RequestXML { private String toUserName = String.Empty; ////// 本公众号 /// public String ToUserName{get;set;} ////// 用户微信号 /// public String FromUserName{get;set;} ////// 创建时间 /// public String CreateTime{get;set;} ////// 信息类型 /// public String MsgType{get;set;} ////// 信息内容 /// public String Content{get;set;} /*以下为事件类型的消息特有的属性*/ ////// 事件名称 /// public String EventName{get;set;} ////// 事件值 /// public string EventKey { get; set; } /*以下为图文类型的消息特有的属性*/ ////// 图文消息的个数 /// public int ArticleCount { get; set; } ////// 图文消息的标题 /// public string Title { get; set; } ////// 图文消息的简介 /// public string Description { get; set; } ////// 图文消息图片的链接地址 /// public string PicUrl { get; set; } ////// 图文消息详情链接地址 /// public string Url { get; set; } ////// 图文消息集合 /// public List Articles { get; set;} /*以下为地理位置类型的消息特有的属性*/ ////// 地理位置纬度 /// public String Location_X { get; set; } ////// 地理位置经度 /// public String Location_Y { get; set; } ////// 地图缩放比例 /// public String Scale { get; set; } ////// 地图位置说明 /// public String Label { get; set; } ////// 语音消息特有字段 /// 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);//发送文本消息
////// 发送文本 /// /// 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方法制定格式
////// 返回格式化的Xml格式内容 /// /// 公众号 /// 用户号 /// 回复内容 /// private string FormatTextXML(string p1, string p2, string p3) { return "" + DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString() + "1"; }
登录后复制
这样就能实现消息的应答,如果用户点击的按钮,如下代码:
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; ////// 发送响应事件消息 /// /// 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, requestXML.ToUserName,"此功能暂未开放!敬请期待!"); HttpContext.Current.Response.ContentType = "text/xml"; HttpContext.Current.Response.ContentEncoding = Encoding.UTF8; HttpContext.Current.Response.Write(responseContent); HttpContext.Current.Response.End(); break; } }
登录后复制
SendWelComeMsg(requestXML);//关注时返回的图文消息
////// 发送关注时的图文消息 /// /// private void SendWelComeMsg(RequestXML requestXML) { String responseContent = String.Empty; string newdate = DateTime.Now.Subtract(new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds.ToString(); string PUrlfileName = "http://www.deqiaohr.com.cn/weixin/welcome.jpg"; responseContent = string.Format(Message_News_Main, requestXML.FromUserName, requestXML.ToUserName, 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是图文消息格式化
////// 返回图文消息主体 /// public static string Message_News_Main { get { return @" {2} {3} {4} "; } } ////// 返回图文消息项 /// public static string Message_News_Item { get { return @""; } } /// /// 发送响应语音识别结果 /// /// private void SendVoiceMsg(RequestXML requestXML) { string responseContent = FormatTextXML(requestXML.FromUserName, requestXML.ToUserName, "您刚才说的语音消息识别结果为:" + 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微信开发消息应答的技巧的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1547242.html