Наследование: RequestMessageBase, IRequestMessageBase
 //<?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)
 {
     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.Link:
                 requestMessage = new RequestMessageLink();
                 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;
                     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;
 }
Пример #2
0
        Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig(); //站点配置

        #region 处理关注/取消/默认回复方法===========================
        /// <summary>
        /// 定阅事件的统一处理
        /// </summary>
        public IResponseMessageBase EventSubscribe(int type, RequestMessageEventBase requestMessage)
        {
            int accountId = GetAccountId(); //取得公众账户ID
            string EventName = "";

            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            if (!ExistsOriginalId(accountId, requestMessage.ToUserName))
            {
                //验证接收方是否为我们系统配置的帐号,即验证微帐号与微信原始帐号id是否一致,如果不一致,说明【1】配置错误,【2】数据来源有问题
                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "none", "未取到关键词对应的数据", requestMessage.ToUserName);
                return GetResponseMessageTxtByContent(requestMessage, "验证微帐号与微信原始帐号id不一致,可能原因【1】系统配置错误,【2】非法的数据来源", accountId);
            }


            int responseType = 0;
            int ruleId = new BLL.weixin_request_rule().GetRuleIdAndResponseType(accountId, "request_type=" + type, out responseType);
            if (ruleId <= 0 || responseType <= 0)
            {
                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "none", "未取到关键词对应的数据", requestMessage.ToUserName);
                return null;
            }

            IResponseMessageBase reponseMessage = null;
            switch (responseType)
            {
                case 1:
                    //发送纯文字
                    reponseMessage = GetResponseMessageTxt(requestMessage, ruleId, accountId);
                    break;
                case 2:
                    //发送多图文
                    reponseMessage = GetResponseMessageNews(requestMessage, ruleId, accountId);
                    break;
                case 3:
                    //发送语音
                    reponseMessage = GetResponseMessageeMusic(requestMessage, ruleId, accountId);
                    break;
                default:
                    break;
            }
            return reponseMessage;
        }
