/// <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 ActionResult Post(string token, string signature, string timestamp, string nonce, string echostr) { WX_ApiConfig config = WXApiConfigServices.QueryByToKen(token); if (config == null || string.IsNullOrWhiteSpace(config.AppId) || string.IsNullOrWhiteSpace(config.AppSecret) || string.IsNullOrWhiteSpace(config.Domain) || string.IsNullOrWhiteSpace(config.Token)) { return(Content(string.Empty)); } //接收数据 //System.IO.StreamReader reader = new System.IO.StreamReader(Request.InputStream); //String xmlData = reader.ReadToEnd(); //XElement xdoc = XElement.Parse(xmlData); //解析XML //var toUserName = xdoc.Element("ToUserName").Value; //var fromUserName = xdoc.Element("FromUserName").Value; //var createTime = xdoc.Element("CreateTime").Value; //string key = xdoc.Element("EventKey").Value; //var content = xdoc.Element("Ticket").Value; //DateTime datatime = DateTime.Now; //if (!string.IsNullOrEmpty(key)) //{ //userin User = wxApi.GetNickname(wxApi.GetToken(config.AppId, config.AppSecret).Accesstoken, fromUserName); // string createSql = "insert into TgCount values('" + key + "','" + createTime + "','" + User.Nickname + "','" + toUserName + "','" + datatime + "')"; // using (DbOperator dboperator = ConnectionManager.CreateReadConnection()) // { // dboperator.ExecuteNonQuery(createSql, 30000); // } //} try { TxtLogServices.WriteTxtLogEx("Api_Post", "AppId:{0};AppSecret:{1};Domain:{2};Token:{3}", config.AppId, config.AppSecret, config.Domain, config.Token); if (!config.Status) { return(Content("该公众账号暂停使用,请稍后再试!")); } if (!WxService.CheckSignature(config.Token, timestamp, nonce, signature)) { return(Content(string.Empty)); } var conversation = new WeiXinConversation(token, Request.InputStream); try { TxtLogServices.WriteTxtLogEx("Api_Post_Request", conversation.RequestDocument.ToString()); //执行微信处理过程 conversation.Execute(); if (conversation.ResponseDocument != null) { TxtLogServices.WriteTxtLogEx("Api_Post_Response", conversation.ResponseDocument.ToString()); } } catch (Exception ex) { ExceptionsServices.AddExceptions(ex, "执行微信处理过程失败", LogFrom.WeiXin); TxtLogServices.WriteTxtLogEx("Api_Post_Error", ex); if (conversation.ResponseDocument != null) { TxtLogServices.WriteTxtLogEx("Api_Post_Error", conversation.ResponseDocument.ToString()); } } if (conversation.ResponseDocument != null) { //如果是微信位置推送则不回复 if (conversation.Request.MsgType == WReqType.Event) { WReqEventBase wreqevent = conversation.Request as WReqEventBase; if (wreqevent != null && wreqevent.Event == EventType.Location) { return(Content(string.Empty)); } } return(Content(conversation.ResponseDocument.ToString())); } } catch (Exception ex) { ExceptionsServices.AddExceptions(ex, "微信提交事件处理失败", LogFrom.WeiXin); TxtLogServices.WriteTxtLogEx("Api_Post_Error", ex); } return(Content(string.Empty)); }
/// <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), System.Web.Caching.Cache.NoSlidingExpiration); } } catch (Exception ex) { throw new Exception("Execute Root:" + ex.Message); } finally { OnExecuted(); } }