Exemple #1
0
        /// <summary>
        /// 处理语音请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageeMusic(RequestMessageText requestMessage, int Indexid, int wid)
        {

            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageMusic>(requestMessage);
            RequestRuleContent model_wx = getDataMusicComm(wid, Indexid);
            if (model_wx == null)
            {
                DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "music", "-1", requestMessage.ToUserName);
            }
            else
            {
                if (model_wx.MediaUrl.StartsWith("http"))
                {
                    responseMessage.Music.MusicUrl = model_wx.MediaUrl;
                }
                else
                {
                    responseMessage.Music.MusicUrl = MyCommFun.getWebSite() + model_wx.MediaUrl;
                }
                responseMessage.Music.Title = model_wx.RContent;
                responseMessage.Music.Description = model_wx.RContent2;
                DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "music", "音乐链接:" + model_wx.MediaUrl + "|标题:" + model_wx.RContent + "|描述:" + model_wx.RContent2, requestMessage.ToUserName);

            }

            return responseMessage;
        }
Exemple #2
0
        /// <summary>
        /// 推送纯文字
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageTxt(RequestMessageText requestMessage, int Indexid, int wid)
        {

            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);

            string openid = requestMessage.FromUserName;
            string token = ConvertDateTimeInt(DateTime.Now).ToString();
            responseMessage.Content = getDataTxtComm(wid, Indexid, openid, token);
            DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "text", responseMessage.Content, requestMessage.ToUserName);
            return responseMessage;
        }
Exemple #3
0
        public IResponseMessageBase GetResponseMessageeVoice(RequestMessageText requestMessage, int Indexid, int wid)
        {

            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageVoice>(requestMessage);
            RequestRuleContent model_wx = getDataMusicComm(wid, Indexid);
            if (model_wx == null)
            {
                DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "music", "-1", requestMessage.ToUserName);
            }
            else
            {
                responseMessage.Voice = new Voice() { MediaId = model_wx.ExtStr };
                DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "music", "音乐链接:" + model_wx.MediaUrl + "|标题:" + model_wx.RContent + "|描述:" + model_wx.RContent2, requestMessage.ToUserName);

            }

            return responseMessage;
        }
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
        //  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
        //  <CreateTime>1357986928</CreateTime>
        //  <MsgType><![CDATA[text]]></MsgType>
        //  <Content><![CDATA[中文]]></Content>
        //  <MsgId>5832509444155992350</MsgId>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                    case RequestMsgType.Text:
                        requestMessage = new RequestMessageText();
                        break;
                    case RequestMsgType.Image:
                        requestMessage = new RequestMessageImage();
                        break;
                    case RequestMsgType.Event:
                        //判断Event类型
                        switch (doc.Root.Element("Event").Value.ToUpper())
                        { 
                            case "USER_ENTER_TEMPSESSION"://进入客服会话
                                requestMessage = new RequestMessageEvent_UserEnterTempSession();
                                break;
                            default://其他意外类型(也可以选择抛出异常)
                                requestMessage = new RequestMessageEventBase();
                                break;
                        }
                        break;
                    default:
                        throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
                EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return requestMessage;
        }
Exemple #5
0
        /// <summary>
        /// 将RequestMessageEventBase转换成RequestMessageText类型,其中Content = requestMessage.EventKey
        /// </summary>
        /// <param name="requestMessageEvent"></param>
        /// <returns></returns>
        public static RequestMessageText ConvertToRequestMessageText(this IRequestMessageEventBase requestMessageEvent)
        {
            var requestMessage = requestMessageEvent;
            var requestMessageText = new RequestMessageText()
            {
                FromUserName = requestMessage.FromUserName,
                ToUserName = requestMessage.ToUserName,
                CreateTime = requestMessage.CreateTime,
                MsgId = requestMessage.MsgId
            };

            //判断是否具有EventKey属性
            if (requestMessageEvent is IRequestMessageEventKey)
            {
                requestMessageText.Content = (requestMessageEvent as IRequestMessageEventKey).EventKey;
            }
            else
            {
                requestMessageText.Content = "";
            }

            return requestMessageText;
        }
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //说明:实际项目中这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

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

            var requestHandler =
                requestMessage.StartHandler()
                //关键字不区分大小写,按照顺序匹配成功后将不再运行下面的逻辑
                .Keyword("约束", () =>
            {
                defaultResponseMessage.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。";
                return(defaultResponseMessage);
            }).
                //匹配任一关键字
                Keywords(new[] { "托管", "代理" }, () =>
            {
                //开始用代理托管,把请求转到其他服务器上去,然后拿回结果
                //甚至也可以将所有请求在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);   //可能出现多种类型,直接在这里返回
            })
                .Keywords(new[] { "测试", "退出" }, () =>
            {
                /*
                 * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(https://www.weiweihi.com/User/App/Detail/1),
                 * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。
                 */
                if (defaultResponseMessage.Content == "测试")
                {
                    //进入APP测试
                    defaultResponseMessage.Content = "您已经进入【盛派网络小助手】的测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。";
                }
                else
                {
                    //退出APP测试
                    defaultResponseMessage.Content = "您已经退出【盛派网络小助手】的测试程序。";
                }
                return(defaultResponseMessage);
            })
                .Keyword("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;
                defaultResponseMessage.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
                                                               );

                return(defaultResponseMessage);
            })
                .Keyword("OPEN", () =>
            {
                var openResponseMessage = requestMessage.CreateResponseMessage <ResponseMessageNews>();
                openResponseMessage.Articles.Add(new Article()
                {
                    Title       = "开放平台微信授权测试",
                    Description = @"点击进入Open授权页面。

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

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

                defaultResponseMessage.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);
                return(defaultResponseMessage);
            })
                .Keyword("EX", () =>
            {
                var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息");    //回调过程在global的ConfigWeixinTraceLog()方法中
                defaultResponseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + DateTime.Now.ToString();
                return(defaultResponseMessage);
            })
                .Keyword("MUTE", () => //不回复任何消息
            {
                //方案一:
                return(new SuccessResponseMessage());

                //方案二:
                var muteResponseMessage = base.CreateResponseMessage <ResponseMessageNoResponse>();
                return(muteResponseMessage);

                //方案三:
                base.TextResponseMessage = "success";
                return(null);
            })
                .Keyword("JSSDK", () =>
            {
                defaultResponseMessage.Content = "点击打开:http://sdk.weixin.senparc.com/WeixinJsSdk";
                return(defaultResponseMessage);
            })
                //Default不一定要在最后一个
                .Default(() =>
            {
                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.ToString("HH:mm:ss"),
                                            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");

                defaultResponseMessage.Content = result.ToString();
                return(defaultResponseMessage);
            })
                //“一次订阅消息”接口测试
                .Keyword("订阅", () =>
            {
                defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/SubscribeMsg";
                return(defaultResponseMessage);
            })
                //正则表达式
                .Regex(@"^\d+#\d+$", () =>
            {
                defaultResponseMessage.Content = string.Format("您输入了:{0},符合正则表达式:^\\d+#\\d+$", requestMessage.Content);
                return(defaultResponseMessage);
            });

            return(requestHandler.GetResponseMessage() as IResponseMessageBase);
        }
Exemple #7
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //这里可以进行数据库记录或处理

            //发送一条客服消息回复用户

            var contentUpper = requestMessage.Content.ToUpper();

            if (contentUpper == "LINK")
            {
                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendLink(appId, OpenId, "欢迎使用 Senparc.Weixin SDK", "感谢大家的支持!\r\n\r\n盛派永远在你身边!",
                                                                      "https://weixin.senparc.com", "https://sdk.weixin.senparc.com/images/book-cover-front-small-3d-transparent.png");
            }
            else if (contentUpper == "CARD")
            {
                //上传封面临时素材
                var uploadResult = MP.AdvancedAPIs.MediaApi.UploadTemporaryMedia(appId, UploadMediaFileType.image, ServerUtility.ContentRootMapPath("~/Images/Logo.thumb.jpg"));

                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendMiniProgramPage(appId, OpenId, "欢迎使用 Senparc.Weixin SDK", "pages/websocket/websocket",
                                                                                 uploadResult.media_id);
            }
            else if (contentUpper == "客服")
            {
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendText(appId, OpenId, "您即将进入客服");
                var responseMessage = base.CreateResponseMessage <ResponseMessageTransfer_Customer_Service>();
                return(responseMessage);
            }
            else
            {
                var result = new StringBuilder();
                result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);

                var messageContext = GetCurrentMessageContext().ConfigureAwait(false).GetAwaiter().GetResult();
                if (messageContext.RequestMessages.Count > 1)
                {
                    result.AppendFormat("您刚才还发送了如下消息({0}/{1}):\r\n", messageContext.RequestMessages.Count,
                                        messageContext.StorageData);
                    for (int i = messageContext.RequestMessages.Count - 2; i >= 0; i--)
                    {
                        var    historyMessage = messageContext.RequestMessages[i];
                        string content        = null;
                        if (historyMessage is RequestMessageText)
                        {
                            content = (historyMessage as RequestMessageText).Content;
                        }
                        else if (historyMessage is RequestMessageEvent_UserEnterTempSession)
                        {
                            content = "[进入客服]";
                        }
                        else
                        {
                            content = string.Format("[非文字信息:{0}]", historyMessage.GetType().Name);
                        }

                        result.AppendFormat("{0} 【{1}】{2}\r\n",
                                            historyMessage.CreateTime.ToString("HH:mm:ss"),
                                            historyMessage.MsgType.ToString(),
                                            content
                                            );
                    }
                    result.AppendLine("\r\n");
                }

                //处理微信换行符识别问题
                var msg = result.ToString().Replace("\r\n", "\n");

                //发送客服消息
                Senparc.Weixin.WxOpen.AdvancedAPIs.CustomApi.SendText(appId, OpenId, msg);

                //也可以使用微信公众号的接口,完美兼容:
                //Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);
            }

            return(new SuccessResponseMessage());

            //和公众号一样回复XML是无效的:
            //            return new SuccessResponseMessage()
            //            {
            //                ReturnText = string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
            //<xml>
            //    <ToUserName><![CDATA[{0}]]></ToUserName>
            //    <FromUserName><![CDATA[{1}]]></FromUserName>
            //    <CreateTime>1357986928</CreateTime>
            //    <MsgType><![CDATA[text]]></MsgType>
            //    <Content><![CDATA[TNT2]]></Content>
            //</xml>",requestMessage.FromUserName,requestMessage.ToUserName)
            //            };
        }
Exemple #8
0
 /// <summary>
 /// 文字类型请求
 /// </summary>
 public virtual IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
 {
     return(DefaultResponseMessage(requestMessage));
 }