Пример #3
0
        public ResponseMessageBase GetResponseMessage(RequestMessageEventBase requestMessage)
        {
            ResponseMessageBase responseMessage = null;
            switch (requestMessage.Event)
            {
                case Event.ENTER:
                    {
                        var strongResponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage,
                                                                                                 ResponseMsgType.Text)
                                                    as ResponseMessageText;
                        strongResponseMessage.Content = "您刚才发送了ENTER事件请求。";
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.LOCATION:
                    throw new Exception("暂不可用");
                    break;
                case Event.subscribe://订阅
                    {
                        var strongResponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage,
                                                                                       ResponseMsgType.Text) as ResponseMessageText;

                        //获取Senparc.Weixin.MP.dll版本信息
                        var fileVersionInfo = FileVersionInfo.GetVersionInfo(HttpContext.Current.Server.MapPath("~/bin/Senparc.Weixin.MP.dll"));
                        var version = fileVersionInfo.FileVersion;
                        strongResponseMessage.Content = string.Format(
                            "欢迎关注【Senparc.Weixin.MP 微信公众平台SDK】,当前运行版本:v{0}。\r\n您还可以发送【位置】【图片】【语音】信息,查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com",
                            version);
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.unsubscribe://退订
                    {
                        //实际上用户无法收到非订阅账号的消息,所以这里可以随便写。
                        //unsubscribe事件的意义在于及时删除网站应用中已经记录的OpenID绑定,消除冗余数据。
                        var strongResponseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage,
                                                                                       ResponseMsgType.Text) as ResponseMessageText;
                        strongResponseMessage.Content = "有空再来";
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.CLICK://菜单点击事件,根据自己需要修改
                    throw new Exception("Demo中还没有加入CLICK的测试!");
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            return responseMessage;
        }
Пример #4
0
        public ResponseMessageBase GetResponseMessage(RequestMessageEventBase requestMessage)
        {
            ResponseMessageBase responseMessage = null;
            switch (requestMessage.Event)
            {
                case Event.ENTER:
                    {
                        var strongResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageText>();
                        strongResponseMessage.Content = "您刚才发送了ENTER事件请求。";
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.LOCATION:
                    throw new Exception("暂不可用");
                    //break;
                case Event.subscribe://订阅
                    {
                        var strongResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageText>();

                        //获取Senparc.Weixin.MP.dll版本信息
                        var fileVersionInfo = FileVersionInfo.GetVersionInfo(HttpContext.Current.Server.MapPath("~/bin/Senparc.Weixin.MP.dll"));
                        var version = fileVersionInfo.FileVersion;
                        strongResponseMessage.Content = string.Format(
                            "欢迎关注【XX公司微信平台】,当前运行版本:v{0}。\r\n您还可以发送【位置】【图片】【语音】信息,查看不同格式的回复。\r\nSDK官方地址:http://www.yubom.net",
                            version);
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.unsubscribe://退订
                    {
                        //实际上用户无法收到非订阅账号的消息,所以这里可以随便写。
                        //unsubscribe事件的意义在于及时删除网站应用中已经记录的OpenID绑定,消除冗余数据。
                        var strongResponseMessage = requestMessage.CreateResponseMessage<ResponseMessageText>();
                        strongResponseMessage.Content = "亲,有空再来!";
                        responseMessage = strongResponseMessage;
                        break;
                    }
                case Event.CLICK://菜单点击事件,根据自己需要修改
                    //这里的CLICK在此DEMO中不会被执行到,因为已经重写了OnEvent_ClickRequest
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }

            return responseMessage;         
        }
Пример #5
0
 /// <summary>
 /// Event事件类型请求
 /// </summary>
 public virtual IResponseMessageBase OnEventRequest(RequestMessageEventBase requestMessage)
 {
     var strongRequestMessage = RequestMessage as IRequestMessageEventBase;
     IResponseMessageBase responseMessage = null;
     switch (strongRequestMessage.Event)
     {
         case Event.ENTER:
             responseMessage = OnEvent_EnterRequest(RequestMessage as RequestMessageEvent_Enter);
             break;
         case Event.LOCATION:
             responseMessage = OnEvent_LocationRequest(RequestMessage as RequestMessageEvent_Location);//目前实际无效
             break;
         case Event.subscribe://订阅
             responseMessage = OnEvent_SubscribeRequest(RequestMessage as RequestMessageEvent_Subscribe);
             break;
         case Event.unsubscribe://退订
             responseMessage = OnEvent_UnsubscribeRequest(RequestMessage as RequestMessageEvent_Unsubscribe);
             break;
         case Event.CLICK:
             responseMessage = OnEvent_ClickRequest(RequestMessage as RequestMessageEvent_Click);
             break;
         default:
             throw new UnknownRequestMsgTypeException("未知的Event下属请求信息", null);
     }
     return responseMessage;
 }
Пример #6
0
        /// <summary>
        /// 推送纯文字
        /// 2013-9-12
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageTxtByContent(RequestMessageEventBase requestMessage, string content,int wid)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
            var locationService = new LocationService();
            responseMessage.Content = content;
            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }
            wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "text", "事件:推送纯粹的文字,内容为:" + content, requestMessage.ToUserName);

            return responseMessage;
        }
Пример #7
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.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;
                            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;
        }
Пример #8
0
        /// <summary>
        /// 推送纯文字
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageTxt(RequestMessageEventBase 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);

            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "text", responseMessage.Content, requestMessage.ToUserName);

            return responseMessage;
        }
Пример #9
0
        /// <summary>
        /// 2014-9-8新增抽奖功能
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="Indexid"></param>
        /// <param name="wid"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageTxt(RequestMessageEventBase requestMessage, int wid)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
            string openid = requestMessage.FromUserName;
            string token = ConvertDateTimeInt(DateTime.Now).ToString();
            responseMessage.Content = string.Format("感谢您参与本次活动,您的幸运号码为 WDS2014920{0} ,请凭本号码参与后续精彩活动!",getDataTxtComm(openid));

            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "text", responseMessage.Content, requestMessage.ToUserName);

            return responseMessage;
        }
Пример #10
0
        /// <summary>
        /// 处理语音请求
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageeMusic(RequestMessageEventBase requestMessage, int Indexid, int wid)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageMusic>(requestMessage);
            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            Model.wx_requestRuleContent model = getDataMusicComm(wid, Indexid);
            if (model == null)
            {

                wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "music", "-1", requestMessage.ToUserName);
            }
            else
            {
                responseMessage.Music.MusicUrl = model.mediaUrl;
                responseMessage.Music.Title = model.rContent;
                responseMessage.Music.Description = model.rContent2;
                wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "music", "音乐链接:" + model.mediaUrl + "|标题:" + model.rContent + "|描述:" + model.rContent2, requestMessage.ToUserName);

            }
            return responseMessage;
        }
