예제 #1
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官方地址:https://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());
                }
                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(responseMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("ResponseMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(responseMessage);
        }
        public override IResponseMessageBase OnLocationRequest(RequestMessageLocation requestMessage)
        {
            BaiYeMapItem  mapInfo       = this.service.GetMapInfoByGPS("来自用户提交的位置", Convert.ToSingle(requestMessage.Location_Y.ToString()), Convert.ToSingle(requestMessage.Location_X.ToString()), false);
            StringBuilder stringBuilder = new StringBuilder();

            if (mapInfo != null)
            {
                return(build.GetMapItemShow(mapInfo, requestMessage));
            }
            stringBuilder.Append("未找到地图,望见谅。建议输入关键词为详细的地名,包含门牌号或者专有地名等,会提高查询的成功率");
            ResponseMessageText expr_6D = base.CreateResponseMessage <ResponseMessageText>();

            expr_6D.Content = stringBuilder.ToString();
            return(expr_6D);
        }
예제 #3
0
        private ResponseMessageText WechatEventMsgHandler(RequestMessageEventBase request)
        {
            ResponseMessageText responseMessage = null;

            switch (request.Event)
            {
            case Event.VIEW:
                //  var viewRequest = request as RequestMessageEvent_View;
                LogHelper.Logger.Debug("点击菜单跳转链接时的事件推送");
                responseMessage         = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request);
                responseMessage.Content = "正在获取您的账号信息,请稍等...";
                break;

            case Event.subscribe:
                responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request);
                var msgInfo = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "subscribe");
                if (msgInfo != null)
                {
                    responseMessage.Content = msgInfo.ResponseMsg;
                }
                else
                {
                    responseMessage.Content = "欢迎关注彩盟网";
                }
                break;

            case Event.CLICK:
                var request_click = request as RequestMessageEvent_Click;
                responseMessage = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request_click);
                var respMsg = "欢迎关注彩盟网,我们为您提供了最准确,最齐全的彩票分析计划";
                if (request_click.EventKey == WeChatConfig.MENU_SUB_CLICK_HELP)
                {
                    var msgInfo1 = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "help");
                    if (msgInfo1 != null)
                    {
                        respMsg = msgInfo1.ResponseMsg;
                    }
                }
                responseMessage.Content = respMsg;
                break;

            default:
                responseMessage         = ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(request);
                responseMessage.Content = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "default").ResponseMsg;
                break;
            }
            return(responseMessage);
        }
예제 #4
0
        public override ResponseMessageBase GetResponseEntityMappingResult(ResponseMsgType responseMsgType, XDocument doc = null)
        {
            ResponseMessageBase responseMessage = null;

            switch (responseMsgType)
            {
            case ResponseMsgType.Text:
                responseMessage = new ResponseMessageText();
                break;

            default:
                throw new Exception("未定义此类型:" + responseMsgType);
            }

            return(responseMessage);
        }
예제 #5
0
        /// <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);
        }
예제 #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);
        }
예제 #7
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);
            }
        }