Exemple #9
0
 /// <summary>
 /// 【异步方法】文字类型请求
 /// </summary>
 public virtual async Task <IResponseMessageBase> OnTextRequestAsync(RequestMessageText requestMessage)
 {
     return(await DefaultAsyncMethod(requestMessage, () => OnTextRequest(requestMessage)));
 }
Exemple #10
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var requestHandler = requestMessage.StartHandler();
            //Logger.Info("msgs:"+JsonConvert.SerializeObject(Messages));

            //1、文字消息回复
            var textResponseMessage = base.CreateResponseMessage <ResponseMessageText>();

            foreach (var keyWord in Messages.KeyWords)
            {
                if (keyWord.Key == "默认")
                {
                    requestHandler.Default(() =>
                    {
                        textResponseMessage.Content = keyWord.Value;
                        return(textResponseMessage);
                    });
                }
                else
                {
                    //如果有逗号表示数组
                    if (keyWord.Key.Contains(','))
                    {
                        requestHandler.Keywords(keyWord.Key.Split(','), () =>
                        {
                            textResponseMessage.Content = keyWord.Value;
                            return(textResponseMessage);
                        });
                    }
                    //表示关键字
                    else
                    {
                        requestHandler.Keyword(keyWord.Key, () =>
                        {
                            textResponseMessage.Content = keyWord.Value;
                            return(textResponseMessage);
                        });
                    }
                }
            }

            //2、图文消息回复
            var newsResponseMessage = base.CreateResponseMessage <ResponseMessageNews>();

            foreach (var keyWordPic in Messages.KeyWordsPic)
            {
                if (keyWordPic.Key == "默认")//注意: 如果配置了文字默认回复,则图文不会被回复
                {
                    requestHandler.Default(() =>
                    {
                        newsResponseMessage.ArticleCount = 1;
                        newsResponseMessage.Articles.Add(keyWordPic.Value);
                        return(newsResponseMessage);
                    });
                }
                else
                {
                    //如果有逗号表示数组
                    if (keyWordPic.Key.Contains(','))
                    {
                        requestHandler.Keywords(keyWordPic.Key.Split(','), () =>
                        {
                            newsResponseMessage.ArticleCount = 1;
                            newsResponseMessage.Articles.Add(keyWordPic.Value);
                            return(newsResponseMessage);
                        });
                    }
                    //表示关键字
                    else
                    {
                        requestHandler.Keyword(keyWordPic.Key, () =>
                        {
                            newsResponseMessage.ArticleCount = 1;
                            newsResponseMessage.Articles.Add(keyWordPic.Value);
                            return(newsResponseMessage);
                        });
                    }
                }
            }

            //3、没有配置则默认 不回复任何消息
            //return new SuccessResponseMessage();

            return(requestHandler.GetResponseMessage() as IResponseMessageBase);
        }
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
        //  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
        //  <CreateTime>1357986928</CreateTime>
        //  <MsgType><![CDATA[text]]></MsgType>
        //  <Content><![CDATA[中文]]></Content>
        //  <MsgId>5832509444155992350</MsgId>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                case RequestMsgType.Text:
                    requestMessage = new RequestMessageText();
                    break;

                case RequestMsgType.Location:
                    requestMessage = new RequestMessageLocation();
                    break;

                case RequestMsgType.Image:
                    requestMessage = new RequestMessageImage();
                    break;

                case RequestMsgType.Voice:
                    requestMessage = new RequestMessageVoice();
                    break;

                case RequestMsgType.Video:
                    requestMessage = new RequestMessageVideo();
                    break;

                case RequestMsgType.Link:
                    requestMessage = new RequestMessageLink();
                    break;

                case RequestMsgType.ShortVideo:
                    requestMessage = new RequestMessageShortVideo();
                    break;

                case RequestMsgType.Event:
                    //判断Event类型
                    switch (doc.Root.Element("Event").Value.ToUpper())
                    {
                    case "ENTER":        //进入会话
                        requestMessage = new RequestMessageEvent_Enter();
                        break;

                    case "LOCATION":        //地理位置
                        requestMessage = new RequestMessageEvent_Location();
                        break;

                    case "SUBSCRIBE":        //订阅(关注)
                        requestMessage = new RequestMessageEvent_Subscribe();
                        break;

                    case "UNSUBSCRIBE":        //取消订阅(关注)
                        requestMessage = new RequestMessageEvent_Unsubscribe();
                        break;

                    case "CLICK":        //菜单点击
                        requestMessage = new RequestMessageEvent_Click();
                        break;

                    case "SCAN":        //二维码扫描
                        requestMessage = new RequestMessageEvent_Scan();
                        break;

                    case "VIEW":        //URL跳转
                        requestMessage = new RequestMessageEvent_View();
                        break;

                    case "MASSSENDJOBFINISH":
                        requestMessage = new RequestMessageEvent_MassSendJobFinish();
                        break;

                    case "TEMPLATESENDJOBFINISH":        //模板信息
                        requestMessage = new RequestMessageEvent_TemplateSendJobFinish();
                        break;

                    case "SCANCODE_PUSH":        //扫码推事件(scancode_push)
                        requestMessage = new RequestMessageEvent_Scancode_Push();
                        break;

                    case "SCANCODE_WAITMSG":        //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                        requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                        break;

                    case "PIC_SYSPHOTO":        //弹出系统拍照发图(pic_sysphoto)
                        requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                        break;

                    case "PIC_PHOTO_OR_ALBUM":        //弹出拍照或者相册发图(pic_photo_or_album)
                        requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                        break;

                    case "PIC_WEIXIN":        //弹出微信相册发图器(pic_weixin)
                        requestMessage = new RequestMessageEvent_Pic_Weixin();
                        break;

                    case "LOCATION_SELECT":        //弹出地理位置选择器(location_select)
                        requestMessage = new RequestMessageEvent_Location_Select();
                        break;

                    case "CARD_PASS_CHECK":        //卡券通过审核
                        requestMessage = new RequestMessageEvent_Card_Pass_Check();
                        break;

                    case "CARD_NOT_PASS_CHECK":        //卡券未通过审核
                        requestMessage = new RequestMessageEvent_Card_Not_Pass_Check();
                        break;

                    case "USER_GET_CARD":        //领取卡券
                        requestMessage = new RequestMessageEvent_User_Get_Card();
                        break;

                    case "USER_DEL_CARD":        //删除卡券
                        requestMessage = new RequestMessageEvent_User_Del_Card();
                        break;

                    case "KF_CREATE_SESSION":        //多客服接入会话
                        requestMessage = new RequestMessageEvent_Kf_Create_Session();
                        break;

                    case "KF_CLOSE_SESSION":        //多客服关闭会话
                        requestMessage = new RequestMessageEvent_Kf_Close_Session();
                        break;

                    case "KF_SWITCH_SESSION":        //多客服转接会话
                        requestMessage = new RequestMessageEvent_Kf_Switch_Session();
                        break;

                    case "POI_CHECK_NOTIFY":        //审核结果事件推送
                        requestMessage = new RequestMessageEvent_Poi_Check_Notify();
                        break;

                    case "WIFICONNECTED":        //Wi-Fi连网成功事件
                        requestMessage = new RequestMessageEvent_WifiConnected();
                        break;

                    case "USER_CONSUME_CARD":        //卡券核销
                        requestMessage = new RequestMessageEvent_User_Consume_Card();
                        break;

                    case "USER_ENTER_SESSION_FROM_CARD":        //从卡券进入公众号会话
                        requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card();
                        break;

                    case "USER_VIEW_CARD":        //进入会员卡
                        requestMessage = new RequestMessageEvent_User_View_Card();
                        break;

                    case "MERCHANT_ORDER":        //微小店订单付款通知
                        requestMessage = new RequestMessageEvent_Merchant_Order();
                        break;

                    case "SUBMIT_MEMBERCARD_USER_INFO":        //接收会员信息事件通知
                        requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info();
                        break;

                    case "SHAKEAROUNDUSERSHAKE":        //摇一摇事件通知
                        requestMessage = new RequestMessageEvent_ShakearoundUserShake();
                        break;

                    default:        //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                default:
                    throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
                EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;
            ThirdPartyInfo     infoType;

            //区分普通消息与第三方应用授权推送消息,MsgType有值说明是普通消息,反之则是第三方应用授权推送消息
            if (doc.Root.Element("MsgType") != null)
            {
                //常规推送信息
                try
                {
                    msgType = MsgTypeHelper.GetRequestMsgType(doc);

                    switch (msgType)
                    {
                    case RequestMsgType.Text:
                        requestMessage = new RequestMessageText();
                        break;

                    case RequestMsgType.Location:
                        requestMessage = new RequestMessageLocation();
                        break;

                    case RequestMsgType.Image:
                        requestMessage = new RequestMessageImage();
                        break;

                    case RequestMsgType.Voice:
                        requestMessage = new RequestMessageVoice();
                        break;

                    case RequestMsgType.Video:
                        requestMessage = new RequestMessageVideo();
                        break;

                    case RequestMsgType.ShortVideo:
                        requestMessage = new RequestMessageShortVideo();
                        break;

                    case RequestMsgType.Event:
                        //判断Event类型
                        switch (doc.Root.Element("Event").Value.ToUpper())
                        {
                        case "CLICK":        //菜单点击
                            requestMessage = new RequestMessageEvent_Click();
                            break;

                        case "VIEW":        //URL跳转
                            requestMessage = new RequestMessageEvent_View();
                            break;

                        case "SUBSCRIBE":        //订阅(关注)
                            requestMessage = new RequestMessageEvent_Subscribe();
                            break;

                        case "UNSUBSCRIBE":        //取消订阅(关注)
                            requestMessage = new RequestMessageEvent_UnSubscribe();
                            break;

                        case "SCANCODE_PUSH":        //扫码推事件(scancode_push)
                            requestMessage = new RequestMessageEvent_Scancode_Push();
                            break;

                        case "SCANCODE_WAITMSG":        //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                            requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                            break;

                        case "PIC_SYSPHOTO":        //弹出系统拍照发图(pic_sysphoto)
                            requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                            break;

                        case "PIC_PHOTO_OR_ALBUM":        //弹出拍照或者相册发图(pic_photo_or_album)
                            requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                            break;

                        case "PIC_WEIXIN":        //弹出微信相册发图器(pic_weixin)
                            requestMessage = new RequestMessageEvent_Pic_Weixin();
                            break;

                        case "LOCATION_SELECT":        //弹出地理位置选择器(location_select)
                            requestMessage = new RequestMessageEvent_Location_Select();
                            break;

                        case "LOCATION":        //上报地理位置事件(location)
                            requestMessage = new RequestMessageEvent_Location();
                            break;

                        case "ENTER_AGENT":        //用户进入应用的事件推送(enter_agent)
                            requestMessage = new RequestMessageEvent_Enter_Agent();
                            break;

                        case "BATCH_JOB_RESULT":        //异步任务完成事件推送(batch_job_result)
                            requestMessage = new RequestMessageEvent_Batch_Job_Result();
                            break;

                        default:        //其他意外类型(也可以选择抛出异常)
                            requestMessage = new RequestMessageEventBase();
                            break;
                        }
                        break;

                    default:
                        throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                    }
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
                }
            }
            else if (doc.Root.Element("InfoType") != null)
            {
                //第三方回调
                try
                {
                    infoType = MsgTypeHelper.GetThirdPartyInfo(doc);
                    switch (infoType)
                    {
                    case ThirdPartyInfo.SUITE_TICKET:    //推送suite_ticket协议
                        requestMessage = new RequestMessageInfo_Suite_Ticket();
                        break;

                    case ThirdPartyInfo.CHANGE_AUTH:    //变更授权的通知
                        requestMessage = new RequestMessageInfo_Change_Auth();
                        break;

                    case ThirdPartyInfo.CANCEL_AUTH:    //取消授权的通知
                        requestMessage = new RequestMessageInfo_Cancel_Auth();
                        break;

                    default:
                        throw new UnknownRequestMsgTypeException(string.Format("InfoType:{0} 在RequestMessageFactory中没有对应的处理程序!", infoType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                    }
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType和InfoType都不存在!,XML:{0}", doc.ToString()), ex);
                }
            }
            else
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType和InfoType都不存在!,XML:{0}", doc.ToString()));
            }

            return(requestMessage);
        }
        /// <summary>
        /// 获取请求XML
        /// </summary>
        /// <returns></returns>
        private XDocument GetrequestMessaageDoc(string url, string token, RequestMsgType requestType, Event?eventType)
        {
            RequestMessageBase requestMessaage = null;

            switch (requestType)
            {
            case RequestMsgType.Text:
                requestMessaage = new RequestMessageText()
                {
                    Content = Request.Form["Content"],
                };
                break;

            case RequestMsgType.Location:
                requestMessaage = new RequestMessageLocation()
                {
                    Label      = Request.Form["Label"],
                    Location_X = double.Parse(Request.Form["Location_X"]),
                    Location_Y = double.Parse(Request.Form["Location_Y"]),
                    Scale      = int.Parse(Request.Form["Scale"])
                };
                break;

            case RequestMsgType.Image:
                requestMessaage = new RequestMessageImage()
                {
                    PicUrl = Request.Form["PicUrl"],
                };
                break;

            case RequestMsgType.Voice:
                requestMessaage = new RequestMessageVoice()
                {
                    Format      = Request.Form["Format"],
                    Recognition = Request.Form["Recognition"],
                };
                break;

            case RequestMsgType.Video:
                requestMessaage = new RequestMessageVideo()
                {
                    MsgId        = long.Parse(Request.Form["MsgId"]),
                    ThumbMediaId = Request.Form["ThumbMediaId"],
                };
                break;

            //case RequestMsgType.Link:
            //    break;
            case RequestMsgType.Event:
                if (eventType.HasValue)
                {
                    RequestMessageEventBase requestMessageEvent = null;
                    switch (eventType.Value)
                    {
                    //case Event.ENTER:
                    //    break;
                    case Event.LOCATION:
                        requestMessageEvent = new RequestMessageEvent_Location()
                        {
                            Latitude  = long.Parse(Request.Form["Event.Latitude"]),
                            Longitude = long.Parse(Request.Form["Event.Longitude"]),
                            Precision = double.Parse(Request.Form["Event.Precision"])
                        };
                        break;

                    case Event.subscribe:
                        requestMessageEvent = new RequestMessageEvent_Subscribe()
                        {
                            EventKey = Request.Form["Event.EventKey"]
                        };
                        break;

                    case Event.unsubscribe:
                        requestMessageEvent = new RequestMessageEvent_Unsubscribe();
                        break;

                    case Event.CLICK:
                        requestMessageEvent = new RequestMessageEvent_Click()
                        {
                            EventKey = Request.Form["Event.EventKey"]
                        };
                        break;

                    case Event.scan:
                        requestMessageEvent = new RequestMessageEvent_Scan()
                        {
                            EventKey = Request.Form["Event.EventKey"],
                            Ticket   = Request.Form["Event.Ticket"]
                        }; break;

                    case Event.VIEW:
                        requestMessageEvent = new RequestMessageEvent_View()
                        {
                            EventKey = Request.Form["Event.EventKey"]
                        }; break;

                    case Event.MASSSENDJOBFINISH:
                        requestMessageEvent = new RequestMessageEvent_MassSendJobFinish()
                        {
                            FromUserName = "******",        //系统指定
                            ErrorCount   = int.Parse(Request.Form["Event.ErrorCount"]),
                            FilterCount  = int.Parse(Request.Form["Event.FilterCount"]),
                            SendCount    = int.Parse(Request.Form["Event.SendCount"]),
                            Status       = Request.Form["Event.Status"],
                            TotalCount   = int.Parse(Request.Form["Event.TotalCount"])
                        }; break;

                    default:
                        throw new ArgumentOutOfRangeException("eventType");
                    }
                    requestMessaage = requestMessageEvent;
                }
                else
                {
                    throw new ArgumentOutOfRangeException("eventType");
                }
                break;

            default:
                throw new ArgumentOutOfRangeException("requestType");
            }
            requestMessaage.MsgId        = long.Parse(Request.Form["MsgId"]);
            requestMessaage.CreateTime   = DateTime.Now;
            requestMessaage.FromUserName = requestMessaage.FromUserName ?? "FromUserName(OpenId)";//用于区别不同的请求用户
            requestMessaage.ToUserName   = "******";

            return(requestMessaage.ConvertEntityToXml());
        }
Exemple #14
0
        /// <summary>
        ///  处理文字请求 autor:lipu
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            IResponseMessageBase IR = null;
            int apiid = 0;

            try
            {
                //  var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
                string keywords = Utils.FilterSql(requestMessage.Content); //发送了文字信息
                apiid = wxcomm.getApiid();                                 //这里的appiid即为微帐号主键Id(wid)

                if (!wxcomm.ExistApiidAndWxId(apiid, requestMessage.ToUserName))
                {  //验证接收方是否为我们系统配置的帐号,即验证微帐号与微信原始帐号id是否一致,如果不一致,说明【1】配置错误,【2】数据来源有问题
                    wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "验证微帐号与微信原始帐号id不一致,说明【1】配置错误,【2】数据来源有问题", requestMessage.ToUserName);
                    return(wxcomm.GetResponseMessageTxtByContent(requestMessage, "验证微帐号与微信原始帐号id不一致,可能原因【1】系统配置错误,【2】非法的数据来源", apiid));
                }
                bool isExist = wxcomm.wxCodeLegal(apiid);
                if (!isExist)
                {
                    wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "账号已过期或已被禁用", requestMessage.ToUserName);
                    return(wxcomm.GetResponseMessageTxtByContent(requestMessage, "账号已过期或已被禁用!", apiid));
                }
                //如果自动回复已经关闭,则不返回内容,start
                if (!wxcomm.wxCloseKW(apiid))
                {
                    wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "等待客服", requestMessage.ToUserName);

                    return(wxcomm.GetResponseNoneContent(requestMessage));
                }
                //如果自动回复已经关闭,则不返回内容,end
                //人工客服的关键词(写死)
                if (requestMessage.Content == "人工客服" || requestMessage.Content == "员工客服")
                {
                    return(this.CreateResponseMessage <ResponseMessageTransfer_Customer_Service>());
                }


                int    responseType      = 0;
                string modelFunctionName = "";
                int    modelFunctionId   = 0;
                int    ruleId            = rBll.GetRuleIdByKeyWords(apiid, keywords, out responseType, out modelFunctionName, out modelFunctionId);
                if (ruleId <= 0 || responseType <= 0)
                {
                    wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "text", "未取到关键词对应的数据", requestMessage.ToUserName);
                    return(wxcomm.GetResponseMessageTxtByContent(requestMessage, "未找到匹配的关键词", apiid));
                }
                if (modelFunctionId > 0)
                {  //模块功能回复
                    return(wxcomm.GetModuleResponse(requestMessage, modelFunctionName, modelFunctionId, apiid));
                }
                switch (responseType)
                {
                case 1:
                    //发送纯文字
                    IR = wxcomm.GetResponseMessageTxt(requestMessage, ruleId, apiid);
                    break;

                case 2:
                    //发送多图文
                    IR = wxcomm.GetResponseMessageNews(requestMessage, ruleId, apiid);
                    break;

                case 3:
                    //发送语音
                    IR = wxcomm.GetResponseMessageeVoice(requestMessage, ruleId, apiid);
                    break;

                default:
                    break;
                }
                //  wxRequestBaseMgr.Add(apiid, requestMessage.MsgType.ToString(), requestMessage.FromUserName, requestMessage.CreateTime.ToString(), requestMessage.Content, requestMessage.ToString());

                string fStr = FilterTxtRequest(apiid, requestMessage.Content, requestMessage.FromUserName);
                if (fStr.Trim() != "")
                {
                    wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", fStr, requestMessage.ToUserName);
                    return(wxcomm.GetResponseMessageTxtByContent(requestMessage, fStr, apiid));
                }
            }
            catch (Exception ex)
            {
                WXLogs.AddErrLog(apiid, "用户请求文字", "CustomMessageHandler.OnTextRequest", "错误:" + ex.Message);
            }

            return(IR);
        }
