/// <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 virtual ResponseMessageBase ToResponseMessage() { var res = new ResponseMessageVoice(); res.Voice.MediaId = this.Voice.MediaId; return(res); }
//<?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://sdk.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.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; case ResponseMsgType.Transfer_Customer_Service: responseMessage = new ResponseMessageTransfer_Customer_Service(); 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 async Task <bool> OnVoiceMessageReceived(object sender, VoiceMessageReceivedEventArgs e) { var messageHandler = sender as WeixinMessageHandler; var responseMessage = new ResponseMessageVoice(); responseMessage.FromUserName = e.ToUserName; responseMessage.ToUserName = e.FromUserName; responseMessage.Voice.MediaId = e.MediaId; //responseMessage.Music.MusicUrl = e.MediaId; //responseMessage.Music.Title = "语音"; //responseMessage.Music.Description = "这里是一条语音消息"; await messageHandler.WriteAsync(responseMessage); return(true); }
/// <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); } }
/// <summary> /// 处理语音请求 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage) { //var responseMessage = CreateResponseMessage<ResponseMessageMusic>(); ////上传缩略图 //var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret); //var uploadResult = MediaApi.UploadTemporaryMedia(accessToken, UploadMediaFileType.image, // Server.GetMapPath("~/Images/Logo.jpg")); ////设置音乐信息 //responseMessage.Music.Title = "天籁之音"; //responseMessage.Music.Description = "播放您上传的语音"; //responseMessage.Music.MusicUrl = "http://www.w3ccloud.com/Media/GetVoice?mediaId=" + requestMessage.MediaId; //responseMessage.Music.HQMusicUrl = "http://www.w3ccloud.com/Media/GetVoice?mediaId=" + requestMessage.MediaId; //responseMessage.Music.ThumbMediaId = uploadResult.media_id; //return responseMessage; try { string token = WeiXinUtils.tryGetAccessToken(); string wxMediaUrl = WxApiUrl.mediaDown(token, requestMessage.MediaId); string url = WeiXinUtils.downloadFile(wxMediaUrl, "/image-lib", Guid.NewGuid().ToString()); string path = System.AppDomain.CurrentDomain.BaseDirectory + @"image-lib\" + Guid.NewGuid().ToString() + "." + requestMessage.MsgType; ResponseMessageVoice responseMessage = CreateResponseMessage <ResponseMessageVoice>(); responseMessage.Voice.MediaId = requestMessage.MediaId; return(responseMessage); } catch (Exception e) { ResponseMessageText responseMessage = CreateResponseMessage <ResponseMessageText>(); responseMessage.Content = "您发送了一条语音信息,ID:" + requestMessage.MediaId + requestMessage.Recognition + "\r\n" + e.Message + "\r\n" + e.StackTrace; return(responseMessage); } }
//加载文件 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 ActionResult PostQuickResponse(string openId, List <NewsInfoView> newsList) { try { var news = newsList[0]; if ("video".Equals(news.NewsCate)) { news.ImageContent = SaveBase64ImageToServer(news.ImageContent); } SysWechatConfig wechat = WeChatCommonService.lstSysWeChatConfig.Find(p => p.Id == news.AppId && !p.IsCorp.Value); if (wechat == null) { return(Json(new { results = new { Data = 500 } })); } ResponseMessageBase response = null; var lstArticles = GetArticleList(newsList, false, news.NewsCate, null, false); //发送消息 WechatCommonMP.SendMsg(news.NewsCate, "", lstArticles, "", new string[] { openId }, null, true); switch (news.NewsCate) { case "text": response = new ResponseMessageText() { Content = news.NewsContent }; //returnResult = CustomApi.SendText(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.NewsContent); break; case "news": //var lstArticles = GetArticleList(newsList, false); //List<NewsModel> articles = new List<NewsModel>(); //string host = CommonService.GetSysConfig("Content Server", ""); //if (host.EndsWith("/")) //{ // host = host.Substring(0, host.Length - 1); //} //for (int i = 0; i < lstArticles.Count; i++) //{ // var item = lstArticles[i]; // var filePath = Server.MapPath("~/") + item.ImageCoverUrl.Insert(item.ImageCoverUrl.LastIndexOf('.'), "_T"); // if (0 == i) // { // filePath = filePath.Replace("_T", "_B"); // } // var ret0 = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(wechat.WeixinAppId, wechat.WeixinCorpSecret, Weixin.MP.UploadMediaFileType.thumb, filePath); // var picUrl = (host + item.ImageCoverUrl).Replace("\\", "/"); // var url = string.Format("{0}/MPNews/ArticleInfo/WxDetail/{1}?wechatid={2}&isPreview={3}", host, item.Id, item.AppId, false); // articles.Add(new NewsModel() { title = item.ArticleTitle, content = WechatCommonMP.ImageConvert(item.ArticleContent, wechat.Id), thumb_url = picUrl, thumb_media_id = ret0.thumb_media_id, content_source_url = url }); //} //var ret = Innocellence.Weixin.MP.AdvancedAPIs.MediaApi.UploadTemporaryNews(wechat.WeixinAppId, wechat.WeixinCorpSecret, 10000, articles.ToArray()); //returnResult = CustomApi.SendMpNews(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, ret.media_id); string _newsHost = Infrastructure.Web.Domain.Service.CommonService.GetSysConfig("WeChatUrl", ""); response = new ResponseMessageNews() { Articles = lstArticles.Select(a => new Article() { Title = a.ArticleTitle, Url = string.Format("{0}/{3}/ArticleInfo/wxdetail/{1}?wechatid={2}&isAutoReply={4}", _newsHost, a.Id, news.AppId, "mpnews", 0),// _newsHost + "/News/ArticleInfo/wxdetail/" + a.Id + "?wechatid=" + appId, PicUrl = _newsHost + a.ImageCoverUrl, Description = a.ArticleComment }).ToList() }; break; case "image": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.IMAGE, news, news.AppId); //returnResult = CustomApi.SendImage(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId); response = new ResponseMessageImage() { Image = new Weixin.Entities.Image() { MediaId = news.MediaId } }; break; case "video": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.VIDEO, news, news.AppId); ////var ret1 = Innocellence.Weixin.MP.AdvancedAPIs.GroupMessageApi.GetOpenIdVideoMediaIdResult(wechat.WeixinAppId, wechat.WeixinCorpSecret, news.MediaId, news.NewsTitle, news.NewsComment); ////news.MediaId = ret1.media_id; ////news.MediaCreateTime = ret1.created_at; //returnResult = CustomApi.SendVideo(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId, news.NewsTitle, news.NewsComment); response = new ResponseMessageVideo() { Video = new Video() { MediaId = news.MediaId } }; break; case "voice": //WechatCommon.GetMediaInfo(AutoReplyContentEnum.VOICE, news, news.AppId); //returnResult = CustomApi.SendVoice(wechat.WeixinAppId, wechat.WeixinCorpSecret, openId, news.MediaId); response = new ResponseMessageVoice() { Voice = new Voice() { MediaId = news.MediaId } }; break; default: throw new Exception("Invalid media type."); } //var user = _WechatMPUserService.GetUserByOpenId(openId); response.ToUserName = openId; var task = _WeChatUserRequestMessageLogHandler.WriteResponseLogMP(new List <Innocellence.Weixin.Entities.IResponseMessageBase> { response }, news.AppId.ToString(), false); return(Json(new { results = new { Data = 200, Object = task.Result } })); } catch (Exception e) { _Logger.Error(e, "An error occurred while PostQuickResponse."); return(Json(new { results = new { Data = 500, Message = e.Message } })); } }