/// <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);
        }
Beispiel #2
0
        public virtual ResponseMessageBase ToResponseMessage()
        {
            var res = new ResponseMessageVoice();

            res.Voice.MediaId = this.Voice.MediaId;
            return(res);
        }
Beispiel #3
0
        //<?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);
        }
Beispiel #5
0
        /// <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);
            }
        }
Beispiel #6
0
        /// <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);
            }
        }
Beispiel #9
0
        /// <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);
            }
        }
Beispiel #10
0
        //加载文件
        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 } }));
            }
        }