Пример #11
0
        /// <summary>
        /// 推送多图文
        /// update note 1:
        ///    李朴 2013-8-20 添加会员卡的cardno参数
        ///    注意:如果该会员注册过,则字符串没有cardno参数;
        ///    只有在会员注册过,在数据库里查询到该会员的cadno,则在url里添加节点cardno。
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="Indexid"></param>
        /// <param name="wid">微帐号主键Id</param>
        /// <returns></returns>
        public IResponseMessageBase GetResponseMessageNews(RequestMessageEventBase 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);
            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            if (picTxtList == null || picTxtList.Count <= 0)
            {
                wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "txtpic", "-1", requestMessage.ToUserName);
            }
            else
            {
                wxResponseBaseMgr.Add(wid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "txtpic", "这次发了" + picTxtList.Count + "条图文", requestMessage.ToUserName);
            }

            responseMessage.Articles.AddRange(picTxtList);
            return responseMessage;
        }
Пример #12
0
        /// <summary>
        /// 推送纯文字
        /// </summary>
        public IResponseMessageBase GetResponseMessageTxt(RequestMessageEventBase requestMessage, int ruleId, int accountId)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
            string openid = requestMessage.FromUserName;
            string token = ConvertDateTimeInt(DateTime.Now).ToString();
            responseMessage.Content = new BLL.weixin_request_content().GetContent(ruleId);

            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "text", responseMessage.Content, requestMessage.ToUserName);

            return responseMessage;
        }
Пример #13
0
        /// <summary>
        /// 模块功能回复【请求为‘事件’类型】
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <param name="modelFunctionName"></param>
        /// <param name="modelFunctionId"></param>
        /// <param name="apiid"></param>
        /// <returns></returns>
        public IResponseMessageBase GetModuleResponse(RequestMessageEventBase requestMessage, string modelFunctionName, int modelFunctionId, int apiid)
        {
            string openid = requestMessage.FromUserName;
            string token = ConvertDateTimeInt(DateTime.Now).ToString();

            IList<Model.ResponseContentEntity> responselist = new List<Model.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();
                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 (Model.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);
                return responseMessage;
            }
            else
            {
                return null;
            }
        }