Exemple #15
0
 /// <summary>
 /// 推送多图文
 /// update note 1:
 ///    李朴 2013-8-20 添加会员卡的cardno参数
 ///    注意:如果该会员注册过,则字符串没有cardno参数;
 ///    只有在会员注册过,在数据库里查询到该会员的cadno,则在url里添加节点cardno。
 /// </summary>
 /// <param name="requestMessage"></param>
 /// <param name="Indexid"></param>
 /// <returns></returns>
 public IResponseMessageBase GetResponseMessageNews(RequestMessageText requestMessage, int Indexid, int wid)
 {
     var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
     string openid = requestMessage.FromUserName;
     string token = ConvertDateTimeInt(DateTime.Now).ToString();
     List<Article> picTxtList = GetDataPicTxtComm(wid, Indexid, openid, token);
     if (picTxtList == null || picTxtList.Count <= 0)
     {
         DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "txtpic", "-1", requestMessage.ToUserName);
     }
     else
     {
         DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "txtpic", "这次发了" + picTxtList.Count + "条图文", requestMessage.ToUserName);
     }
     responseMessage.Articles.AddRange(picTxtList);
     return responseMessage;
 }
Exemple #16
0
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                case RequestMsgType.Text:
                    requestMessage = new RequestMessageText();
                    break;

                case RequestMsgType.Location:
                    requestMessage = new RequestMessageLocation();
                    break;

                case RequestMsgType.Image:
                    requestMessage = new RequestMessageImage();
                    break;

                case RequestMsgType.Voice:
                    requestMessage = new RequestMessageVoice();
                    break;

                case RequestMsgType.Video:
                    requestMessage = new RequestMessageVideo();
                    break;

                case RequestMsgType.Link:
                    requestMessage = new RequestMessageLink();
                    break;

                case RequestMsgType.Event:
                    //判断Event类型
                    switch (doc.Root.Element("Event").Value.ToUpper())
                    {
                    case "CLICK":        //菜单点击
                        requestMessage = new RequestMessageEvent_Click();
                        break;

                    case "VIEW":        //URL跳转
                        requestMessage = new RequestMessageEvent_View();
                        break;

                    default:        //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                default:
                    throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
                EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
Exemple #17
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四
            //var responseMessage =
            //    ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as
            //    ResponseMessageText;

            //方法二(v0.4)
            //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage);

            //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers;
            //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>();

            //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装
            //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。
            var responseMessage = base.CreateResponseMessage <ResponseMessageText>();

            if (requestMessage.Content == "约束")
            {
                responseMessage.Content = "<a href=\"http://weixin.senparc.com/FilterTest/\">点击这里</a>进行客户端约束测试(地址:http://weixin.senparc.com/FilterTest/)。";
            }
            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
            {
                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();
            }
            return(responseMessage);
        }
