/// <summary> /// 处理事件推送 /// </summary> /// <param name="request"></param> /// <returns></returns> protected virtual IWRespBase DoForRequest_Event(WReqEventBase request) { switch (request.Event) { case EventType.Subscribe: return(DoForRequest_Event_Subscribe(Request as WReqEventSubscribe)); case EventType.UnSubscribe: return(DoForRequest_Event_Unsubscribe(Request as WReqEventUnSubscribe)); case EventType.Scan: return(DoForRequest_Event_Scan(Request as WReqEventScan)); case EventType.Location: return(DoForRequest_Event_Location(Request as WReqEventLocation)); case EventType.Click: return(DoForRequest_Event_Click(Request as WReqEventClick)); case EventType.View: return(DoForRequest_Event_View(Request as WReqEventView)); case EventType.Masssendjobfinish: return(DoForRequest_Event_MasssendJobFinish(Request as WReqEventMasssendJobFinish)); case EventType.Card: return(DoForRequest_Event_Card(Request as WReqEventCard)); default: return(DoForRequest_Event_Undefine(request)); } }
public static IWReqBase GetRequestEntity(XDocument doc) { WReqBase request = null; try { if (doc.Root != null) { var xElement = doc.Root.Element("MsgType"); if (xElement != null) { var msgType = EnumHelper.ParseEnum(xElement.Value, WReqType.Text); switch (msgType) { case WReqType.Text: request = new WReqText(); break; case WReqType.Location: request = new WReqLocation(); break; case WReqType.Image: request = new WReqImage(); break; case WReqType.Voice: request = new WReqVoice(); break; case WReqType.Video: request = new WReqVideo(); break; case WReqType.Link: request = new WReqLink(); break; case WReqType.Event: //判断Event类型 var eventElement = doc.Root.Element("Event"); if (eventElement != null) { var eventType = EnumHelper.ParseEnum(eventElement.Value, EventType.UnDefine); switch (eventType) { case EventType.Subscribe: //订阅(关注) request = new WReqEventSubscribe(); break; case EventType.UnSubscribe: //取消订阅(关注) request = new WReqEventUnSubscribe(); break; case EventType.Scan: //二维码扫描 request = new WReqEventScan(); break; case EventType.Click: //菜单点击 request = new WReqEventClick(); break; case EventType.View: //Url跳转 request = new WReqEventView(); break; case EventType.Location: //地理位置上报 request = new WReqEventLocation(); break; case EventType.Masssendjobfinish: request = new WReqEventMasssendJobFinish(); break; case EventType.UnDefine: { if (eventElement.Value.ToLower().Contains("card")) { WReqEventCard cardRequest = new WReqEventCard(); cardRequest.EventKey = eventElement.Value.ToLower(); request = cardRequest; doc.Root.Element("Event").SetValue("Card"); break; } request = new WReqEventBase(); //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的Event{0},Xml:{1}", eventElement.Value, doc.ToString()); break; } default: //其他意外类型(也可以选择抛出异常) request = new WReqEventBase(); //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的Event{0},Xml:{1}", eventElement.Value, doc.ToString()); break; } } break; default: //为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常 //LogServices.WriteTxtLogEx("WRequestFactory", "未定义的MsgType{0},Xml:{1}", xElement.Value, doc.ToString()); throw new Exception(string.Format("MsgType:{0} 在RequestFactory中没有对应的处理程序!", msgType), new ArgumentOutOfRangeException()); } request.FillWithXml(doc); } } } catch (ArgumentException ex) { throw new Exception(string.Format("Request转换出错!可能是MsgType不存在!,XML:{0} ,错误信息:{1}", doc.ToString(SaveOptions.None), ex.Message), ex); } return(request); }
/// <summary> /// 处理事件推送--群发回执 /// </summary> /// <param name="request"></param> /// <returns></returns> protected virtual IWRespBase DoForRequest_Event_MasssendJobFinish(WReqEventBase request) { return(null); }
/// <summary> /// 处理事件推送--未定义 /// </summary> /// <param name="request"></param> /// <returns></returns> protected virtual IWRespBase DoForRequest_Event_Undefine(WReqEventBase request) { return(null); }
/// <summary> /// 执行微信请求 /// </summary> public void Execute() { if (CancelExcute) { return; } OnExecuting(); if (CancelExcute) { return; } if (Request == null) { return; } //重复推送信息处理,缓存回复30秒 var key = string.Format("xNet_Wx_Cache_{0}_{1}_{2}", Request.FromUserName, Request.CreateTime, Request.MsgId); var cache = HttpRuntime.Cache[key]; if (cache != null) { Response = cache as IWRespBase; return; } try { var enterkey = CheckGetEnterKey(); if (!string.IsNullOrWhiteSpace(enterkey)) { Response = DoForRequest_Enter(enterkey); } if (Response == null) { switch (Request.MsgType) { case WReqType.Text: var wReqText = Request as WReqText; Response = DoForRequest_Text(wReqText); break; case WReqType.Location: Response = DoForRequest_Location(Request as WReqLocation); break; case WReqType.Image: Response = DoForRequest_Image(Request as WReqImage); break; case WReqType.Voice: Response = DoForRequest_Voice(Request as WReqVoice); break; case WReqType.Link: Response = DoForRequest_Link(Request as WReqLink); break; case WReqType.Video: Response = DoForRequest_Video(Request as WReqVideo); break; case WReqType.Event: Response = DoForRequest_Event(Request as WReqEventBase); break; default: throw new Exception("未知的MsgType请求类型", null); } } if (Response == null) { bool needRequestDefault = true; if (Request.MsgType == WReqType.Event) //上报地理位置 不需要默认回复 { WReqEventBase wreqevent = Request as WReqEventBase; if (wreqevent != null && wreqevent.Event == EventType.Location) { needRequestDefault = false; } } if (needRequestDefault) { Response = DoForRequest_Default(Request as WReqBase); } } if (Response != null) { HttpRuntime.Cache.Insert(key, Response, null, DateTime.Now.AddSeconds(30), Cache.NoSlidingExpiration); } } catch (Exception ex) { throw new Exception("Execute Root:" + ex.Message); } finally { OnExecuted(); } }