Пример #14
0
        private static readonly string _urlVote = ConfigurationManager.AppSettings["UrlVote"]; //投票大赛的地址

        #endregion Fields

        #region Methods

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

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

                        /*tim update by 2016-03-31*/
                        var rMessage = (RequestMessageText) requestMessage;
                        //回复手机号重新绑定到会员
                        var b = System.Text.RegularExpressions.Regex.IsMatch(rMessage.Content.Trim(),
                            @"^1[3|4|5|8][0-9]\d{8}$");
                        if (b)
                        {
                            var customerService =
                                ServiceLocatorFactory.GetServiceLocator().GetService<ICustomerManagementService>();
                            var result = customerService.RebindFans(new CustRebindFansModel
                            {
                                Openid = rMessage.FromUserName,
                                Mobile = rMessage.Content
                            });
                            LoggerFactories.CreateLogger()
                                .Write($"rebind result:{result.errcode}", TraceEventType.Information);
                        }
                        else
                        {
                            //处理投票活动消息
                            var result = HandleVote(rMessage.Content, requestMessage.FromUserName);
                            if (result)
                            {
                                return requestMessage;
                            }
                            CustomApi.SendText(AppID, requestMessage.FromUserName, "感谢您的回复,玖伍淘车会尽快回复您。");
                        }

                        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();
                                EntityHelper.FillEntityWithXml(requestMessage, doc);
                                var taskSubscribe = new Task(() =>
                                {
                                    service.GenerateWechatFriend(AppID, requestMessage.FromUserName, true);
                                });
                                taskSubscribe.Start();

                                var slogan = _slogan.Replace("\\n", Environment.NewLine);

                                //"\n\n&lt;a src=''&gt;点击参加玖伍淘车首届“/强绝代车王/强”微信自拍投票大赛&lt;a/&gt;";
                                var btnContent = ConfigurationManager.AppSettings["BtnContent"];

                                var tourl = $"https://open.weixin.qq.com/connect/oauth2/authorize?appid={AppID}&redirect_uri={_urlVote}&response_type=code&scope=snsapi_base&state=vote&connect_redirect=1#wechat_redirect";

                                btnContent = $"<a href=\"{tourl}\">{btnContent}</a>";
                                slogan = string.Concat(slogan, Environment.NewLine, btnContent);

                                CustomApi.SendText(AppID, requestMessage.FromUserName, slogan);

                                //判断是否扫描场景二维码关注
                                var xElement = doc.Root.Element("EventKey");
                                if (xElement != null && xElement.Value.Contains("qrscene_"))
                                {
                                    var code = xElement.Value.Replace("qrscene_", "");
                                    service.UpdateWechatFriendQrScene(requestMessage.FromUserName, code, AppID);
                                }
                                break;
                            case "UNSUBSCRIBE": //取消订阅(关注)
                                requestMessage = new RequestMessageEvent_Unsubscribe();
                                EntityHelper.FillEntityWithXml(requestMessage, doc);
                                service.UpdateWechatFriendUnSubscribe(AppID, requestMessage.FromUserName);

                                var activityservice = ServiceLocatorFactory.GetServiceLocator().GetService<IActivityManagementService>();
                                activityservice.UnSubscribe(AppID, requestMessage.FromUserName);

                                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();
                                var merchantOrderresult = (RequestMessageEvent_Merchant_Order) requestMessage;
                                EntityHelper.FillEntityWithXml(requestMessage, doc);
                                var orderresult = OrderApi.GetByIdOrder(AppID, merchantOrderresult.OrderId);
                                if (orderresult.errcode == ReturnCode.请求成功)
                                {
                                    var rewardsManagementService =
                                        ServiceLocatorFactory.GetServiceLocator()
                                            .GetService<IRewardsManagementService>();
                                    var wholesaleCouponresult =
                                        rewardsManagementService.WholesaleCoupon(new CouponBuyModel()
                                        {
                                            //ProductId = orderresult.order.product_id,
                                            //OrderId = orderresult.order.order_id,
                                            //Accountid = AppID,
                                            //Number = orderresult.order.product_count,
                                            //Openid = orderresult.order.buyer_openid
                                            Order = orderresult.order
                                        });
                                    var text = JsonConvert.SerializeObject(orderresult.order);
                                    var logresult =
                                        $"MERCHANT_ORDER:{text}    result:{JsonConvert.SerializeObject(wholesaleCouponresult)}";
                                    LoggerFactories.CreateLogger().Write(logresult, TraceEventType.Information);
                                }
                                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(
                            $"MsgType:{msgType} 在RequestMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException());
                    //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
            }
            catch (ArgumentException ex)
            {
                //throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
                LoggerFactories.CreateLogger()
                    .Write($"RequestMessage转换出错!可能是MsgType不存在!,XML:{doc}", TraceEventType.Error, ex);
            }
            return requestMessage;
        }
Пример #15
0
        /// <summary>
        /// 处理语音请求
        /// </summary>
        public IResponseMessageBase GetResponseMessageeMusic(RequestMessageEventBase requestMessage, int ruleId, int accountId)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageMusic>(requestMessage);
            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            Model.weixin_request_content model = new BLL.weixin_request_content().GetModel(ruleId);
            if (model == null)
            {

                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "music", "-1", requestMessage.ToUserName);
            }
            else
            {
                if (model.media_url.Contains("http://"))
                {
                    responseMessage.Music.MusicUrl = model.media_url;

                }
                else
                {
                    //因为安装目录是以/开头,所以去掉,以免出现双斜杆
                    responseMessage.Music.MusicUrl = siteConfig.weburl + "/" + siteConfig.webpath.Replace("/", "") + model.media_url;
                }
                responseMessage.Music.Title = model.title;
                responseMessage.Music.Description = model.content;
                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "music", "音乐链接:" + model.media_url + "|标题:" + model.title + "|描述:" + model.content, requestMessage.ToUserName);
            }
            return responseMessage;
        }