예제 #8
0
        public async Task <bool> OnLinkMessageReceived(object sender, LinkMessageReceivedEventArgs e)
        {
            _logger.LogInformation($"OnLinkMessageReceived: {e.Url}");

            var messageHandler  = sender as WeixinMessageHandler;
            var responseMessage = new ResponseMessageText();

            responseMessage.FromUserName = e.ToUserName;
            responseMessage.ToUserName   = e.FromUserName;
            responseMessage.Content      = string.Format(@"您发送了一条链接信息:
            Title:{0}
            Description:{1}
            Url:{2}", e.Title, e.Description, e.Url);
            await messageHandler.WriteAsync(responseMessage);

            return(true);
        }
        public override IResponseMessageBase OnTextOrEventRequest(RequestMessageText requestMessage)
        {
            // 预处理文字或事件类型请求。
            // 这个请求是一个比较特殊的请求,通常用于统一处理来自文字或菜单按钮的同一个执行逻辑,
            // 会在执行OnTextRequest或OnEventRequest之前触发,具有以下一些特征:
            // 1、如果返回null,则继续执行OnTextRequest或OnEventRequest
            // 2、如果返回不为null,则终止执行OnTextRequest或OnEventRequest,返回最终ResponseMessage
            // 3、如果是事件,则会将RequestMessageEvent自动转为RequestMessageText类型,其中RequestMessageText.Content就是RequestMessageEvent.EventKey

            ResponseMessageText strongResponseMessage = null;

            switch (requestMessage.Content)
            {
            //case "PushCarInfo":
            //    strongResponseMessage = CreateResponseMessage<ResponseMessageText>();
            //    strongResponseMessage.Content = "您点击了发布车辆信息按钮。制作跳转发布信息页面!";
            //    return strongResponseMessage;
            case "PushWorkInfo":
                strongResponseMessage         = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了发布用工信息按钮。制作跳转发布信息页面!";
                return(strongResponseMessage);

            case "GetCarInfo":
                strongResponseMessage         = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了查看车辆信息按钮。查找所有空闲车辆并展示信息!";
                return(strongResponseMessage);

            case "GetWorkInfo":
                strongResponseMessage         = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了查看用工信息按钮。查找所有空闲人工并展示信息!";
                return(strongResponseMessage);

            case "GetMoney":
                strongResponseMessage         = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了快速贷款按钮。请填写资料进行贷款!";
                return(strongResponseMessage);

            case "MJPlay":
                strongResponseMessage         = CreateResponseMessage <ResponseMessageText>();
                strongResponseMessage.Content = "您点击了棋牌游戏按钮。点击此处进入游戏!";
                return(strongResponseMessage);
            }

            return(null);//返回null,则继续执行OnTextRequest或OnEventRequest
        }
예제 #10
0
        private ResponseMessageText WechatTextMsgHandler(RequestMessageText requestMessage)
        {
            ResponseMessageText strongresponseMessage = null;

            var msgInfo = _wechatMsgRepository.GetAll().FirstOrDefault(p => p.KeyWord.Contains(requestMessage.Content));

            if (msgInfo == null)
            {
                strongresponseMessage =
                    ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(requestMessage);
                strongresponseMessage.Content = _wechatMsgRepository.FirstOrDefault(p => p.KeyWord == "default").ResponseMsg;

                return(strongresponseMessage);
            }
            strongresponseMessage =
                ResponseMessageBase.CreateFromRequestMessage <ResponseMessageText>(requestMessage);
            strongresponseMessage.Content = msgInfo.Sid == null ? msgInfo.ResponseMsg : GetLotteryPlanByCode(msgInfo);
            return(strongresponseMessage);
        }
예제 #11
0
        public static ResponseMessageBase CreateFromRequestMessage(IRequestMessageBase requestMessage, WeixinResponseMsgType msgType)
        {
            ResponseMessageBase responseMessage = null;

            switch (msgType)
            {
            case WeixinResponseMsgType.Text:
                responseMessage = new ResponseMessageText()
                {
                    ToUserName   = requestMessage.FromUserName,
                    FromUserName = requestMessage.ToUserName,
                    CreateTime   = requestMessage.CreateTime,  //这个时间不是Ticks,用DateTime.Now会出错
                    MsgType      = msgType
                };
                break;

            case WeixinResponseMsgType.News:
                responseMessage = new ResponseMessageNews()
                {
                    ToUserName   = requestMessage.FromUserName,
                    FromUserName = requestMessage.ToUserName,
                    CreateTime   = requestMessage.CreateTime,
                    MsgType      = msgType
                };
                break;

            case WeixinResponseMsgType.Event:
                responseMessage = new ResponseMessageNews()
                {
                    ToUserName   = requestMessage.FromUserName,
                    FromUserName = requestMessage.ToUserName,
                    CreateTime   = requestMessage.CreateTime,
                    MsgType      = msgType
                };
                break;

            default:
                throw new ArgumentOutOfRangeException("msgType");
            }

            return(responseMessage);
        }
예제 #12
0
        public async Task <bool> OnTextMessageReceived(object sender, TextMessageReceivedEventArgs e)
        {
            _logger.LogDebug(XmlConvert.SerializeObject(e));

            var messageHandler  = sender as WeixinMessageHandler;
            var responseMessage = new ResponseMessageText();
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文本信息:{0}", e.Content);

                responseMessage.FromUserName = e.ToUserName;
                responseMessage.ToUserName   = e.FromUserName;
                responseMessage.Content      = result.ToString();
            }
            await messageHandler.WriteAsync(responseMessage);

            _logger.LogDebug(XmlConvert.SerializeObject(responseMessage));

            return(true);
        }
