コード例 #1
0
        //<?xml version="1.0" encoding="utf-8"?>
        //<xml>
        //  <ToUserName><![CDATA[olPjZjsXuQPJoV0HlruZkNzKc91E]]></ToUserName>
        //  <FromUserName><![CDATA[gh_a96a4a619366]]></FromUserName>
        //  <CreateTime>63497820384</CreateTime>
        //  <MsgType>text</MsgType>
        //  <Content><![CDATA[您刚才发送了文字信息:中文
        //您还可以发送【位置】【图片】【语音】信息,查看不同格式的回复。
        //SDK官方地址:http://weixin.senparc.com]]></Content>
        //  <FuncFlag>0</FuncFlag>
        //</xml>

        /// <summary>
        /// 获取XDocument转换后的IResponseMessageBase实例(通常在反向读取日志的时候用到)。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IResponseMessageBase GetResponseEntity(XDocument doc)
        {
            ResponseMessageBase responseMessage = null;
            ResponseMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetResponseMsgType(doc);
                switch (msgType)
                {
                case ResponseMsgType.Text:
                    responseMessage = new ResponseMessageText();
                    break;

                case ResponseMsgType.News:
                    responseMessage = new ResponseMessageNews();
                    break;

                case ResponseMsgType.Music:
                    responseMessage = new ResponseMessageMusic();
                    break;

                default:
                    throw new UnknownRequestMsgTypeException(string.Format("MsgType:{0} 在ResponseMessageFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException());
                }
                EntityHelper.FillEntityWithXml(responseMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("ResponseMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(responseMessage);
        }
コード例 #2
0
        public static IRequestMessageBase GetRequestEntity(XDocument doc, PostModel postModel = null)
        {
            RequestMessageBase requestMessageBase = null;

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

                default:
                    throw new UnknownRequestMsgTypeException($"MsgType:{requestMsgType} 在RequestMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException());

                case RequestMsgType.Event:
                    break;
                }
                requestMessageBase.FillEntityWithXml(doc);
            }
            catch (ArgumentException inner)
            {
                throw new WeixinException($"RequestMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", inner);
            }
            return(requestMessageBase);
        }
コード例 #3
0
ファイル: QYWeiXinController.cs プロジェクト: Thn123/hmj
        public ActionResult Test()
        {
            string    sMsg = @"<xml><ToUserName><![CDATA[wx42c6025ff9bb2576]]></ToUserName>
<FromUserName><![CDATA[15021311065]]></FromUserName>
<CreateTime>1478775431</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<AgentID>0</AgentID>
<Event><![CDATA[unsubscribe]]></Event>
<EventKey><![CDATA[]]></EventKey>
</xml>";
            XDocument doc  = XmlHelper.LoadXML(sMsg);

            LogService.Fatal("msgType: " + JsonHelper.SerializeObject(doc));
            RequestMsgType msgType = MsgTypeHelper.GetRequestMsgType(doc);

            switch (msgType)
            {
            case RequestMsgType.Event:
                RequestEventMessage message = (RequestEventMessage)XmlHelper.Deserialize <RequestEventMessage>(sMsg);
                //成员关注、取消关注企业号的事件
                if (message.Event == "subscribe" || message.Event == "unsubscribe")
                {
                    var userId = message.FromUserName;

                    //关注状态: 1=已关注,2=已冻结,4=未关注
                    int status = message.Event == "subscribe" ? 1 : 4;
                    int rows   = EmployeeService.UpdateEmpStatus(userId, (byte)status);

                    LogService.Fatal("修改结果: " + rows);
                }
                break;
            }
            return(Content(sMsg));
        }
コード例 #4
0
ファイル: CustomMessageHandler.cs プロジェクト: wyh0395/Berry
        /// <summary>
        /// 未知消息类型默认消息
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public override IResponseMessageBase OnUnknownTypeRequest(RequestMessageUnknownType requestMessage)
        {
            var msgType = MsgTypeHelper.GetRequestMsgTypeString(requestMessage.RequestDocument);

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

            responseMessage.Content = "未知消息类型:" + msgType;

            return(responseMessage);
            //return base.OnUnknownTypeRequest(requestMessage);
        }
コード例 #5
0
        public void GetMsgTypeTest()
        {
            var doc    = XDocument.Parse(xml);
            var result = MsgTypeHelper.GetRequestMsgType(doc);

            Assert.AreEqual(RequestMsgType.Text, result);

            var result2 = MsgTypeHelper.GetRequestMsgType("image");

            Assert.AreEqual(RequestMsgType.Image, result2);
        }
コード例 #6
0
        public override async Task <IResponseMessageBase> OnUnknownTypeRequestAsync(RequestMessageUnknownType requestMessage)
        {
            /*
             * 此方法用于应急处理SDK没有提供的消息类型,
             * 原始XML可以通过requestMessage.RequestDocument(或this.RequestDocument)获取到。
             * 如果不重写此方法,遇到未知的请求类型将会抛出异常(v14.8.3 之前的版本就是这么做的)
             */
            var msgType         = MsgTypeHelper.GetRequestMsgTypeString(requestMessage.RequestDocument);
            var responseMessage = this.CreateResponseMessage <ResponseMessageText>();

            responseMessage.Content = "未知消息类型:" + msgType;
            return(responseMessage);
        }
コード例 #7
0
        public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel)
        {
            //进行加密判断并处理
            var postDataStr = postDataDocument.ToString();

            XDocument decryptDoc = postDataDocument;

            //if (postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            //{
            //    //使用了加密
            //    UsingEncryptMessage = true;
            //    EcryptRequestDocument = postDataDocument;

            //    WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
            //    string msgXml = null;
            //    var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

            //    //判断result类型
            //    if (result != 0)
            //    {
            //        //验证没有通过,取消执行
            //        CancelExcute = true;
            //        return null;
            //    }

            //    if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value))
            //    {
            //        //TODO:使用了兼容模式,进行验证即可
            //        UsingCompatibilityModelEncryptMessage = true;
            //    }

            //    decryptDoc = XDocument.Parse(msgXml);//完成解密
            //}

            var msgType = MsgTypeHelper.GetRequestMsgType(decryptDoc);

            if (msgType != RequestMsgType.NeuChar)
            {
                throw new MessageHandlerException("仅支持 NeuChar 类型请求");
            }

            RequestMessage = new RequestMessageNeuChar();
            if (UsingEncryptMessage)
            {
                RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value;
            }

            return(decryptDoc);

            //消息上下文记录将在 base.CommonInitialize() 中根据去重等条件判断后进行添加
        }
コード例 #8
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;
            int aaa;
            int bbb;

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

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

                case RequestMsgType.NeuChar:
                    requestMessage = new RequestMessageNeuChar();
                    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这个异常
                }
                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
コード例 #9
0
        public static IResponseMessageBase GetResponseEntity(XDocument doc)
        {
            ResponseMessageBase responseMessageBase = null;

            try
            {
                ResponseMsgType responseMsgType  = MsgTypeHelper.GetResponseMsgType(doc);
                ResponseMsgType responseMsgType2 = responseMsgType;
                throw new UnknownRequestMsgTypeException($"MsgType:{responseMsgType} 在ResponseMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException());
            }
            catch (ArgumentException inner)
            {
                throw new WeixinException($"ResponseMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", inner);
            }
        }
コード例 #10
0
ファイル: CustomMessageHandler.cs プロジェクト: soon14/vzan
        public override IResponseMessageBase OnUnknownTypeRequest(RequestMessageUnknownType requestMessage)
        {
            /*
             * 此方法用于应急处理SDK没有提供的消息类型,
             * 原始XML可以通过requestMessage.RequestDocument(或this.RequestDocument)获取到。
             * 如果不重写此方法,遇到未知的请求类型将会抛出异常(v14.8.3 之前的版本就是这么做的)
             */
            var msgType         = MsgTypeHelper.GetRequestMsgTypeString(requestMessage.RequestDocument);
            var responseMessage = this.CreateResponseMessage <ResponseMessageText>();

            responseMessage.Content = "未知消息类型:" + msgType;

            // WeixinTrace.SendCustomLog("未知请求消息类型", requestMessage.RequestDocument.ToString());//记录到日志中

            return(responseMessage);
        }
コード例 #11
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 <TMC>(TMC messageContext, XDocument doc, PostModel postModel = null)
            where TMC : class, IMessageContext <IRequestMessageBase, IResponseMessageBase>, new()
        {
            RequestMessageBase requestMessage = null;
            RequestMsgType     msgType;

            try
            {
                msgType = MsgTypeHelper.GetRequestMsgType(doc);

                requestMessage = messageContext.GetRequestEntityMappingResult(msgType, doc) as RequestMessageBase;

                Senparc.NeuChar.Helpers.EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
            }
            return(requestMessage);
        }
コード例 #12
0
        /// <summary>
        /// 从返回结果XML转换成IResponseMessageBase实体类(通常在反向读取日志的时候用到)。
        /// </summary>
        /// <returns></returns>
        public static IResponseMessageBase GetResponseEntity(XDocument doc)
        {
            ResponseMessageBase val = null;

            try
            {
                ResponseMsgType responseMsgType = MsgTypeHelper.GetResponseMsgType(doc);
                switch (responseMsgType)
                {
                case ResponseMsgType.Text:
                    val = new ResponseMessageText();
                    break;

                case ResponseMsgType.Image:
                    val = new ResponseMessageImage();
                    break;

                case ResponseMsgType.Voice:
                    val = new ResponseMessageVoice();
                    break;

                case ResponseMsgType.Video:
                    val = new ResponseMessageVideo();
                    break;

                case ResponseMsgType.Music:
                    val = new ResponseMessageMusic();
                    break;

                case ResponseMsgType.News:
                    val = new ResponseMessageNews();
                    break;
                }
                val.FillEntityWithXml <ResponseMessageBase>(doc);
                return(val);
            }
            catch (Exception ex)
            {
                throw new Exception($"ResponseMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", ex);
            }
        }
コード例 #13
0
        public static IRequestMessageBase GetRequestChatEntity(XDocument xml, string strAgentType)
        {
            RequestMessageChat requestMessage = new RequestMessageChat();

            var oAgentType = MsgTypeHelper.GetResponseAgentType(strAgentType);

            //switch (oAgentType)
            //{

            //    case AgentType.chat:
            //    case AgentType.kf_internal:
            //        EntityHelper.FillEntityWithXml(requestMessage, xml);
            //        break;
            //}

            EntityHelper.FillEntityWithXml(requestMessage, xml);

            //return GetRequestEntity(XDocument.Parse(xml));

            return(requestMessage);
        }
コード例 #14
0
ファイル: QYWeiXinController.cs プロジェクト: Thn123/hmj
        public ActionResult Index(string msg_signature, string timestamp, string nonce)
        {
            string sReqData = StreamHelper.Read(Request.InputStream);

            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt();
            string        sMsg  = "";

            int ret = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, sReqData, ref sMsg);

            if (ret != 0)
            {
                LogService.Fatal("ERR: VerifyURL fail, ret: " + ret);
            }
            //LogService.Fatal("解密后的数据: " + sMsg);

            XDocument      doc     = XmlHelper.LoadXML(sMsg);
            RequestMsgType msgType = MsgTypeHelper.GetRequestMsgType(doc);

            switch (msgType)
            {
            case RequestMsgType.Event:
                RequestEventMessage message = (RequestEventMessage)XmlHelper.Deserialize <RequestEventMessage>(sMsg);
                //成员关注、取消关注企业号的事件
                if (message != null && message.Event == "subscribe" || message.Event == "unsubscribe")
                {
                    var userId = message.FromUserName;

                    //关注状态: 1=已关注,2=已冻结,4=未关注
                    int status = message.Event == "subscribe" ? 1 : 4;
                    int rows   = EmployeeService.UpdateEmpStatus(userId, (byte)status);

                    //LogService.Fatal("修改结果: " + rows);
                }
                break;
            }

            return(Content(sMsg));
        }
コード例 #15
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;

                    case "APPLY_MERCHANT_AUDIT_INFO":        //创建门店小程序审核事件
                        requestMessage = new RequestMessageEvent_ApplyMerchantAuditInfo();
                        break;

                    case "CREATE_MAP_POI_AUDIT_INFO":        //从腾讯地图中创建门店审核事件
                        requestMessage = new RequestMessageEvent_CreateMapPoiAuditInfo();
                        break;

                    case "ADD_STORE_AUDIT_INFO":        //门店小程序中创建门店审核事件
                        requestMessage = new RequestMessageEvent_AddStoreAuditInfo();
                        break;

                    case "MODIFY_STORE_AUDIT_INFO":        //修改门店图片审核事件
                        requestMessage = new RequestMessageEvent_ModifyStoreAuditInfo();
                        break;

                    case "VIEW_MINIPROGRAM":        //微信点击菜单跳转小程序的事件推送的事件
                        requestMessage = new RequestMessageEvent_View_Miniprogram();
                        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);
        }