Пример #16
0
 /// <summary>
 /// 处理时间请求(这个方法一般不用重写,这里仅作为示例出现。除非需要在判断具体Event类型以外对Event信息进行统一操作
 /// </summary>
 /// <param name="requestMessage"></param>
 /// <returns></returns>
 public override IResponseMessageBase OnEventRequest(RequestMessageEventBase requestMessage)
 {
     var eventResponseMessage = base.OnEventRequest(requestMessage);//对于Event下属分类的重写方法,见:CustomerMessageHandler_Events.cs
     //TODO: 对Event信息进行统一操作
     return eventResponseMessage;
 }
        private IResponseMessageBase EventProcess(int type, RequestMessageEventBase requestMessage)
        {
            int apiid = wxcomm.getApiid();

            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            if (!wxcomm.ExistApiidAndWxId(apiid, requestMessage.ToUserName))
            {  //验证接收方是否为我们系统配置的帐号,即验证微帐号与微信原始帐号id是否一致,如果不一致,说明【1】配置错误,【2】数据来源有问题
                DAL.wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "none", "未取到关键词对应的数据", requestMessage.ToUserName);
                return wxcomm.GetResponseMessageTxtByContent(requestMessage, "验证微帐号与微信原始帐号id不一致,可能原因【1】系统配置错误,【2】非法的数据来源", apiid);
            }

            int responseType = 0;
            int rid = rBll.GetRuleIdAndResponseType(apiid, "reqestType=" + type, out responseType);  //取消关注
            if (rid <= 0 || responseType <= 0)
            {
                DAL.wxResponseBaseMgr.Add(apiid, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "none", "未取到关键词对应的数据", requestMessage.ToUserName);
                return null;
            }

            IResponseMessageBase reponseMessage = null;
            switch (responseType)
            {
                case 1:
                    //发送纯文字
                    reponseMessage = wxcomm.GetResponseMessageTxt(requestMessage, rid, apiid);
                    break;
                case 2:
                    //发送多图文
                    reponseMessage = wxcomm.GetResponseMessageNews(requestMessage, rid, apiid);
                    break;
                case 3:
                    //发送语音
                    reponseMessage = wxcomm.GetResponseMessageeMusic(requestMessage, rid, apiid);
                    break;
                default:
                    break;
            }

            return reponseMessage;
        }
Пример #18
0
        /// <summary>
        /// 推送多图文
        /// </summary>
        public IResponseMessageBase GetResponseMessageNews(RequestMessageEventBase requestMessage, int ruleId, int accountId)
        {
            var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
            string openid = requestMessage.FromUserName;
            string token = ConvertDateTimeInt(DateTime.Now).ToString();

            Article article;
            List<Article> artList = new List<Article>();
            IList<Model.weixin_request_content> twList = new BLL.weixin_request_content().GetModelList(10, ruleId, string.Empty);
            foreach (Model.weixin_request_content modelt in twList)
            {
                article = new Article();
                article.Title = modelt.title;
                article.Description = modelt.content;
                article.Url = GetWXApiUrl(modelt.link_url, token, openid);
                if (string.IsNullOrEmpty(modelt.img_url))
                {
                    article.PicUrl = string.Empty;
                }
                else
                {
                    if (modelt.img_url.Contains("http://"))
                    {
                        article.PicUrl = modelt.img_url;

                    }
                    else
                    {
                        //因为安装目录是以/开头,所以去掉,以免出现双斜杆
                        article.PicUrl = siteConfig.weburl + "/" + siteConfig.webpath.Replace("/", "") + modelt.img_url;
                    }
                }
                artList.Add(article);
            }

            string EventName = "";
            if (requestMessage.Event.ToString().Trim() != "")
            {
                EventName = requestMessage.Event.ToString();
            }
            else if (requestMessage.EventKey != null)
            {
                EventName += requestMessage.EventKey.ToString();
            }

            if (artList.Count == 0)
            {
                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "txtpic", "-1", requestMessage.ToUserName);
            }
            else
            {
                new BLL.weixin_response_content().Add(accountId, requestMessage.FromUserName, requestMessage.MsgType.ToString(), EventName, "txtpic", "这次发了" + artList.Count + "条图文", requestMessage.ToUserName);
            }
            responseMessage.Articles.AddRange(artList);
            return responseMessage;
        }