/// <summary> /// 获取响应消息和实体之间的映射结果 /// </summary> /// <param name="responseMsgType"></param> /// <returns></returns> public override IResponseMessageBase GetResponseEntityMappingResult(ResponseMsgType responseMsgType, XDocument doc = null) { ResponseMessageBase responseMessage; switch (responseMsgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; case ResponseMsgType.Transfer_Customer_Service: responseMessage = new ResponseMessageTransfer_Customer_Service(); break; case ResponseMsgType.NoResponse: responseMessage = new ResponseMessageNoResponse(); break; case ResponseMsgType.SuccessResponse: responseMessage = new SuccessResponseMessage(); break; #region 扩展类型 case ResponseMsgType.MultipleNews: case ResponseMsgType.LocationMessage: case ResponseMsgType.UseApi: #endregion case ResponseMsgType.MpNews: case ResponseMsgType.Unknown: case ResponseMsgType.Other: default: responseMessage = new ResponseMessageUnknownType() { ResponseDocument = doc }; break; } return(responseMessage); }
public void GetResponseEntityTest() { { //Text ResponseMessageText exceptResult = new ResponseMessageText() { ToUserName = "******", FromUserName = "******", CreateTime = DateTimeHelper.GetDateTimeFromXml(63497820384), //MsgType = ResponseMsgType.Text, Content = "文字信息", FuncFlag = false }; var result = ResponseMessageFactory.GetResponseEntity(xmlText) as ResponseMessageText; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); Assert.AreEqual(exceptResult.Content, result.Content); } { //Image ResponseMessageNews exceptResult = new ResponseMessageNews() { //Articles = new List<Article>(), CreateTime = DateTimeHelper.GetDateTimeFromXml(63497821905), FromUserName = "******", ToUserName = "******", FuncFlag = false, //MsgType = ResponseMsgType.News }; var result = ResponseMessageFactory.GetResponseEntity(xmlNews) as ResponseMessageNews; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); Assert.AreEqual(2, result.ArticleCount); Assert.AreEqual(result.Articles.Count, result.ArticleCount); } { //Music ResponseMessageMusic exceptResult = new ResponseMessageMusic() { Music = new Music() { Title = "标题", Description = "说明", MusicUrl = "http://weixin.senparc.com/Content/music1.mp3", HQMusicUrl = "" }, CreateTime = DateTimeHelper.GetDateTimeFromXml(63497823450), FromUserName = "******", ToUserName = "******", FuncFlag = false, //MsgType = ResponseMsgType.Music }; var result = ResponseMessageFactory.GetResponseEntity(xmlMusic) as ResponseMessageMusic; Assert.AreEqual(exceptResult.ToUserName, result.ToUserName); Assert.AreEqual(exceptResult.CreateTime, result.CreateTime); //Assert.AreEqual(exceptResult.Music, result.Music); } }
//<?xml version="1.0" encoding="utf-8"?> //<xml> // <ToUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></ToUserName> // <FromUserName><![CDATA[gh_a96a4a619366]]></FromUserName> // <CreateTime>63497820384</CreateTime> // <MsgType>text</MsgType> // <Content><![CDATA[您刚才发送了文字信息:中文 //您还可以发送【位置】【图片】【语音】信息,查看不同格式的回复。 //SDK官方地址:http://weixin.senparc.com]]></Content> // <FuncFlag>0</FuncFlag> //</xml> /// <summary> /// 获取XDocument转换后的IResponseMessageBase实例(通常在反向读取日志的时候用到)。 /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常 /// </summary> /// <returns></returns> public static IResponseMessageBase GetResponseEntity(XDocument doc) { ResponseMessageBase responseMessage = null; ResponseMsgType msgType; try { msgType = MsgTypeHelper.GetResponseMsgType(doc); switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; default: throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在ResponseMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException()); } EntityHelper.FillEntityWithXml(responseMessage, doc); } catch (ArgumentException ex) { throw new WeixinException(string.Format("ResponseMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex); } return(responseMessage); }
public virtual ResponseMessageBase ToResponseMessage() { var res = new ResponseMessageMusic(); res.Music.Title = this.Music.Title; res.Music.Description = this.Music.Description; res.Music.MusicUrl = this.Music.MusicUrl; res.Music.HQMusicUrl = this.Music.HQMusicUrl; res.Music.ThumbMediaId = this.Music.ThumbMediaId; return(res); }
/// <summary> /// ResponseMessageBase.CreateFromResponseXml(xml)的扩展方法 /// 从返回结果XML转换成IResponseMessageBase实体类 /// </summary> /// <param name="xml">返回给服务器的Response Xml</param> /// <returns></returns> public static ResponseMessageBase CreateResponseMessage(this string xml) { try { if (string.IsNullOrEmpty(xml)) { return(null); } var doc = XDocument.Parse(xml); ResponseMessageBase responseMessage = null; var msgType = (ResponseMsgType)Enum.Parse(typeof(ResponseMsgType), doc.Root.Element("MsgType").Value, true); switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; } responseMessage.FillEntityWithXml(doc); return(responseMessage); } catch (Exception ex) { throw new WeiXinException("ResponseMessageBase.CreateFromResponseXml<T>过程发生异常!" + ex.Message, ex); } }
/// <summary> /// 获取响应类型实例,并初始化 /// </summary> /// <param name="requestMessage">请求</param> /// <param name="msgType">响应类型</param> /// <returns></returns> private static ResponseMessageBase CreateFromRequestMessage(RequestMessageBase requestMessage, ResponseMsgType msgType) { ResponseMessageBase responseMessage = null; try { switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText(); break; case ResponseMsgType.News: responseMessage = new ResponseMessageNews(); break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic(); break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage(); break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice(); break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo(); break; default: throw new UnknownRequestMsgTypeException(string.Format("ResponseMsgType没有为 {0} 提供对应处理程序。", msgType), new ArgumentOutOfRangeException()); } responseMessage.ToUserName = requestMessage.FromUserName; responseMessage.FromUserName = requestMessage.ToUserName; responseMessage.CreateTime = DateTime.Now; //使用当前最新时间 } catch (Exception ex) { throw new WeiXinException("CreateFromRequestMessage过程发生异常", ex); } return(responseMessage); }
/// <summary> /// 获取响应类型实例,并初始化 /// </summary> /// <param name="msgType">响应类型</param> /// <returns></returns> private static IResponseMessageBase CreateFromRequestMessage(ResponseMsgType msgType) { IResponseMessageBase result = null; try { switch (msgType) { case ResponseMsgType.Text: result = new ResponseMessageText(); break; case ResponseMsgType.News: result = new ResponseMessageNews(); break; case ResponseMsgType.Music: result = new ResponseMessageMusic(); break; case ResponseMsgType.Image: result = new ResponseMessageImage(); break; case ResponseMsgType.Voice: result = new ResponseMessageVoice(); break; case ResponseMsgType.Video: result = new ResponseMessageVideo(); break; default: if (msgType != ResponseMsgType.NoResponse) { throw new Exception(string.Format("ResponseMsgType没有为 {0} 提供对应处理程序。", msgType), new ArgumentOutOfRangeException()); } result = new ResponseMessageBase(); break; } } catch (Exception inner) { throw new Exception("ResponseMessageFactory.CreateFromRequestMessage过程发生异常", inner); } return(result); }
/// <summary> /// 从返回结果XML转换成IResponseMessageBase实体类(通常在反向读取日志的时候用到)。 /// </summary> /// <returns></returns> public static IResponseMessageBase GetResponseEntity(XDocument doc) { ResponseMessageBase val = null; try { ResponseMsgType responseMsgType = MsgTypeHelper.GetResponseMsgType(doc); switch (responseMsgType) { case ResponseMsgType.Text: val = new ResponseMessageText(); break; case ResponseMsgType.Image: val = new ResponseMessageImage(); break; case ResponseMsgType.Voice: val = new ResponseMessageVoice(); break; case ResponseMsgType.Video: val = new ResponseMessageVideo(); break; case ResponseMsgType.Music: val = new ResponseMessageMusic(); break; case ResponseMsgType.News: val = new ResponseMessageNews(); break; } val.FillEntityWithXml <ResponseMessageBase>(doc); return(val); } catch (Exception ex) { throw new Exception($"ResponseMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", ex); } }
//加载文件 private static void LoadConfig() { var tempResponse = new List <ResponseModel>(); var xml = new XmlDocument(); xml.Load(ConfigFile); var items = xml.SelectNodes("/Events/Item"); for (var i = 0; i < items.Count; i++) { var strType = (from XmlNode node in items[i].ChildNodes where node.Name == "MsgType" select node.InnerText).FirstOrDefault(); if (strType == null) { throw new Exception("responseMessage.xml文件配置有误 MsgType 不能为空!"); } ResponseMsgType msgType; if (!Enum.TryParse(strType, true, out msgType)) { throw new Exception("responseMessage.xml文件配置有误 MsgType 不属于指定的类型!"); } IResponseMessageBase responseMessage; switch (msgType) { case ResponseMsgType.Text: responseMessage = new ResponseMessageText { Content = (from XmlNode node in items[i].ChildNodes where node.Name == "Content" select node.InnerText).FirstOrDefault() }; break; case ResponseMsgType.Image: responseMessage = new ResponseMessageImage { Image = new Image { MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Voice: responseMessage = new ResponseMessageVoice { Voice = new Voice { MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Video: responseMessage = new ResponseMessageVideo { Video = new Video { Title = (from XmlNode node in items[i].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault(), Description = (from XmlNode node in items[i].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), MediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "MediaId" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.Music: responseMessage = new ResponseMessageMusic { Music = new Music { Description = (from XmlNode node in items[i].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), HQMusicUrl = (from XmlNode node in items[i].ChildNodes where node.Name == "HQMusicUrl" select node.InnerText).FirstOrDefault(), MusicUrl = (from XmlNode node in items[i].ChildNodes where node.Name == "MusicUrl" select node.InnerText).FirstOrDefault(), ThumbMediaId = (from XmlNode node in items[i].ChildNodes where node.Name == "ThumbMediaId" select node.InnerText).FirstOrDefault(), Title = (from XmlNode node in items[i].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault() } }; break; case ResponseMsgType.News: var selects = items[i].SelectNodes("Article"); var articles = new List <Article>(); for (var j = 0; j < selects.Count; j++) { var url = ( from XmlNode node in selects[j].ChildNodes where node.Name == "Url" select node.InnerText).FirstOrDefault(); articles.Add(new Article { Description = (from XmlNode node in selects[j].ChildNodes where node.Name == "Description" select node.InnerText).FirstOrDefault(), PicUrl = (from XmlNode node in selects[j].ChildNodes where node.Name == "PicUrl" select node.InnerText).FirstOrDefault(), Title = (from XmlNode node in selects[j].ChildNodes where node.Name == "Title" select node.InnerText).FirstOrDefault(), //Url = WeixinCommon.GetAuthorizeUserInfoUrl(url) Url = url }); } responseMessage = new ResponseMessageNews { Articles = articles }; break; default: continue; } var eventKey = (from XmlNode node in items[i].ChildNodes where node.Name == "EventKey" select node.InnerText).FirstOrDefault(); tempResponse.Add(new ResponseModel { EventKey = eventKey, MsgType = msgType, ResponseMessage = responseMessage }); } _responseList = tempResponse; _isChanging = false; }
public override IResponseMessageBase OnEvent_ClickRequest(RequestMessageEvent_Click requestMessage) { IResponseMessageBase base2 = null; switch (requestMessage.EventKey) { case "lobby": return(this.GetUrlResponse(requestMessage.FromUserName)); case "OneClick": { ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>(); base2 = text; text.Content = "您点击了底部按钮。\r\n为了测试微信软件换行bug的应对措施,这里做了一个——\r\n换行"; return(base2); } case "SubClickRoot_Text": { ResponseMessageText text2 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text2; text2.Content = "您点击了子菜单按钮。"; return(base2); } case "SubClickRoot_News": { ResponseMessageNews news = base.CreateResponseMessage <ResponseMessageNews>(); base2 = news; Article item = new Article { Title = "您点击了子菜单图文按钮", Description = "您点击了子菜单图文按钮,这是一条图文信息。", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg", Url = "http://sdk.weixin.senparc.com" }; news.Articles.Add(item); return(base2); } case "SubClickRoot_Music": { UploadTemporaryMediaResult result = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.thumb, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710); ResponseMessageMusic music = base.CreateResponseMessage <ResponseMessageMusic>(); base2 = music; music.Music.Title = "天籁之音"; music.Music.Description = "真的是天籁之音"; music.Music.MusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; music.Music.HQMusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3"; music.Music.ThumbMediaId = result.thumb_media_id; return(base2); } case "SubClickRoot_Image": { UploadTemporaryMediaResult result2 = MediaApi.UploadTemporaryMedia(AccessTokenContainer.TryGetAccessToken(this.appId, this.appSecret, false), UploadMediaFileType.image, Server.GetMapPath("~/Images/Logo.jpg"), 0x2710); ResponseMessageImage image = base.CreateResponseMessage <ResponseMessageImage>(); base2 = image; image.Image.MediaId = result2.media_id; return(base2); } case "OAuth": { ResponseMessageNews news2 = base.CreateResponseMessage <ResponseMessageNews>(); Article article2 = new Article { Title = "OAuth2.0测试", Description = "选择下面两种不同的方式进行测试,区别在于授权成功后,最后停留的页面。" }; news2.Articles.Add(article2); Article article3 = new Article { Title = "OAuth2.0测试(不带returnUrl),测试环境可使用", Description = "OAuth2.0测试(不带returnUrl)", Url = "http://sdk.weixin.senparc.com/oauth2", PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }; news2.Articles.Add(article3); string url = "/OAuth2/TestReturnUrl"; Article article4 = new Article { Title = "OAuth2.0测试(带returnUrl),生产环境强烈推荐使用", Description = "OAuth2.0测试(带returnUrl)", Url = "http://sdk.weixin.senparc.com/oauth2?returnUrl=" + url.UrlEncode(), PicUrl = "http://sdk.weixin.senparc.com/Images/qrcode.jpg" }; news2.Articles.Add(article4); return(news2); } case "Description": { ResponseMessageText text3 = base.CreateResponseMessage <ResponseMessageText>(); text3.Content = this.GetWelcomeInfo(); return(text3); } case "SubClickRoot_PicPhotoOrAlbum": { ResponseMessageText text4 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text4; text4.Content = "您点击了【微信拍照】按钮。系统将会弹出拍照或者相册发图。"; return(base2); } case "SubClickRoot_ScancodePush": { ResponseMessageText text5 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text5; text5.Content = "您点击了【微信扫码】按钮。"; return(base2); } case "ConditionalMenu_Male": { ResponseMessageText text6 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text6; text6.Content = "您点击了个性化菜单按钮,您的微信性别设置为:男。"; return(base2); } case "ConditionalMenu_Femle": { ResponseMessageText text7 = base.CreateResponseMessage <ResponseMessageText>(); base2 = text7; text7.Content = "您点击了个性化菜单按钮,您的微信性别设置为:女。"; return(base2); } } ResponseMessageText text8 = base.CreateResponseMessage <ResponseMessageText>(); text8.Content = "您点击了按钮,EventKey:" + requestMessage.EventKey; return(text8); }