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); }
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)); }
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); }
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() 中根据去重等条件判断后进行添加 }
//<?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); }
//<?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); }
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)); }
//<?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); }
//<?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); }
//<?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); }
/// <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; }
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); }
/// <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); }
//<?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); }
/// <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}"); } }
//<?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); }
/// <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); }
/// <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); }