Exemple #18
0
 /// <summary>
 /// 文字类型请求
 /// </summary>
 public virtual async Task <IWorkResponseMessageBase> OnTextRequestAsync(RequestMessageText requestMessage)
 {
     return(await Task.Run(() => OnTextRequest(requestMessage)).ConfigureAwait(false));
 }
Exemple #19
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //说明:实际项目中这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            #region 书中例子
            //if (requestMessage.Content == "你好")
            //{
            //    var responseMessage = base.CreateResponseMessage<ResponseMessageNews>();
            //    var title = "Title";
            //    var description = "Description";
            //    var picUrl = "PicUrl";
            //    var url = "Url";
            //    responseMessage.Articles.Add(new Article()
            //    {
            //        Title = title,
            //        Description = description,
            //        PicUrl = picUrl,
            //        Url = url
            //    });
            //    return responseMessage;
            //}
            //else if (requestMessage.Content == "Senparc")
            //{
            //    //相似处理逻辑
            //}
            //else
            //{
            //    //...
            //}

            #endregion

            #region 历史方法

            //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四
            //var responseMessage =
            //    ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as
            //    ResponseMessageText;

            //方法二(v0.4)
            //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage);

            //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers;
            //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>();

            //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装
            //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。

            #endregion

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

            var requestHandler =
                requestMessage.StartHandler()
                //关键字不区分大小写,按照顺序匹配成功后将不再运行下面的逻辑
                .Keyword("约束", () =>
            {
                defaultResponseMessage.Content =
                    @"您正在进行微信内置浏览器约束判断测试。您可以:
<a href=""https://sdk.weixin.senparc.com/FilterTest/"">点击这里</a>进行客户端约束测试(地址:https://sdk.weixin.senparc.com/FilterTest/),如果在微信外打开将直接返回文字。
或:
<a href=""https://sdk.weixin.senparc.com/FilterTest/Redirect"">点击这里</a>进行客户端约束测试(地址:https://sdk.weixin.senparc.com/FilterTest/Redirect),如果在微信外打开将重定向一次URL。";
                return(defaultResponseMessage);
            })
                //匹配任一关键字
                .Keywords(new[] { "测试", "退出" }, () =>
            {
                /*
                 * 这是一个特殊的过程,此请求通常来自于微微嗨(http://www.weiweihi.com)的“盛派网络小助手”应用请求(https://www.weiweihi.com/User/App/Detail/1),
                 * 用于演示微微嗨应用商店的处理过程,由于微微嗨的应用内部可以单独设置对话过期时间,所以这里通常不需要考虑对话状态,只要做最简单的响应。
                 */
                if (requestMessage.Content == "测试")
                {
                    //进入APP测试
                    defaultResponseMessage.Content = "您已经进入测试程序,请发送任意信息进行测试。发送文字【退出】退出测试对话。10分钟内无任何交互将自动退出应用对话状态。";
                }
                else
                {
                    //退出APP测试
                    defaultResponseMessage.Content = "您已经退出测试程序。";
                }
                return(defaultResponseMessage);
            })
                .Keyword("容错", () =>
            {
                Thread.Sleep(4900);    //故意延时1.5秒,让微信多次发送消息过来,观察返回结果
                var faultTolerantResponseMessage     = requestMessage.CreateResponseMessage <ResponseMessageText>();
                faultTolerantResponseMessage.Content = string.Format("测试容错,MsgId:{0},Ticks:{1}", requestMessage.MsgId,
                                                                     SystemTime.Now.Ticks);
                return(faultTolerantResponseMessage);
            })
                .Keyword("TM", () =>
            {
                var openId    = requestMessage.FromUserName;
                var checkCode = Guid.NewGuid().ToString("n").Substring(0, 3);    //为了防止openId泄露造成骚扰,这里启用验证码
                TemplateMessageCollection[checkCode] = openId;
                defaultResponseMessage.Content       = string.Format(@"新的验证码为:{0},请在网页上输入。http://www.baidu.com", checkCode);
                return(defaultResponseMessage);
            })
                .Keyword("OPENID", () =>
            {
                var openId   = requestMessage.FromUserName;  //获取OpenId
                var userInfo = Senparc.Weixin.MP.AdvancedAPIs.UserApi.Info(appId, openId);

                defaultResponseMessage.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, (WeixinSex)userInfo.sex, userInfo.country, userInfo.province, userInfo.city, DateTimeHelper.GetDateTimeFromXml(userInfo.subscribe_time), userInfo.subscribe);
                return(defaultResponseMessage);
            })
                .Keyword("EX", () =>
            {
                var ex = new WeixinException("openid:" + requestMessage.FromUserName + ":这是一条测试异常信息");    //回调过程在global的ConfigWeixinTraceLog()方法中
                defaultResponseMessage.Content = "请等待异步模板消息发送到此界面上(自动延时数秒)。\r\n当前时间:" + SystemTime.Now.ToString();
                return(defaultResponseMessage);
            })
                .Keyword("MUTE", () => //不回复任何消息
            {
                //方案一:
                return(new SuccessResponseMessage());

                //方案二:
                var muteResponseMessage = base.CreateResponseMessage <ResponseMessageNoResponse>();
                return(muteResponseMessage);

                //方案三:
                base.TextResponseMessage = "success";
                return(null);

                //方案四:
                return(null);   //在 Action 中结合使用 return new FixWeixinBugWeixinResult(messageHandler);
            })
                .Keyword("JSSDK", () =>
            {
                defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/WeixinJsSdk";
                return(defaultResponseMessage);
            })


                ////选择菜单,关键字:101(微信服务器端最终格式:id="s:101",content="满意")
                //.SelectMenuKeyword("101", () =>
                //{
                //    defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!我们会一如既往为提高企业和开发者生产力而努力!";
                //    return defaultResponseMessage;
                //})
                ////选择菜单,关键字:102(微信服务器端最终格式:id="s:102",content="一般")
                //.SelectMenuKeyword("102", () =>
                //{
                //    defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!希望我们的服务能让您越来越满意!";
                //    return defaultResponseMessage;
                //})
                ////选择菜单,关键字:103(微信服务器端最终格式:id="s:103",content="不满意")
                //.SelectMenuKeyword("103", () =>
                //{
                //    defaultResponseMessage.Content = $"感谢您的评价({requestMessage.Content})!我们需要您的意见或建议,欢迎向我们反馈! <a href=\"https://github.com/JeffreySu/WeiXinMPSDK/issues/new\">点击这里</a>";
                //    return defaultResponseMessage;
                //})
                //.SelectMenuKeywords(new[] { "110", "111" }, () =>
                //{
                //    defaultResponseMessage.Content = $"这里只是演示,可以同时支持多个选择菜单";
                //    return defaultResponseMessage;
                //})

                //Default不一定要在最后一个
                .Default(() =>
            {
                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.ToString("HH:mm:ss"),
                                            historyMessage.MsgType.ToString(),
                                            (historyMessage is RequestMessageText)
                                    ? (historyMessage as RequestMessageText).Content
                                    : "[非文字类型]"
                                            );
                    }
                    result.AppendLine("\r\n");
                }

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

                defaultResponseMessage.Content = result.ToString();

                return(defaultResponseMessage);
            })
                //“一次订阅消息”接口测试
                //.Keyword("订阅", () =>
                //{
                //    defaultResponseMessage.Content = "点击打开:https://sdk.weixin.senparc.com/SubscribeMsg";
                //    return defaultResponseMessage;
                //})
                //正则表达式
                .Regex(@"^\d+#\d+$", () =>
            {
                defaultResponseMessage.Content = string.Format("您输入了:{0},符合正则表达式:^\\d+#\\d+$", requestMessage.Content);
                return(defaultResponseMessage);
            });

            return(requestHandler.GetResponseMessage() as IResponseMessageBase);
        }
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //书中例子
            //if (requestMessage.Content == "你好")
            //{
            //    var responseMessage = base.CreateResponseMessage<ResponseMessageNews>();
            //    var title = "Title";
            //    var description = "Description";
            //    var picUrl = "PicUrl";
            //    var url = "Url";
            //    responseMessage.Articles.Add(new Article()
            //    {
            //        Title = title,
            //        Description = description,
            //        PicUrl = picUrl,
            //        Url = url
            //    });
            //    return responseMessage;
            //}
            //else if (requestMessage.Content == "Senparc")
            //{
            //    //相似处理逻辑
            //}
            //else
            //{
            //    //...
            //}



            //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四
            //var responseMessage =
            //    ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as
            //    ResponseMessageText;

            //方法二(v0.4)
            //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage);

            //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers;
            //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>();

            //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装
            //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。


            //   ITextServiceBase itextService = TextServiceFactory.GetInstance(requestMessage);
            //   return itextService.Todo(requestMessage,this);

            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 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());
                 * 或
                 *
                 */
                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)的“盛派网络小助手”应用请求(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 if (requestMessage.Content == "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 == "你好")
            {
                var responseMessage2 = base.CreateResponseMessage <ResponseMessageNews>();
                var title            = "欢迎你";
                var description      = "欢迎你的测试";
                var picUrl           = "http://img.hotoem.com/Upload/Image/201608/4bc8330816bc4afb87336c36ddb4a95a.png";
                var url = "http://www.hotoem.com";
                responseMessage2.Articles.Add(new Article()
                {
                    Title       = title,
                    Description = description,
                    PicUrl      = picUrl,
                    Url         = url
                });
                return(responseMessage2);
            }
            else
            {
                var result = new StringBuilder();
                //result.AppendFormat("您刚才发送了文字信息:{0}\r\n\r\n", requestMessage.Content);
                //result.AppendLine("【自动回复】\r\n");
                //result.Append(WA.Common.Robot.GetReplyByRobot(requestMessage.Content).result.text);
                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);
        }
Exemple #21
0
        /// <summary>
        /// 获取请求XML
        /// </summary>
        /// <returns></returns>
        private XDocument GetrequestMessaageDoc(string url, string token, RequestMsgType requestType, Event?eventType)
        {
            Senparc.Weixin.MP.Entities.RequestMessageBase requestMessaage = null;
            switch (requestType)
            {
            case RequestMsgType.Text:
                requestMessaage = new RequestMessageText()
                {
                    Content = Request.Form["Content"],
                };
                break;

            case RequestMsgType.Location:
                requestMessaage = new RequestMessageLocation()
                {
                    Label      = Request.Form["Label"],
                    Location_X = double.Parse(Request.Form["Location_X"]),
                    Location_Y = double.Parse(Request.Form["Location_Y"]),
                    Scale      = int.Parse(Request.Form["Scale"])
                };
                break;

            case RequestMsgType.Image:
                requestMessaage = new RequestMessageImage()
                {
                    PicUrl = Request.Form["PicUrl"],
                };
                break;

            case RequestMsgType.Voice:
                requestMessaage = new RequestMessageVoice()
                {
                    Format      = Request.Form["Format"],
                    Recognition = Request.Form["Recognition"],
                };
                break;

            case RequestMsgType.Video:
                requestMessaage = new RequestMessageVideo()
                {
                    MsgId        = long.Parse(Request.Form["MsgId"]),
                    ThumbMediaId = Request.Form["ThumbMediaId"],
                };
                break;

            //case RequestMsgType.Link:
            //    break;
            case RequestMsgType.Event:
                if (eventType.HasValue)
                {
                    RequestMessageEventBase requestMessageEvent = null;
                    switch (eventType.Value)
                    {
                    //case Event.ENTER:
                    //    break;
                    case Event.LOCATION:
                        requestMessageEvent = new RequestMessageEvent_Location()
                        {
                            Latitude  = long.Parse(Request.Form["Event.Latitude"]),
                            Longitude = long.Parse(Request.Form["Event.Longitude"]),
                            Precision = double.Parse(Request.Form["Event.Precision"])
                        };
                        break;

                    case Event.subscribe:
                        requestMessageEvent = new RequestMessageEvent_Subscribe()
                        {
                            EventKey = Request.Form["Event.EventKey"],
                            Ticket   = Request.Form["Event.Ticket"]
                        };
                        break;

                    case Event.unsubscribe:
                        requestMessageEvent = new RequestMessageEvent_Unsubscribe();
                        break;

                    case Event.CLICK:
                        requestMessageEvent = new RequestMessageEvent_Click()
                        {
                            EventKey = Request.Form["Event.EventKey"]
                        };
                        break;

                    case Event.scan:
                        requestMessageEvent = new RequestMessageEvent_Scan()
                        {
                            EventKey = Request.Form["Event.EventKey"],
                            Ticket   = Request.Form["Event.Ticket"]
                        }; break;

                    case Event.VIEW:
                        requestMessageEvent = new RequestMessageEvent_View()
                        {
                            EventKey = Request.Form["Event.EventKey"]
                        }; break;

                    case Event.MASSSENDJOBFINISH:
                        requestMessageEvent = new RequestMessageEvent_MassSendJobFinish()
                        {
                            FromUserName = "******",        //系统指定
                            ErrorCount   = int.Parse(Request.Form["Event.ErrorCount"]),
                            FilterCount  = int.Parse(Request.Form["Event.FilterCount"]),
                            SentCount    = int.Parse(Request.Form["Event.SentCount"]),
                            Status       = Request.Form["Event.Status"],
                            TotalCount   = int.Parse(Request.Form["Event.TotalCount"])
                        }; break;

                    case Event.TEMPLATESENDJOBFINISH:
                        requestMessageEvent = new RequestMessageEvent_TemplateSendJobFinish()
                        {
                            FromUserName = "******",        //系统指定
                            MsgID        = long.Parse(Request.Form["Event.MsgID"]),
                            Status       = Request.Form["Event.Status"],
                        }; break;

                    case Event.scancode_push:
                        requestMessageEvent = new RequestMessageEvent_Scancode_Push()
                        {
                            FromUserName = "******",        //系统指定
                            EventKey     = Request.Form["Event.EventKey"],
                            ScanCodeInfo = new ScanCodeInfo()
                            {
                                ScanResult = Request.Form["Event.ScanResult"],
                                ScanType   = Request.Form["Event.ScanType"],
                            }
                        }; break;

                    case Event.scancode_waitmsg:
                        requestMessageEvent = new RequestMessageEvent_Scancode_Waitmsg()
                        {
                            FromUserName = "******",        //系统指定
                            EventKey     = Request.Form["Event.EventKey"],
                            ScanCodeInfo = new ScanCodeInfo()
                            {
                                ScanResult = Request.Form["Event.ScanResult"],
                                ScanType   = Request.Form["Event.ScanType"],
                            }
                        }; break;

                    case Event.pic_sysphoto:
                        var     sysphotoPicMd5Sum = Request.Form["Event.PicMd5Sum"];
                        PicItem sysphotoPicItem   = new PicItem()
                        {
                            item = new Md5Sum()
                            {
                                PicMd5Sum = sysphotoPicMd5Sum
                            }
                        };
                        List <PicItem> sysphotoPicItems = new List <PicItem>();
                        sysphotoPicItems.Add(sysphotoPicItem);
                        requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto()
                        {
                            FromUserName = "******",        //系统指定
                            EventKey     = Request.Form["Event.EventKey"],
                            SendPicsInfo = new SendPicsInfo()
                            {
                                Count   = Request.Form["Event.Count"],
                                PicList = sysphotoPicItems
                            }
                        }; break;

                    case Event.pic_photo_or_album:
                        var     photoOrAlbumPicMd5Sum = Request.Form["Event.PicMd5Sum"];
                        PicItem photoOrAlbumPicItem   = new PicItem()
                        {
                            item = new Md5Sum()
                            {
                                PicMd5Sum = photoOrAlbumPicMd5Sum
                            }
                        };
                        List <PicItem> photoOrAlbumPicItems = new List <PicItem>();
                        photoOrAlbumPicItems.Add(photoOrAlbumPicItem);
                        requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto()
                        {
                            FromUserName = "******",        //系统指定
                            EventKey     = Request.Form["Event.EventKey"],
                            SendPicsInfo = new SendPicsInfo()
                            {
                                Count   = Request.Form["Event.Count"],
                                PicList = photoOrAlbumPicItems
                            }
                        }; break;

                    case Event.pic_weixin:
                        var     weixinPicMd5Sum = Request.Form["Event.PicMd5Sum"];
                        PicItem weixinPicItem   = new PicItem()
                        {
                            item = new Md5Sum()
                            {
                                PicMd5Sum = weixinPicMd5Sum
                            }
                        };
                        List <PicItem> weixinPicItems = new List <PicItem>();
                        weixinPicItems.Add(weixinPicItem);
                        requestMessageEvent = new RequestMessageEvent_Pic_Sysphoto()
                        {
                            FromUserName = "******",        //系统指定
                            EventKey     = Request.Form["Event.EventKey"],
                            SendPicsInfo = new SendPicsInfo()
                            {
                                Count   = Request.Form["Event.Count"],
                                PicList = weixinPicItems
                            }
                        }; break;

                    case Event.location_select:
                        requestMessageEvent = new RequestMessageEvent_Location_Select()
                        {
                            FromUserName     = "******",    //系统指定
                            EventKey         = Request.Form["Event.EventKey"],
                            SendLocationInfo = new SendLocationInfo()
                            {
                                Label      = Request.Form["Event.Label"],
                                Location_X = Request.Form["Event.Location_X"],
                                Location_Y = Request.Form["Event.Location_Y"],
                                Poiname    = Request.Form["Event.Poiname"],
                                Scale      = Request.Form["Event.Scale"],
                            }
                        }; break;

                    default:
                        throw new ArgumentOutOfRangeException("eventType");
                    }
                    requestMessaage = requestMessageEvent;
                }
                else
                {
                    throw new ArgumentOutOfRangeException("eventType");
                }
                break;

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

            requestMessaage.MsgId        = long.Parse(Request.Form["MsgId"]);
            requestMessaage.CreateTime   = DateTime.Now;
            requestMessaage.FromUserName = requestMessaage.FromUserName ?? "FromUserName(OpenId)";//用于区别不同的请求用户
            requestMessaage.ToUserName   = "******";

            return(requestMessaage.ConvertEntityToXml());
        }
        /// <summary>
        /// 获取请求消息和实体之间的映射结果
        /// </summary>
        /// <param name="requestMsgType"></param>
        /// <returns></returns>
        public override IWorkRequestMessageBase GetRequestEntityMappingResult(RequestMsgType requestMsgType, XDocument doc = null)
        {
            IWorkRequestMessageBase requestMessage;

            switch (requestMsgType)
            {
            case RequestMsgType.Text:
                requestMessage = new RequestMessageText();
                break;

            case RequestMsgType.Location:
                requestMessage = new RequestMessageLocation();
                break;

            case RequestMsgType.Image:
                requestMessage = new RequestMessageImage();
                break;

            case RequestMsgType.Voice:
                requestMessage = new RequestMessageVoice();
                break;

            case RequestMsgType.Video:
                requestMessage = new RequestMessageVideo();
                break;

            case RequestMsgType.ShortVideo:
                requestMessage = new RequestMessageShortVideo();
                break;

            case RequestMsgType.File:
                requestMessage = new RequestMessageFile();
                break;

            case RequestMsgType.Event:
                //判断Event类型
                switch (doc.Root.Element("Event").Value.ToUpper())
                {
                case "CLICK":        //菜单点击
                    requestMessage = new RequestMessageEvent_Click();
                    break;

                case "VIEW":        //URL跳转
                    requestMessage = new RequestMessageEvent_View();
                    break;

                case "SUBSCRIBE":        //订阅(关注)
                    requestMessage = new RequestMessageEvent_Subscribe();
                    break;

                case "UNSUBSCRIBE":        //取消订阅(关注)
                    requestMessage = new RequestMessageEvent_UnSubscribe();
                    break;

                case "SCANCODE_PUSH":        //扫码推事件(scancode_push)
                    requestMessage = new RequestMessageEvent_Scancode_Push();
                    break;

                case "SCANCODE_WAITMSG":        //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                    requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                    break;

                case "PIC_SYSPHOTO":        //弹出系统拍照发图(pic_sysphoto)
                    requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                    break;

                case "PIC_PHOTO_OR_ALBUM":        //弹出拍照或者相册发图(pic_photo_or_album)
                    requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                    break;

                case "PIC_WEIXIN":        //弹出微信相册发图器(pic_weixin)
                    requestMessage = new RequestMessageEvent_Pic_Weixin();
                    break;

                case "LOCATION_SELECT":        //弹出地理位置选择器(location_select)
                    requestMessage = new RequestMessageEvent_Location_Select();
                    break;

                case "LOCATION":        //上报地理位置事件(location)
                    requestMessage = new RequestMessageEvent_Location();
                    break;

                case "ENTER_AGENT":        //用户进入应用的事件推送(enter_agent)
                    requestMessage = new RequestMessageEvent_Enter_Agent();
                    break;

                case "BATCH_JOB_RESULT":        //异步任务完成事件推送(batch_job_result)
                    requestMessage = new RequestMessageEvent_Batch_Job_Result();
                    break;

                case "CHANGE_CONTACT":        //通讯录更改推送(change_contact)
                    switch (doc.Root.Element("ChangeType").Value.ToUpper())
                    {
                    case "CREATE_USER":
                        requestMessage = new RequestMessageEvent_Change_Contact_User_Create();
                        break;

                    case "UPDATE_USER":
                        requestMessage = new RequestMessageEvent_Change_Contact_User_Update();
                        break;

                    case "DELETE_USER":
                        requestMessage = new RequestMessageEvent_Change_Contact_User_Base();
                        break;

                    case "CREATE_PARTY":
                        requestMessage = new RequestMessageEvent_Change_Contact_Party_Create();
                        break;

                    case "UPDATE_PARTY":
                        requestMessage = new RequestMessageEvent_Change_Contact_Party_Update();
                        break;

                    case "DELETE_PARTY":
                        requestMessage = new RequestMessageEvent_Change_Contact_Party_Base();
                        break;

                    case "UPDATE_TAG":
                        requestMessage = new RequestMessageEvent_Change_Contact_Tag_Update();
                        break;

                    default:            //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                case "CHANGE_EXTERNAL_CONTACT":        //客户变更回调
                    switch (doc.Root.Element("ChangeType").Value.ToUpper())
                    {
                    case "ADD_EXTERNAL_CONTACT":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_Add();
                        break;

                    case "ADD_HALF_EXTERNAL_CONTACT":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_Add_Half();
                        break;

                    case "EDIT_EXTERNAL_CONTACT":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_Modified();
                        break;

                    case "DEL_EXTERNAL_CONTACT":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_Del();
                        break;

                    case "DEL_FOLLOW_USER":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_Del_FollowUser();
                        break;

                    case "MSG_AUDIT_APPROVED":
                        requestMessage = new RequestMessageEvent_Change_ExternalContact_MsgAudit();
                        break;

                    default:
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                case "CHANGE_EXTERNAL_CHAT":        //客户群变更事件推送
                    requestMessage = new RequestMessageEvent_Change_External_Chat();
                    break;

                default:        //其他意外类型(也可以选择抛出异常)
                    requestMessage = new RequestMessageEventBase();
                    break;
                }
                break;

            default:
                throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", requestMsgType), new ArgumentOutOfRangeException());    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
            }
            return(requestMessage);
        }
Exemple #23
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //这里可以进行数据库记录或处理

            //发送一条客服消息回复用户

            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];
                    string content        = null;
                    if (historyMessage is RequestMessageText)
                    {
                        content = (historyMessage as RequestMessageText).Content;
                    }
                    else if (historyMessage is RequestMessageEvent_UserEnterTempSession)
                    {
                        content = "[进入客服]";
                    }
                    else
                    {
                        content = string.Format("[非文字信息:{0}]", historyMessage.GetType().Name);
                    }

                    result.AppendFormat("{0} 【{1}】{2}\r\n",
                                        historyMessage.CreateTime.ToString("HH:mm:ss"),
                                        historyMessage.MsgType.ToString(),
                                        content
                                        );
                }
                result.AppendLine("\r\n");
            }

            //处理微信换行符识别问题
            var msg = result.ToString().Replace("\r\n", "\n");

            //使用微信公众号的接口,完美兼容
            Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);

            return(new SuccessResponseMessage());

            //和公众号一样回复XML是无效的:
            //            return new SuccessResponseMessage()
            //            {
            //                ReturnText = string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
            //<xml>
            //    <ToUserName><![CDATA[{0}]]></ToUserName>
            //    <FromUserName><![CDATA[{1}]]></FromUserName>
            //    <CreateTime>1357986928</CreateTime>
            //    <MsgType><![CDATA[text]]></MsgType>
            //    <Content><![CDATA[TNT2]]></Content>
            //</xml>",requestMessage.FromUserName,requestMessage.ToUserName)
            //            };
        }