예제 #13
0
        /// <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);
            }
        }
예제 #14
0
파일: ScanService.cs 프로젝트: soon14/vzan
        public ResponseMessageText SetNotice(string openId, string key)
        {
            ResponseMessageText response = null;

            try
            {
                ScanModel lcode = RedisUtil.Get <ScanModel>("wxbindSessionID:" + key);
                if (lcode == null)
                {
                    return(response);
                }
                lcode.userInfo = UserApi.Info(appId, openId, Language.zh_CN);
                lcode.isUse    = 0;
                RedisUtil.Set <ScanModel>("wxbindSessionID:" + key, lcode, TimeSpan.FromMinutes(3));
            }
            catch (Exception ex)
            {
                log4net.LogHelper.WriteError(this.GetType(), ex);
            }
            return(response);
        }
예제 #15
0
        /// <summary>
        /// 处理应答链的结果,转为SDK的结果
        /// </summary>
        private IResponseMessageBase ResponseChainRequest_LevelForNode_ResultHandler(RC.IResponseMessage ret)
        {
            //根据应答链的处理结果,构造微信SDK的结果
            IResponseMessageBase result = null;

            if (ret is RC.ResponseTextMessage)
            {
                ResponseMessageText result_text = base.CreateResponseMessage <ResponseMessageText>();
                result_text.Content = ((RC.ResponseTextMessage)ret).Context;
                result = result_text;
            }
            else if (ret is RC.ResponseNewsResult)
            {
                ResponseMessageNews result_text = base.CreateResponseMessage <ResponseMessageNews>();
                result_text.Articles = new System.Collections.Generic.List <Article>();
                foreach (RC.ArticleCan item in ((RC.ResponseNewsResult)ret).ArticleList)
                {
                    result_text.Articles.Add(new Article
                    {
                        Description = item.Description,
                        PicUrl      = item.PicUrl,
                        Title       = item.Title,
                        Url         = item.Url
                    });
                }
                result = result_text;
            }
            else if (ret is RC.ResponseArtificialCustomerResultMessage)
            {
                string[] accountList = ((RC.ResponseArtificialCustomerResultMessage)ret).AccountList;
                return(GetArtificialCustomerService(accountList));
            }
            else if (ret is RC.ResponseRawResult)
            {
                result = this.ResponseChainRequest_LevelForNode_RawResultHandler((RC.ResponseRawResult)ret);
            }

            //返回结果
            return(result);
        }
예제 #16
0
        /// <summary>
        /// 根据请求内容处理微信消息
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public ResponseMessageText MsgHandlerByRequestContent(IRequestMessageBase requestMessage)
        {
            ResponseMessageText responseMessage = null;

            switch (requestMessage.MsgType)
            {
            case RequestMsgType.Text:    //文字类型
                var requestMsgText = requestMessage as RequestMessageText;
                responseMessage = WechatTextMsgHandler(requestMsgText);
                break;

            //响应事件
            case RequestMsgType.Event:
                var request = requestMessage as RequestMessageEventBase;
                responseMessage = WechatEventMsgHandler(request);
                break;

            default:
                LogHelper.Logger.Error("该消息并非文字类型消息,请求内容为:" + requestMessage.ToJson());
                throw new Exception("暂不支持其他类型的消息处理");
            }
            return(responseMessage);
        }
예제 #17
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);
            }
        }