コード例 #16
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;

                    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);
        }
コード例 #17
0
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// </summary>
        /// <returns></returns>
        public static IRequestMessageBase GetRequestEntity(XDocument doc)
        {
            RequestMessageBase val            = null;
            RequestMsgType     requestMsgType = default(RequestMsgType);
            Event eventType = default(Event);

            try
            {
                requestMsgType = MsgTypeHelper.GetRequestMsgType(doc);
                switch (requestMsgType)
                {
                case RequestMsgType.text:
                    val = new RequestMessageText();
                    break;

                case RequestMsgType.location:
                    val = new RequestMessageLocation();
                    break;

                case RequestMsgType.image:
                    val = new RequestMessageImage();
                    break;

                case RequestMsgType.voice:
                    val = new RequestMessageVoice();
                    break;

                case RequestMsgType.video:
                    val = new RequestMessageVideo();
                    break;

                case RequestMsgType.link:
                    val = new RequestMessageLink();
                    break;

                case RequestMsgType.shortvideo:
                    val = new RequestMessageShortVideo();
                    break;

                case RequestMsgType.@event:
                    eventType = EventHelper.GetEventType(doc.Root.Element("Event").Value);

                    switch (eventType)
                    {
                    case Event.CLICK:
                        val = new RequestMessageEventClick();
                        break;

                    case Event.LOCATION:
                        val = new RequestMessageEventLocation();
                        break;

                    case Event.subscribe:
                        val = new RequestMessageEventSubscribe();
                        break;

                    case Event.scan:
                        val = new RequestMessageEventScan();
                        break;

                    case Event.unsubscribe:
                        val = new RequestMessageEventUnsubscribe();
                        break;

                    case Event.VIEW:
                        val = new RequestMessageEventView();
                        break;
                    }
                    break;
                }
                if (val == null)
                {
                    throw new Exception();
                }
                val.FillEntityWithXml <RequestMessageBase>(doc);
                return(val);
            }
            catch (Exception ex)
            {
                throw new Exception($"RequestMessage转换出错!可能是MsgType不存在!,requestMsgType:{requestMsgType},Event:{eventType}");
            }
        }