Exemple #24
0
        /// <summary>
        ///  处理文字请求 autor:lipu
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //IResponseMessageBase IR = null;
            //int apiid = 0;
            //try
            //{

            //  //  var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            //    string keywords = Utils.FilterSql(requestMessage.Content); //发送了文字信息
            //    apiid = wxcomm.getApiid();//这里的appiid即为微帐号主键Id(wid)

            //    if (!wxcomm.ExistApiidAndWxId(apiid, requestMessage.ToUserName))
            //    {  //验证接收方是否为我们系统配置的帐号,即验证微帐号与微信原始帐号id是否一致,如果不一致,说明【1】配置错误,【2】数据来源有问题
            //        DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "验证微帐号与微信原始帐号id不一致,说明【1】配置错误,【2】数据来源有问题", requestMessage.ToUserName);
            //        return wxcomm.GetResponseMessageTxtByContent(requestMessage, "验证微帐号与微信原始帐号id不一致,可能原因【1】系统配置错误,【2】非法的数据来源", apiid);
            //    }
            //    bool isExist = wxcomm.wxCodeLegal(apiid);
            //    if (!isExist)
            //    {
            //        DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "账号已过期或已被禁用", requestMessage.ToUserName);
            //        return wxcomm.GetResponseMessageTxtByContent(requestMessage, "账号已过期或已被禁用!", apiid);
            //    }
            //    //如果自动回复已经关闭,则不返回内容,start
            //    if (!wxcomm.wxCloseKW(apiid))
            //    {
            //        DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", "等待客服", requestMessage.ToUserName);

            //        return wxcomm.GetResponseNoneContent(requestMessage);
            //    }
            //    //如果自动回复已经关闭,则不返回内容,end
            //   //人工客服的关键词(写死)
            //    if (requestMessage.Content == "人工客服" || requestMessage.Content == "员工客服")
            //    {
            //        return this.CreateResponseMessage<ResponseMessageTransfer_Customer_Service>();
            //    }

            //    int responseType = 0;
            //    string modelFunctionName = "";
            //    int  modelFunctionId = 0;
            //    int ruleId = rBll.GetRuleIdByKeyWords(apiid, keywords, out responseType, out modelFunctionName, out modelFunctionId);
            //    if (ruleId <= 0 || responseType<=0)
            //    {
            //        DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "text", "未取到关键词对应的数据", requestMessage.ToUserName);
            //        return  wxcomm.GetResponseMessageTxtByContent(requestMessage,"未找到匹配的关键词",apiid);
            //    }
            //    if (modelFunctionId > 0)
            //    {  //模块功能回复
            //        return wxcomm.GetModuleResponse(requestMessage, modelFunctionName, modelFunctionId, apiid);
            //    }
            //    switch (responseType)
            //    {
            //        case 1:
            //            //发送纯文字
            //            IR = wxcomm.GetResponseMessageTxt(requestMessage, ruleId, apiid);
            //            break;
            //        case 2:
            //            //发送多图文
            //            IR = wxcomm.GetResponseMessageNews(requestMessage, ruleId, apiid);
            //            break;
            //        case 3:
            //            //发送语音
            //            IR = wxcomm.GetResponseMessageeVoice(requestMessage, ruleId, apiid);
            //            break;
            //        default:
            //            break;
            //    }
            //   //  wxRequestBaseMgr.Add(apiid, requestMessage.MsgType.ToString(), requestMessage.FromUserName, requestMessage.CreateTime.ToString(), requestMessage.Content, requestMessage.ToString());

            //    string fStr = FilterTxtRequest(apiid, requestMessage.Content, requestMessage.FromUserName);
            //    if (fStr.Trim() != "")
            //    {
            //        DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "none", fStr, requestMessage.ToUserName);
            //        return wxcomm.GetResponseMessageTxtByContent(requestMessage, fStr, apiid);
            //    }

            //}
            //catch (Exception ex)
            //{

            //    WXLogs.AddErrLog(apiid, "用户请求文字", "CustomMessageHandler.OnTextRequest", "错误:" + ex.Message);

            //}

            //return IR;

            return null;
        }
        public override Senparc.Weixin.QY.Entities.IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            var responseMessage = base.CreateResponseMessage <ResponseMessageText>();

            responseMessage.Content = requestMessage.Content;
            return(responseMessage);
        }