예제 #18
0
        public async Task <bool> OnTextMessageReceived(object sender, TextMessageReceivedEventArgs e)
        {
            _logger.LogDebug(XmlConvert.SerializeObject(e));

            var msg = new ReceivedTextMessage();

            msg.Content      = e.Content;
            msg.From         = e.FromUserName;
            msg.To           = e.ToUserName;
            msg.ReceivedTime = new DateTimeOffset(WeixinTimestampHelper.ToUtcTime(e.CreateTimeStr));
            _db.ReceivedTextMessages.Add(msg);
            var saveResult = await _db.SaveChangesAsync();

            if (saveResult > 0)
            {
                _logger.LogDebug($"已将微信文本消息存入数据库。Result:{saveResult}, From:{msg.From}, To:{msg.To}, Time:{msg.ReceivedTime}, Content:{msg.Content}");
            }
            _logger.LogDebug($"微信文本消息在数据库中共{_db.ReceivedTextMessages.ToList().Count()}条记录。");


            var messageHandler  = sender as WeixinMessageHandler;
            var responseMessage = new ResponseMessageText();
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文本信息:{0}", e.Content);

                responseMessage.FromUserName = e.ToUserName;
                responseMessage.ToUserName   = e.FromUserName;
                responseMessage.Content      = result.ToString();
            }
            await messageHandler.WriteAsync(responseMessage);

            _logger.LogDebug(XmlConvert.SerializeObject(responseMessage));

            return(true);
        }
예제 #19
0
        public void OnTextRequest_Senparc调试(RequestMessageText requestMessage, ref ResponseMessageText responseMessage)
        {
            if (requestMessage.Content == null)
            {
            }
            else if (requestMessage.Content == "约束")
            {
                responseMessage.Content =
                    "<a href=\"http://weixin.senparc.com/FilterTest/\">点击这里</a>进行客户端约束测试(地址:http://weixin.senparc.com/FilterTest/)。";
            }
            else if (requestMessage.Content == "托管" || requestMessage.Content == "代理")
            {
                //开始用代理托管,把请求转到其他服务器上去,然后拿回结果
                //甚至也可以将所有请求在DefaultResponseMessage()中托管到外部。

                DateTime dt1 = DateTime.Now; //计时开始

                var responseXml = MessageAgent.RequestXml(this, agentUrl, agentToken, RequestDocument.ToString());
                //获取返回的XML
                //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString());

                /* 如果有WeiweihiKey,可以直接使用下面的这个MessageAgent.RequestWeiweihiXml()方法。
                 * WeiweihiKey专门用于对接www.weiweihi.com平台,获取方式见:http://www.weiweihi.com/ApiDocuments/Item/25#51
                 */
                //var responseXml = MessageAgent.RequestWeiweihiXml(weiweihiKey, RequestDocument.ToString());//获取Weiweihi返回的XML

                DateTime dt2 = DateTime.Now; //计时结束

                //转成实体。

                /* 如果要写成一行,可以直接用:
                 * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString());
                 * 或
                 *
                 */
                responseMessage = responseXml.CreateResponseMessage() as ResponseMessageText;

                responseMessage.Content += string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds);
            }
            else if (requestMessage.Content == "测试" || requestMessage.Content == "退出")
            {
                /*
                 * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(http://www.weiweihi.com/User/App/Detail/1),
                 * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。
                 */
                if (requestMessage.Content == "测试")
                {
                    //进入APP测试
                    responseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。";
                }
                else
                {
                    //退出APP测试
                    responseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。";
                }
            }
            else if (requestMessage.Content == "AsyncTest")
            {
                //异步并发测试(提供给单元测试使用)
                DateTime begin = DateTime.Now;
                int      t1, t2, t3;
                System.Threading.ThreadPool.GetAvailableThreads(out t1, out t3);
                System.Threading.ThreadPool.GetMaxThreads(out t2, out t3);
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4));
                DateTime end    = DateTime.Now;
                var      thread = System.Threading.Thread.CurrentThread;
                responseMessage.Content = string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}",
                                                        thread.ManagedThreadId,
                                                        HttpContext.Current != null ? HttpContext.Current.ApplicationInstance.GetHashCode() : -1,
                                                        begin,
                                                        end,
                                                        t2 - t1
                                                        );
            }
            else
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);

                if (CurrentMessageContext.RequestMessages.Count > 1)
                {
                    result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count,
                                        CurrentMessageContext.StorageData);
                    for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--)
                    {
                        var historyMessage = CurrentMessageContext.RequestMessages[i];
                        result.AppendFormat("{0} 【{1}】{2}\r\n",
                                            historyMessage.CreateTime.ToShortTimeString(),
                                            historyMessage.MsgType.ToString(),
                                            (historyMessage is RequestMessageText)
                                ? (historyMessage as RequestMessageText).Content
                                : "[非文字类型]"
                                            );
                    }
                    result.AppendLine("\r\n");
                }

                result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n",
                                    WeixinContext.ExpireMinutes, WeixinContext.MaxRecordCount);
                result.AppendLine("\r\n");
                result.AppendLine(
                    "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com");

                responseMessage.Content = result.ToString();
            }
        }