コード例 #18
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)
        {
            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 "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;

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

                default:
                    throw new UnknownRequestMsgTypeException(
                              $"MsgType:{msgType} 在RequestMessageFactory中没有对应的处理程序!", new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                }
                EntityHelper.FillEntityWithXml(requestMessage, doc);
            }
            catch (ArgumentException ex)
            {
                throw new WeixinException($"RequestMessage转换出错!可能是MsgType不存在!,XML:{doc.ToString()}", ex);
            }
            return(requestMessage);
        }
コード例 #19
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)
        {
            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 eventType = EventHelper.GetEventType(doc);
                    //判断Event类型
                    switch (eventType)
                    {
                    case Event.LOCATION:        //地理位置
                        requestMessage = new RequestMessageEvent_Location();
                        break;

                    case Event.subscribe:        //订阅(关注)
                        requestMessage = new RequestMessageEvent_Subscribe();
                        break;

                    case Event.unsubscribe:        //取消订阅(关注)
                        requestMessage = new RequestMessageEvent_Unsubscribe();
                        break;

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

                    case Event.scan:        //二维码扫描
                        requestMessage = new RequestMessageEvent_Scan();
                        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);
        }
コード例 #20
0
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IWorkRequestMessageBase GetRequestEntity <TMC>(TMC messageContext, XDocument doc)
            where TMC : class, IMessageContext <IWorkRequestMessageBase, IWorkResponseMessageBase>, new()
        {
            WorkRequestMessageBase requestMessage = null;
            RequestMsgType         msgType;
            ThirdPartyInfo         infoType;

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

                    //自动获取对应类型的 RequestMessage
                    requestMessage = messageContext.GetRequestEntityMappingResult(msgType, doc) as WorkRequestMessageBase;

                    ////特殊对象处理(不使用底层 EntityHelper)
                    //if (requestMessage is RequestMessageEvent_SysApprovalChange)
                    //{
                    //    var requestXml = doc.Root.ToString();
                    //    XmlUtility.Deserialize<RequestMessageEvent_SysApprovalChange>(requestXml);
                    //}

                    //将 XML 内容填充到 requestMessage 中
                    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 = Work.Helpers.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.CHANGE_CONTACT:    //通讯录变更通知
                        requestMessage = new RequestMessageInfo_Change_Contact();
                        break;

                    case ThirdPartyInfo.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 RequestMessageEvent_Change_ExternalContact_Base();
                            break;
                        }
                        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);
        }