Exemple #26
0
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[gh_a96a4a619366]]></ToUserName>
        //  <FromUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></FromUserName>
        //  <CreateTime>1357986928</CreateTime>
        //  <MsgType><![CDATA[text]]></MsgType>
        //  <Content><![CDATA[中文]]></Content>
        //  <MsgId>5832509444155992350</MsgId>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (msgType)
                {
                case RequestMsgType.Text:
                    requestMessage = new RequestMessageText();
                    break;

                case RequestMsgType.Location:
                    requestMessage = new RequestMessageLocation();
                    break;

                case RequestMsgType.Image:
                    requestMessage = new RequestMessageImage();
                    break;

                case RequestMsgType.Voice:
                    requestMessage = new RequestMessageVoice();
                    break;

                case RequestMsgType.Video:
                    requestMessage = new RequestMessageVideo();
                    break;

                case RequestMsgType.Link:
                    requestMessage = new RequestMessageLink();
                    break;

                case RequestMsgType.ShortVideo:
                    requestMessage = new RequestMessageShortVideo();
                    break;

                case RequestMsgType.File:
                    requestMessage = new RequestMessageFile();
                    break;

                case RequestMsgType.NeuChar:
                    requestMessage = new RequestMessageNeuChar();
                    break;

                case RequestMsgType.Event:
                    //判断Event类型
                    switch (doc.Root.Element("Event").Value.ToUpper())
                    {
                    case "ENTER":        //进入会话
                        requestMessage = new RequestMessageEvent_Enter();
                        break;

                    case "LOCATION":        //地理位置
                        requestMessage = new RequestMessageEvent_Location();
                        break;

                    case "SUBSCRIBE":        //订阅(关注)
                        requestMessage = new RequestMessageEvent_Subscribe();
                        break;

                    case "UNSUBSCRIBE":        //取消订阅(关注)
                        requestMessage = new RequestMessageEvent_Unsubscribe();
                        break;

                    case "CLICK":        //菜单点击
                        requestMessage = new RequestMessageEvent_Click();
                        break;

                    case "SCAN":        //二维码扫描
                        requestMessage = new RequestMessageEvent_Scan();
                        break;

                    case "VIEW":        //URL跳转
                        requestMessage = new RequestMessageEvent_View();
                        break;

                    case "MASSSENDJOBFINISH":
                        requestMessage = new RequestMessageEvent_MassSendJobFinish();
                        break;

                    case "TEMPLATESENDJOBFINISH":        //模板信息
                        requestMessage = new RequestMessageEvent_TemplateSendJobFinish();
                        break;

                    case "SCANCODE_PUSH":        //扫码推事件(scancode_push)
                        requestMessage = new RequestMessageEvent_Scancode_Push();
                        break;

                    case "SCANCODE_WAITMSG":        //扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                        requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                        break;

                    case "PIC_SYSPHOTO":        //弹出系统拍照发图(pic_sysphoto)
                        requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                        break;

                    case "PIC_PHOTO_OR_ALBUM":        //弹出拍照或者相册发图(pic_photo_or_album)
                        requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                        break;

                    case "PIC_WEIXIN":        //弹出微信相册发图器(pic_weixin)
                        requestMessage = new RequestMessageEvent_Pic_Weixin();
                        break;

                    case "LOCATION_SELECT":        //弹出地理位置选择器(location_select)
                        requestMessage = new RequestMessageEvent_Location_Select();
                        break;

                    case "CARD_PASS_CHECK":        //卡券通过审核
                        requestMessage = new RequestMessageEvent_Card_Pass_Check();
                        break;

                    case "CARD_NOT_PASS_CHECK":        //卡券未通过审核
                        requestMessage = new RequestMessageEvent_Card_Not_Pass_Check();
                        break;

                    case "USER_GET_CARD":        //领取卡券
                        requestMessage = new RequestMessageEvent_User_Get_Card();
                        break;

                    case "USER_DEL_CARD":        //删除卡券
                        requestMessage = new RequestMessageEvent_User_Del_Card();
                        break;

                    case "KF_CREATE_SESSION":        //多客服接入会话
                        requestMessage = new RequestMessageEvent_Kf_Create_Session();
                        break;

                    case "KF_CLOSE_SESSION":        //多客服关闭会话
                        requestMessage = new RequestMessageEvent_Kf_Close_Session();
                        break;

                    case "KF_SWITCH_SESSION":        //多客服转接会话
                        requestMessage = new RequestMessageEvent_Kf_Switch_Session();
                        break;

                    case "POI_CHECK_NOTIFY":        //审核结果事件推送
                        requestMessage = new RequestMessageEvent_Poi_Check_Notify();
                        break;

                    case "WIFICONNECTED":        //Wi-Fi连网成功事件
                        requestMessage = new RequestMessageEvent_WifiConnected();
                        break;

                    case "USER_CONSUME_CARD":        //卡券核销
                        requestMessage = new RequestMessageEvent_User_Consume_Card();
                        break;

                    case "USER_ENTER_SESSION_FROM_CARD":        //从卡券进入公众号会话
                        requestMessage = new RequestMessageEvent_User_Enter_Session_From_Card();
                        break;

                    case "USER_VIEW_CARD":        //进入会员卡
                        requestMessage = new RequestMessageEvent_User_View_Card();
                        break;

                    case "MERCHANT_ORDER":        //微小店订单付款通知
                        requestMessage = new RequestMessageEvent_Merchant_Order();
                        break;

                    case "SUBMIT_MEMBERCARD_USER_INFO":        //接收会员信息事件通知
                        requestMessage = new RequestMessageEvent_Submit_Membercard_User_Info();
                        break;

                    case "SHAKEAROUNDUSERSHAKE":        //摇一摇事件通知
                        requestMessage = new RequestMessageEvent_ShakearoundUserShake();
                        break;

                    case "USER_GIFTING_CARD":        //卡券转赠事件推送
                        requestMessage = new RequestMessageEvent_User_Gifting_Card();
                        break;

                    case "USER_PAY_FROM_PAY_CELL":        // 微信买单完成
                        requestMessage = new RequestMessageEvent_User_Pay_From_Pay_Cell();
                        break;

                    case "UPDATE_MEMBER_CARD":        // 会员卡内容更新事件:会员卡积分余额发生变动时
                        requestMessage = new RequestMessageEvent_Update_Member_Card();
                        break;

                    case "CARD_SKU_REMIND":        //卡券库存报警事件:当某个card_id的初始库存数大于200且当前库存小于等于100时
                        requestMessage = new RequestMessageEvent_Card_Sku_Remind();
                        break;

                    case "CARD_PAY_ORDER":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_Card_Pay_Order();
                        break;

                        #region 卡券回调
                    case "GIFTCARD_PAY_DONE":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_Pay_Done();
                        break;

                    case "GIFTCARD_SEND_TO_FRIEND":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_Send_To_Friend();
                        break;

                    case "GIFTCARD_USER_ACCEPT":        //券点流水详情事件:当商户朋友的券券点发生变动时
                        requestMessage = new RequestMessageEvent_GiftCard_User_Accept();
                        break;
                        #endregion

                        #region 微信认证事件推送
                    case "QUALIFICATION_VERIFY_SUCCESS":        //资质认证成功(此时立即获得接口权限)
                        requestMessage = new RequestMessageEvent_QualificationVerifySuccess();
                        break;

                    case "QUALIFICATION_VERIFY_FAIL":        //资质认证失败
                        requestMessage = new RequestMessageEvent_QualificationVerifyFail();
                        break;

                    case "NAMING_VERIFY_SUCCESS":        //名称认证成功(即命名成功)
                        requestMessage = new RequestMessageEvent_NamingVerifySuccess();
                        break;

                    case "NAMING_VERIFY_FAIL":        //名称认证失败(这时虽然客户端不打勾,但仍有接口权限)
                        requestMessage = new RequestMessageEvent_NamingVerifyFail();
                        break;

                    case "ANNUAL_RENEW":        //年审通知
                        requestMessage = new RequestMessageEvent_AnnualRenew();
                        break;

                    case "VERIFY_EXPIRED":        //认证过期失效通知
                        requestMessage = new RequestMessageEvent_VerifyExpired();
                        break;

                        #endregion

                        #region 小程序审核事件推送
                    case "WEAPP_AUDIT_SUCCESS":         //小程序审核成功
                        requestMessage = new RequestMessageEvent_WeAppAuditSuccess();
                        break;

                    case "WEAPP_AUDIT_FAIL":         //小程序审核失败
                        requestMessage = new RequestMessageEvent_WeAppAuditFail();
                        break;
                        #endregion

                    default:        //其他意外类型(也可以选择抛出异常)
                        requestMessage = new RequestMessageEventBase();
                        break;
                    }
                    break;

                default:
                {
                    requestMessage = new RequestMessageUnknownType()
                    {
                        RequestDocument = doc
                    };

                    #region v14.8.3 之前的方案,直接在这里抛出异常

                    /*
                     * throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                     */

                    #endregion

                    break;
                }
                }
                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
        public override async Task <IResponseMessageBase> OnTextRequestAsync(RequestMessageText requestMessage)
        {
            var defaultResponseMessage = base.CreateResponseMessage <ResponseMessageText>();
            IResponseMessageBase IR    = null;

            Common.MessageFunction cmfun = new Common.MessageFunction();
            int ruleId = 0;

            var requestHandler = await requestMessage.StartHandler().Default(async() =>
            {
                string keywords = requestMessage.Content;
                if (!string.IsNullOrEmpty(keywords))
                {
                    keywords = keywords.Trim();
                }

                var currentMessageContext = await base.GetCurrentMessageContext();

                //先精确匹配,再模糊匹配
                Core.WeixinRequestRule rule = Core.WeixinRequestRule.Find(Core.WeixinRequestRule._.Keywords == keywords & Core.WeixinRequestRule._.RequestType == (int)Core.WeixinRequestRule.XRequestType.Text);

                if (rule == null)
                {
                    //模糊匹配
                    IList <Core.WeixinRequestRule> listRule = Core.WeixinRequestRule.FindAll(Core.WeixinRequestRule._.RequestType == (int)Core.WeixinRequestRule.XRequestType.Text & Core.WeixinRequestRule._.IsLikeQuery == 1, null, null, 0, 0);
                    if (listRule != null && listRule.Count > 0)
                    {
                        int lenKeyword = keywords.Length;
                        foreach (var item in listRule)
                        {
                            if (lenKeyword >= item.Keywords.Length && keywords.IndexOf(item.Keywords) >= 0)
                            {
                                rule = item;//规则
                                break;
                            }
                        }
                    }
                }
                if (rule == null)
                {
                    Core.WeixinRequestRule notFindKeywordRule = Core.WeixinRequestRule.Find(Core.WeixinRequestRule._.RequestType == (int)Core.WeixinRequestRule.XRequestType.NotFindKeyword);
                    if (notFindKeywordRule == null)
                    {
                        //找不到规则
                        Core.WeixinResponseContent entity = new Core.WeixinResponseContent()
                        {
                            OpenId         = requestMessage.FromUserName,
                            RequestType    = requestMessage.MsgType.ToString(),
                            RequestContent = requestMessage.Content,
                            ResponseType   = "none",
                            ReponseContent = "未取到关键词对应的数据",
                            XmlContent     = requestMessage.ToUserName
                        };
                        entity.Insert();
                        return(cmfun.GetResponseMessageTxtByContent(requestMessage, "未找到匹配的关键词", 0));
                    }
                    else
                    {
                        ruleId = notFindKeywordRule.Id;
                        switch (notFindKeywordRule.ResponseType)
                        {
                        case (int)Core.WeixinRequestRule.XResponseType.Text:
                            //发送纯文字
                            IR = cmfun.GetResponseMessageTxt(requestMessage, ruleId, 0);
                            break;

                        case (int)Core.WeixinRequestRule.XResponseType.Image:
                            //发送多图文
                            IR = cmfun.GetResponseMessageNews(requestMessage, ruleId, 0);
                            break;

                        case (int)Core.WeixinRequestRule.XResponseType.Voice:
                            //发送语音
                            IR = cmfun.GetResponseMessageeMusic(requestMessage, ruleId, 0);
                            break;

                        case (int)Core.WeixinRequestRule.XResponseType.SingleImage:
                            IR = cmfun.GetResponseMessageSingleImagesContent(requestMessage, ruleId, 0);
                            break;

                        default:
                            break;
                        }
                        return(IR);
                    }
                }
                Core.WeixinResponseContent model = new Core.WeixinResponseContent()
                {
                    OpenId         = requestMessage.FromUserName,
                    RequestType    = requestMessage.MsgType.ToString(),
                    RequestContent = requestMessage.Content,
                    ResponseType   = Core.WeixinResponseContent.GetResponseType((int)requestMessage.MsgType),
                    ReponseContent = requestMessage.ToString(),
                    XmlContent     = string.Empty
                };
                model.Insert();


                return(IR);
            });

            return(requestHandler.GetResponseMessage() as IResponseMessageBase);
        }
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc)
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType msgType;
            ThirdPartyInfo infoType;

            //区分普通消息与第三方应用授权推送消息,MsgType有值说明是普通消息,反之则是第三方应用授权推送消息
            if (doc.Root.Element("MsgType") != null)
            {
                //常规推送信息
                try
                {
                    msgType = MsgTypeHelper.GetRequestMsgType(doc);

                    switch (msgType)
                    {
                        case RequestMsgType.Text:
                            requestMessage = new RequestMessageText();
                            break;
                        case RequestMsgType.Location:
                            requestMessage = new RequestMessageLocation();
                            break;
                        case RequestMsgType.Image:
                            requestMessage = new RequestMessageImage();
                            break;
                        case RequestMsgType.Voice:
                            requestMessage = new RequestMessageVoice();
                            break;
                        case RequestMsgType.Video:
                            requestMessage = new RequestMessageVideo();
                            break;
                        case RequestMsgType.ShortVideo:
                            requestMessage = new RequestMessageShortVideo();
                            break;
                        case RequestMsgType.Event:
                            //判断Event类型
                            switch (doc.Root.Element("Event").Value.ToUpper())
                            {
                                case "CLICK"://菜单点击
                                    requestMessage = new RequestMessageEvent_Click();
                                    break;
                                case "VIEW"://URL跳转
                                    requestMessage = new RequestMessageEvent_View();
                                    break;
                                case "SUBSCRIBE"://订阅(关注)
                                    requestMessage = new RequestMessageEvent_Subscribe();
                                    break;
                                case "UNSUBSCRIBE"://取消订阅(关注)
                                    requestMessage = new RequestMessageEvent_UnSubscribe();
                                    break;
                                case "SCANCODE_PUSH"://扫码推事件(scancode_push)
                                    requestMessage = new RequestMessageEvent_Scancode_Push();
                                    break;
                                case "SCANCODE_WAITMSG"://扫码推事件且弹出“消息接收中”提示框(scancode_waitmsg)
                                    requestMessage = new RequestMessageEvent_Scancode_Waitmsg();
                                    break;
                                case "PIC_SYSPHOTO"://弹出系统拍照发图(pic_sysphoto)
                                    requestMessage = new RequestMessageEvent_Pic_Sysphoto();
                                    break;
                                case "PIC_PHOTO_OR_ALBUM"://弹出拍照或者相册发图(pic_photo_or_album)
                                    requestMessage = new RequestMessageEvent_Pic_Photo_Or_Album();
                                    break;
                                case "PIC_WEIXIN"://弹出微信相册发图器(pic_weixin)
                                    requestMessage = new RequestMessageEvent_Pic_Weixin();
                                    break;
                                case "LOCATION_SELECT"://弹出地理位置选择器(location_select)
                                    requestMessage = new RequestMessageEvent_Location_Select();
                                    break;
                                case "LOCATION"://上报地理位置事件(location)
                                    requestMessage = new RequestMessageEvent_Location();
                                    break;
                                case "ENTER_AGENT"://用户进入应用的事件推送(enter_agent)
                                    requestMessage = new RequestMessageEvent_Enter_Agent();
                                    break;
                                case "BATCH_JOB_RESULT"://异步任务完成事件推送(batch_job_result)
                                    requestMessage = new RequestMessageEvent_Batch_Job_Result();
                                    break;
                                default://其他意外类型(也可以选择抛出异常)
                                    requestMessage = new RequestMessageEventBase();
                                    break;
                            }
                            break;
                        default:
                            throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                    }
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
                }
            }
            else if (doc.Root.Element("InfoType") != null)
            {
                //第三方回调
                try
                {
                    infoType = MsgTypeHelper.GetThirdPartyInfo(doc);
                    switch (infoType)
                    {
                        case ThirdPartyInfo.SUITE_TICKET://推送suite_ticket协议
                            requestMessage = new RequestMessageInfo_Suite_Ticket();
                            break;
                        case ThirdPartyInfo.CHANGE_AUTH://变更授权的通知
                            requestMessage = new RequestMessageInfo_Change_Auth();
                            break;
                        case ThirdPartyInfo.CANCEL_AUTH://取消授权的通知
                            requestMessage = new RequestMessageInfo_Cancel_Auth();
                            break;
                        case ThirdPartyInfo.CREATE_AUTH://授权成功推送auth_code事件
                            requestMessage = new RequestMessageInfo_Create_Auth();
                            break;
                        case ThirdPartyInfo.CONTACT_SYNC://通讯录变更通知
                            requestMessage = new RequestMessageInfo_Contact_Sync();
                            break;
                        default:
                            throw new UnknownRequestMsgTypeException(string.Format("InfoType:{0} 在RequestMessageFactory中没有对应的处理程序!", infoType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                    }
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType和InfoType都不存在!,XML:{0}", doc.ToString()), ex);
                }
            }
            else
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType和InfoType都不存在!,XML:{0}", doc.ToString()));
            }
            
            return requestMessage;
        }