예제 #20
0
        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);
        }
예제 #21
0
        public IResponseMessageBase AutoReply(RequestMessageText requestMessage)
        {
            IResponseMessageBase base2 = null;

            try
            {
                string content = requestMessage.Content;
                if (this.rules == null)
                {
                    return(base2);
                }
                foreach (KeywordAutoReplyInfo_Item item in this.rules.keyword_autoreply_info.list)
                {
                    ReplyListInfoItem   item3;
                    ResponseMessageNews news;
                    bool flag = false;
                    foreach (KeywordListInfoItem item2 in item.keyword_list_info)
                    {
                        if (((item2.match_mode == AutoReplyMatchMode.equal) && (content == item2.content)) || ((item2.match_mode == AutoReplyMatchMode.contain) && content.Contains(item2.content)))
                        {
                            flag = true;
                            break;
                        }
                    }
                    if (flag)
                    {
                        item3 = item.reply_list_info[0];
                        switch (item3.type)
                        {
                        case AutoReplyType.text:
                        {
                            ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>();
                            text.Content = item3.content;
                            base2        = text;
                            break;
                        }

                        case AutoReplyType.news:
                            goto Label_00EA;
                        }
                    }
                    continue;
Label_00EA:
                    news = base.CreateResponseMessage <ResponseMessageNews>();
                    foreach (NewsInfoItem item4 in item3.news_info.list)
                    {
                        Article article = new Article
                        {
                            Title       = item4.title,
                            Description = item4.digest,
                            PicUrl      = item4.cover_url,
                            Url         = item4.content_url
                        };
                        news.Articles.Add(article);
                    }
                    base2 = news;
                }
                if ((base2 == null) && !string.IsNullOrEmpty(this.rules.message_default_autoreply_info.content))
                {
                    ResponseMessageText text2 = base.CreateResponseMessage <ResponseMessageText>();
                    text2.Content = this.rules.message_default_autoreply_info.content;
                    base2         = text2;
                }
            }
            catch
            {
            }
            return(base2);
        }