コード例 #21
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.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;

                    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);
        }
コード例 #22
0
        public override XDocument Init(XDocument postDataDocument, IEncryptPostModel postModel)
        {
            //进行加密判断并处理
            var postDataStr = postDataDocument.ToString();

            XDocument decryptDoc = postDataDocument;

            //if (postModel != null && postDataDocument.Root.Element("Encrypt") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("Encrypt").Value))
            //{
            //    //使用了加密
            //    UsingEcryptMessage = true;
            //    EcryptRequestDocument = postDataDocument;

            //    WXBizMsgCrypt msgCrype = new WXBizMsgCrypt(_postModel.Token, _postModel.EncodingAESKey, _postModel.AppId);
            //    string msgXml = null;
            //    var result = msgCrype.DecryptMsg(_postModel.Msg_Signature, _postModel.Timestamp, _postModel.Nonce, postDataStr, ref msgXml);

            //    //判断result类型
            //    if (result != 0)
            //    {
            //        //验证没有通过,取消执行
            //        CancelExcute = true;
            //        return null;
            //    }

            //    if (postDataDocument.Root.Element("FromUserName") != null && !string.IsNullOrEmpty(postDataDocument.Root.Element("FromUserName").Value))
            //    {
            //        //TODO:使用了兼容模式,进行验证即可
            //        UsingCompatibilityModelEcryptMessage = true;
            //    }

            //    decryptDoc = XDocument.Parse(msgXml);//完成解密
            //}

            var msgType = MsgTypeHelper.GetRequestMsgType(decryptDoc);

            if (msgType != RequestMsgType.NeuChar)
            {
                throw new MessageHandlerException("仅支持 NeuChar 类型请求");
            }

            RequestMessage = new RequestMessageNeuChar();
            if (UsingEcryptMessage)
            {
                RequestMessage.Encrypt = postDataDocument.Root.Element("Encrypt").Value;
            }

            //TODO:分布式系统中本地的上下文会有同步问题,需要同步使用远程的储存
            if (MessageContextGlobalConfig.UseMessageContext)
            {
                //var omit = OmitRepeatedMessageFunc == null || OmitRepeatedMessageFunc(RequestMessage);

                var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance();
                using (cache.BeginCacheLock(MessageContextGlobalConfig.MESSAGE_CONTENT_OMIT_REPEAT_LOCK_NAME, "NeuCharAppMessageHandler"))//使用分布式缓存
                {
                    #region 消息去重

                    if (/*omit &&*/
                        OmitRepeatedMessage &&
                        CurrentMessageContext.RequestMessages.Count > 0
                        //&& !(RequestMessage is RequestMessageEvent_Merchant_Order)批量订单的MsgId可能会相同
                        )
                    {
                        //lastMessage必定有值(除非极端小的过期时间条件下,几乎不可能发生)
                        var lastMessage = CurrentMessageContext.RequestMessages[CurrentMessageContext.RequestMessages.Count - 1];

                        if (
                            //使用MsgId去重
                            (lastMessage.MsgId != 0 && lastMessage.MsgId == RequestMessage.MsgId) ||
                            //使用CreateTime去重(OpenId对象已经是同一个)
                            (lastMessage.MsgId == RequestMessage.MsgId &&
                             lastMessage.CreateTime == RequestMessage.CreateTime &&
                             lastMessage.MsgType == RequestMessage.MsgType)
                            )
                        {
                            MarkRepeatedMessage();//标记为已重复
                        }
                    }

                    #endregion

                    //在消息没有被去重的情况下记录上下文
                    if (!MessageIsRepeated)
                    {
                        GlobalMessageContext.InsertMessage(RequestMessage);
                    }
                }
            }

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

        /// <summary>
        /// 未知类型消息触发的事件,默认将抛出异常,建议进行重写
        /// </summary>
        /// <param name="requestMessage"></param>
        /// <returns></returns>
        public virtual IResponseMessageBase OnUnknownTypeRequest(RequestMessageUnknownType requestMessage)
        {
            var msgType = MsgTypeHelper.GetRequestMsgTypeString(requestMessage.RequestDocument);

            throw new UnknownRequestMsgTypeException("MsgType:{0} 在RequestMessageFactory中没有对应的处理程序!".FormatWith(msgType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
        }
コード例 #24
0
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IWorkRequestMessageBase GetRequestEntity<TMC>(TMC messageContext, XDocument doc)
            where TMC : class, IMessageContext<IWorkRequestMessageBase, IWorkResponseMessageBase>, new()
        {
            WorkRequestMessageBase requestMessage = null;
            RequestMsgType msgType;
            ThirdPartyInfo infoType;

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

                    messageContext.GetRequestEntityMappingResult(msgType, doc);
                    
                    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 = Work.Helpers.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.CHANGE_CONTACT://通讯录变更通知
                            requestMessage = new RequestMessageInfo_Change_Contact();
                            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;
        }
コード例 #25
0
        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IWorkRequestMessageBase GetRequestEntity(XDocument doc)
        {
            WorkRequestMessageBase 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.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;

                        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 = Work.Helpers.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.CHANGE_CONTACT:    //通讯录变更通知
                        requestMessage = new RequestMessageInfo_Change_Contact();
                        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);
        }
コード例 #26
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);
        }