Exemple #29
0
        /// <summary>
        /// 处理文字请求
        /// </summary>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs

            //书中例子
            //if (requestMessage.Content == "你好")
            //{
            //    var responseMessage = base.CreateResponseMessage<ResponseMessageNews>();
            //    var title = "Title";
            //    var description = "Description";
            //    var picUrl = "PicUrl";
            //    var url = "Url";
            //    responseMessage.Articles.Add(new Article()
            //    {
            //        Title = title,
            //        Description = description,
            //        PicUrl = picUrl,
            //        Url = url
            //    });
            //    return responseMessage;
            //}
            //else if (requestMessage.Content == "Senparc")
            //{
            //    //相似处理逻辑
            //}
            //else
            //{
            //    //...
            //}



            //方法一(v0.1),此方法调用太过繁琐,已过时(但仍是所有方法的核心基础),建议使用方法二到四
            //var responseMessage =
            //    ResponseMessageBase.CreateFromRequestMessage(RequestMessage, ResponseMsgType.Text) as
            //    ResponseMessageText;

            //方法二(v0.4)
            //var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(RequestMessage);

            //方法三(v0.4),扩展方法,需要using Senparc.Weixin.MP.Helpers;
            //var responseMessage = RequestMessage.CreateResponseMessage<ResponseMessageText>();

            //方法四(v0.6+),仅适合在HandlerMessage内部使用,本质上是对方法三的封装
            //注意:下面泛型ResponseMessageText即返回给客户端的类型,可以根据自己的需要填写ResponseMessageNews等不同类型。

            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
            {
                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);
        }