예제 #22
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 } }));
            }
        }
        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);
            }

            //TODO:测试语音和视频类型

            {
                //Music
                ResponseMessageMusic exceptResult = new ResponseMessageMusic()
                {
                    Music = new Music()
                    {
                        Title       = "标题",
                        Description = "说明",
                        MusicUrl    = "https://sdk.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);
            }
        }
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            ResponseMessageText text = base.CreateResponseMessage <ResponseMessageText>();
            string fromUserName      = requestMessage.FromUserName;

            if (requestMessage.Content == "投票")
            {
                return(this.GetVoteUrlResponse(fromUserName));
            }
            else if (requestMessage.Content == "核销")
            {
                return(this.GetBonusUrlResponse(fromUserName));
            }
            else
            {
                return(AutoReply(requestMessage));
            }
            text.Content = "无效命令";
            return(text);

            var responseMessage = base.CreateResponseMessage <ResponseMessageText>();

            if (requestMessage.Content == null)
            {
            }
            else if (requestMessage.Content == "约束")
            {
                responseMessage.Content =
                    @"您正在进行微信内置浏览器约束判断测试。您可以:
<a href=""http://sdk.weixin.senparc.com/FilterTest/"">点击这里</a>进行客户端约束测试(地址:http://sdk.weixin.senparc.com/FilterTest/),如果在微信外打开将直接返回文字。
或:
<a href=""http://sdk.weixin.senparc.com/FilterTest/Redirect"">点击这里</a>进行客户端约束测试(地址:http://sdk.weixin.senparc.com/FilterTest/Redirect),如果在微信外打开将重定向一次URL。";
            }
            else if (requestMessage.Content == "托管" || requestMessage.Content == "代理")
            {
                //开始用代理托管,把请求转到其他服务器上去,然后拿回结果
                //甚至也可以将所有请求在DefaultResponseMessage()中托管到外部。

                DateTime dt1 = DateTime.Now; //计时开始

                var agentXml = RequestDocument.ToString();

                #region 暂时转发到SDK线上Demo

                agentUrl   = "http://sdk.weixin.senparc.com/weixin";
                agentToken = WebConfigurationManager.AppSettings["WeixinToken"];//Token

                //修改内容,防止死循环
                var agentDoc = XDocument.Parse(agentXml);
                agentDoc.Root.Element("Content").SetValue("代理转发文字:" + requestMessage.Content);
                agentDoc.Root.Element("CreateTime").SetValue(DateTimeHelper.GetWeixinDateTime(DateTime.Now)); //修改时间,防止去重
                agentDoc.Root.Element("MsgId").SetValue("123");                                               //防止去重
                agentXml = agentDoc.ToString();

                #endregion

                var responseXml = MessageAgent.RequestXml(this, agentUrl, agentToken, agentXml);
                //获取返回的XML
                //上面的方法也可以使用扩展方法:this.RequestResponseMessage(this,agentUrl, agentToken, RequestDocument.ToString());

                /* 如果有WeiweihiKey,可以直接使用下面的这个MessageAgent.RequestWeiweihiXml()方法。
                 * WeiweihiKey专门用于对接www.weiweihi.com平台,获取方式见:https://www.weiweihi.com/ApiDocuments/Item/25#51
                 */
                //var responseXml = MessageAgent.RequestWeiweihiXml(weiweihiKey, RequestDocument.ToString());//获取Weiweihi返回的XML

                DateTime dt2 = DateTime.Now; //计时结束

                //转成实体。

                /* 如果要写成一行,可以直接用:
                 * responseMessage = MessageAgent.RequestResponseMessage(agentUrl, agentToken, RequestDocument.ToString());
                 * 或
                 *
                 */
                var msg = string.Format("\r\n\r\n代理过程总耗时:{0}毫秒", (dt2 - dt1).Milliseconds);
                var agentResponseMessage = responseXml.CreateResponseMessage();
                if (agentResponseMessage is ResponseMessageText)
                {
                    (agentResponseMessage as ResponseMessageText).Content += msg;
                }
                else if (agentResponseMessage is ResponseMessageNews)
                {
                    (agentResponseMessage as ResponseMessageNews).Articles[0].Description += msg;
                }
                return(agentResponseMessage);//可能出现多种类型,直接在这里返回
            }
            else if (requestMessage.Content == "测试" || requestMessage.Content == "退出")
            {
                /*
                 * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(https://www.weiweihi.com/User/App/Detail/1),
                 * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。
                 */
                if (requestMessage.Content == "测试")
                {
                    //进入APP测试
                    responseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。";
                }
                else
                {
                    //退出APP测试
                    responseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。";
                }
            }
            else if (requestMessage.Content == "AsyncTest")
            {
                //异步并发测试(提供给单元测试使用)
                DateTime begin = DateTime.Now;
                int      t1, t2, t3;
                System.Threading.ThreadPool.GetAvailableThreads(out t1, out t3);
                System.Threading.ThreadPool.GetMaxThreads(out t2, out t3);
                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(4));
                DateTime end    = DateTime.Now;
                var      thread = System.Threading.Thread.CurrentThread;
                responseMessage.Content = string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}",
                                                        thread.ManagedThreadId,
                                                        HttpContext.Current != null ? HttpContext.Current.ApplicationInstance.GetHashCode() : -1,
                                                        begin,
                                                        end,
                                                        t2 - t1
                                                        );
            }
            else if (requestMessage.Content.ToUpper() == "OPEN")
            {
                var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>();
                openResponseMessage.Articles.Add(new Article()
                {
                    Title       = "开放平台微信授权测试",
                    Description = @"点击进入Open授权页面。

授权之后,您的微信所收到的消息将转发到第三方(盛派网络小助手)的服务器上,并获得对应的回复。

测试完成后,您可以登陆公众号后台取消授权。",
                    Url         = "http://sdk.weixin.senparc.com/OpenOAuth/JumpToMpOAuth"
                });
                return(openResponseMessage);
            }
            else if (requestMessage.Content == "错误")
            {
                var errorResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>();
                //因为没有设置errorResponseMessage.Content,所以这小消息将无法正确返回。
                return(errorResponseMessage);
            }
            else if (requestMessage.Content == "容错")
            {
                Thread.Sleep(1500);//故意延时1.5秒,让微信多次发送消息过来,观察返回结果
                var faultTolerantResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageText>();
                faultTolerantResponseMessage.Content = string.Format("测试容错,MsgId:{0},Ticks:{1}", requestMessage.MsgId,
                                                                     DateTime.Now.Ticks);
                return(faultTolerantResponseMessage);
            }
            else if (requestMessage.Content.ToUpper() == "TM")//异步模板消息设置
            {
                var openId    = requestMessage.FromUserName;
                var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3);//为了防止openId泄露造成骚扰,这里启用验证码
                TemplateMessageCollection[checkCode] = openId;
                responseMessage.Content = string.Format(@"新的验证码为:{0},请在网页上输入。网址:http://sdk.weixin.senparc.com/AsyncMethods", checkCode);
            }
            else if (requestMessage.Content.ToUpper() == "OPENID") //返回OpenId及用户信息
            {
                var openId   = requestMessage.FromUserName;        //获取OpenId
                var userInfo = AdvancedAPIs.UserApi.Info(appId, openId, Language.zh_CN);

                responseMessage.Content = string.Format(
                    "您的OpenID为:{0}\r\n昵称:{1}\r\n性别:{2}\r\n地区(国家/省/市):{3}/{4}/{5}\r\n关注时间:{6}\r\n关注状态:{7}",
                    requestMessage.FromUserName, userInfo.nickname, (Sex)userInfo.sex, userInfo.country, userInfo.province, userInfo.city, DateTimeHelper.GetDateTimeFromXml(userInfo.subscribe_time), userInfo.subscribe);
            }
            else if (requestMessage.Content.ToUpper() == "EX")
            {
                var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息");//回调过程在global的ConfigWeixinTraceLog()方法中
                responseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + DateTime.Now.ToString();
            }
            else if (requestMessage.Content.ToUpper() == "MUTE")
            {
                return(new SuccessResponseMessage());

                base.TextResponseMessage = "success";
                responseMessage          = null;
            }
            else
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);

                if (CurrentMessageContext.RequestMessages.Count > 1)
                {
                    result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count,
                                        CurrentMessageContext.StorageData);
                    for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--)
                    {
                        var historyMessage = CurrentMessageContext.RequestMessages[i];
                        result.AppendFormat("{0} 【{1}】{2}\r\n",
                                            historyMessage.CreateTime.ToShortTimeString(),
                                            historyMessage.MsgType.ToString(),
                                            (historyMessage is RequestMessageText)
                                ? (historyMessage as RequestMessageText).Content
                                : "[非文字类型]"
                                            );
                    }
                    result.AppendLine("\r\n");
                }

                result.AppendFormat("如果您在{0}分钟内连续发送消息,记录将被自动保留(当前设置:最多记录{1}条)。过期后记录将会自动清除。\r\n",
                                    WeixinContext.ExpireMinutes, WeixinContext.MaxRecordCount);
                result.AppendLine("\r\n");
                result.AppendLine(
                    "您还可以发送【位置】【图片】【语音】【视频】等类型的信息(注意是这几种类型,不是这几个文字),查看不同格式的回复。\r\nSDK官方地址:http://sdk.weixin.senparc.com");

                responseMessage.Content = result.ToString();
            }
            return(responseMessage);
        }