Exemple #30
0
        /// <summary>
        /// 模块功能回复【请求为‘文字’类型】
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="modelFunctionName"></param>
        /// <param name="modelFunctionId"></param>
        /// <param name="apiid"></param>
        /// <returns></returns>
        public IResponseMessageBase GetModuleResponse(RequestMessageText requestMessage, string modelFunctionName, int modelFunctionId, int apiid)
        {
            //string openid = requestMessage.FromUserName;
            //string token = ConvertDateTimeInt(DateTime.Now).ToString();

            //IList<ResponseContentEntity> responselist = new List<ResponseContentEntity>();

            //responselist = PanDuanMoudle(modelFunctionName, modelFunctionId, openid, apiid);
            //if (responselist == null || responselist.Count <= 0)
            //{
            //    var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
            //    responseMessage.Content = "【" + modelFunctionName + "】功能模块未获得到数据";
            //    return responseMessage;
            //}
            //Model.ReponseContentType responseType = responselist[0].rcType;
            //if (responseType == Model.ReponseContentType.text)
            //{
            //    var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);

            //    responseMessage.Content = responselist[0].rContent.ToString();
            //    DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "text", responseMessage.Content, requestMessage.ToUserName);
            //    return responseMessage;
            //}
            //else if (responseType == Model.ReponseContentType.txtpic)
            //{
            //    var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
            //    IList<Article> rArticlelist = new List<Article>();
            //    Article article = new Article();
            //    foreach (ResponseContentEntity response in responselist)
            //    {
            //        article = new Article();
            //        article.Title = response.rContent;
            //        article.Description = response.rContent2;
            //        article.Url = getWXApiUrl(response.detailUrl, token, openid) + getWxUrl_suffix();
            //        if (response.picUrl == null || response.picUrl.ToString().Trim() == "")
            //        {
            //            article.PicUrl = "";
            //        }
            //        else
            //        {
            //            if (!response.picUrl.Contains("http://"))
            //            {
            //                article.PicUrl = MyCommFun.getWebSite() + response.picUrl;
            //            }
            //            else
            //            {
            //                article.PicUrl = response.picUrl;
            //            }
            //        }
            //        rArticlelist.Add(article);

            //    }

            //    responseMessage.Articles.AddRange(rArticlelist);
            //    DependencyManager.Resolve<IResponseMessageLogRepository>().Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "txtpic", "这次发了" + rArticlelist.Count + "条图文", requestMessage.ToUserName);

            //    return responseMessage;

            //}
            //else
            //{
            //    return null;
            //}

            return null;
        }
Exemple #31
0
        //{
        //    例如可以这样实现:
        //    var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
        //    responseMessage.Content = "您发送的消息类型暂未被识别。";
        //    return responseMessage;
        //}

        /// <summary>
        /// 预处理文字或事件类型请求。
        /// 这个请求是一个比较特殊的请求,通常用于统一处理来自文字或菜单按钮的同一个执行逻辑,
        /// 会在执行OnTextRequest或OnEventRequest之前触发,具有以下一些特征:
        /// 1、如果返回null,则继续执行OnTextRequest或OnEventRequest
        /// 2、如果返回不为null,则终止执行OnTextRequest或OnEventRequest,返回最终ResponseMessage
        /// 3、如果是事件,则会将RequestMessageEvent自动转为RequestMessageText类型,其中RequestMessageText.Content就是RequestMessageEvent.EventKey
        /// </summary>
        public virtual IResponseMessageBase OnTextOrEventRequest(RequestMessageText requestMessage)
        {
            return(null);
        }
Exemple #32
0
        /// <summary>
        /// 返回空的
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="content"></param>
        /// <param name="wid"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseNoneContent(RequestMessageText requestMessage)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
            var locationService = new LocationService();

            //DependencyManager.Resolve<IResponseMessageLogRepository>().Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), requestMessage.Content, "text", "文字请求,推送纯粹文字,内容为:" + content, requestMessage.ToUserName);
            return responseMessage;
        }
 /// <summary>
 /// 文字请求的处理
 /// </summary>
 /// <param name="requestMessage"></param>
 /// <returns></returns>
 public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
 {
     return(null);
 }