public ThirdPartyMessageHandler(Stream inputStream) { RequestDocument = XmlUtility.XmlUtility.Convert(inputStream);//转成XDocument //转成实体 RequestMessageBase requestMessage = null; InfoType infoType; try { infoType = InfoTypeHelper.GetRequestInfoType(RequestDocument); switch (infoType) { case InfoType.component_verify_ticket: requestMessage = new RequestMessageComponentVerifyTicket(); break; case InfoType.unauthorized: requestMessage = new RequestMessageUnauthorized(); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception ex) { throw; } requestMessage.FillEntityWithXml(RequestDocument); RequestMessage = requestMessage; }
public void FillEntityWithXmlTest() { string xml = @"<xml> <AppId><![CDATA[wxbbd3f07e2945cf2a]]></AppId> <CreateTime>1536250240</CreateTime> <InfoType><![CDATA[component_verify_ticket]]></InfoType> <ComponentVerifyTicket><![CDATA[ticket@@@oj3_KoMMnlH2SZbBs89CAzABbNF3Wfr12AFbIg19aKeLSgebFJXPE9tS60X38ab-kG5a08oskSWVdHEklNCAhA]]></ComponentVerifyTicket> </xml>"; RequestMessageComponentVerifyTicket entity = new RequestMessageComponentVerifyTicket(); XDocument doc = XDocument.Parse(xml); EntityHelper.FillEntityWithXml(entity, doc); Assert.AreEqual("wxbbd3f07e2945cf2a", entity.AppId); //Assert.AreEqual("CreateTime", entity.AppId); Assert.AreEqual(RequestInfoType.component_verify_ticket, entity.InfoType); //只读 Assert.AreEqual( "ticket@@@oj3_KoMMnlH2SZbBs89CAzABbNF3Wfr12AFbIg19aKeLSgebFJXPE9tS60X38ab-kG5a08oskSWVdHEklNCAhA", entity.ComponentVerifyTicket); try { entity = null; //测试 null 的情况 EntityHelper.FillEntityWithXml(entity, doc); Assert.Fail(); } catch (ArgumentNullException ex) { Console.WriteLine("抛出异常是正确的"); } }
/// <summary> /// 第三方平台ticket验证请求 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { var openTicketPath = Server.GetMapPath("~/App_Data/OpenTicket"); if (!Directory.Exists(openTicketPath)) { Directory.CreateDirectory(openTicketPath); } //RequestDocument.Save(Path.Combine(openTicketPath, string.Format("{0}_Doc.txt", DateTime.Now.Ticks))); //记录ComponentVerifyTicket(也可以存入数据库或其他可以持久化的地方) using (FileStream fs = new FileStream(Path.Combine(openTicketPath, string.Format("{0}.txt", RequestMessage.AppId//该ID为第三方平台ID )), FileMode.OpenOrCreate, FileAccess.ReadWrite)) { using (TextWriter tw = new StreamWriter(fs)) { tw.Write(requestMessage.ComponentVerifyTicket); tw.Flush(); } } return(base.OnComponentVerifyTicketRequest(requestMessage)); }
public ThirdPartyMessageHandler(Stream inputStream) { //TODO:信息需要解密 RequestDocument = XmlUtility.XmlUtility.Convert(inputStream);//转成XDocument //转成实体 RequestMessageBase requestMessage = null; InfoType infoType; try { infoType = InfoTypeHelper.GetRequestInfoType(RequestDocument); switch (infoType) { case InfoType.component_verify_ticket: requestMessage = new RequestMessageComponentVerifyTicket(); break; case InfoType.unauthorized: requestMessage = new RequestMessageUnauthorized(); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception ex) { throw; } requestMessage.FillEntityWithXml(RequestDocument); RequestMessage = requestMessage; }
/// <summary> /// 微信回调消息处理 /// </summary> /// <param name="doc"></param> /// <returns></returns> public static string CommandWXCallback(XDocument doc, PostModel postModel) { if (doc == null) return "success"; RequestMessageBase requestMessage = new RequestMessageBase(); try { if (doc.Root.Element("MsgType") == null && doc.Root.Element("InfoType") == null) { return "success"; } RequestMsgType msgType = RequestMsgType.EVENT; if (doc.Root.Element("MsgType") != null) { msgType = (RequestMsgType)System.Enum.Parse(typeof(RequestMsgType), doc.Root.Element("MsgType").Value.ToUpper()); } switch (msgType) { case RequestMsgType.TEXT: RequestMessageText requestMessageTest = EntityHelper.FillEntityWithXml(new RequestMessageText(), doc); return OnTextRequest(requestMessageTest, postModel); case RequestMsgType.EVENT: if (doc.Root.Element("InfoType") == null) break; RequestInfoType infoType = (RequestInfoType)System.Enum.Parse(typeof(RequestInfoType), doc.Root.Element("InfoType").Value, true); switch (infoType) { case RequestInfoType.component_verify_ticket: RequestMessageComponentVerifyTicket tempModel = EntityHelper.FillEntityWithXml(new RequestMessageComponentVerifyTicket(), doc); OpenPlatConfigBLL.SingleModel.ComponentVerifyTicket(tempModel.AppId, tempModel.ComponentVerifyTicket, tempModel.CreateTime); break; case RequestInfoType.unauthorized: break; case RequestInfoType.weapp_audit_success: case RequestInfoType.weapp_audit_fail: //小程序代码审核成功回调 CommandXCXPublish(infoType.ToString(), doc); break; default: break; } break; } } catch (Exception ex) { log4net.LogHelper.WriteError(typeof(WXRequestCommandBLL), ex); } return "success"; }
public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { LogService.GetInstance().AddLog("OnComponentVerifyTicketRequest", null, "Begin Update Verify Ticket", "", "Info"); LogService.GetInstance().AddLog("OnComponentVerifyTicketRequest", null, "verify ticket is " + requestMessage.ComponentVerifyTicket, "", "Info"); CommEntityUpdater updater = new CommEntityUpdater(_wxConfig, db); updater.UpdateVerifyData(requestMessage.ComponentVerifyTicket); LogService.GetInstance().AddLog("OnComponentVerifyTicketRequest", null, "End Update Verify Ticket", "", "Info"); return(base.OnComponentVerifyTicketRequest(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; RequestInfoType infoType; try { infoType = InfoTypeHelper.GetRequestInfoType(doc); switch (infoType) { case RequestInfoType.component_verify_ticket: requestMessage = new RequestMessageComponentVerifyTicket(); break; case RequestInfoType.unauthorized: /* * <xml> * <AppId>第三方平台appid</AppId> * <CreateTime>1413192760</CreateTime> * <InfoType>unauthorized</InfoType> * <AuthorizerAppid>公众号appid</AuthorizerAppid> * </xml> */ requestMessage = new RequestMessageUnauthorized(); break; case RequestInfoType.authorized: /* * <xml> * <AppId>第三方平台appid</AppId> * <CreateTime>1413192760</CreateTime> * <InfoType>authorized</InfoType> * <AuthorizerAppid>公众号appid</AuthorizerAppid> * <AuthorizationCode>授权码(code)</AuthorizationCode> * <AuthorizationCodeExpiredTime>过期时间</AuthorizationCodeExpiredTime> * </xml> */ requestMessage = new RequestMessageAuthorized(); break; case RequestInfoType.updateauthorized: requestMessage = new RequestMessageUpdateAuthorized(); 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转换出错!可能是InfoType不存在!,XML:{0}", doc.ToString()), ex); } return(requestMessage); }
public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { ComponentTokenService cts = new ComponentTokenService(); var componentToken = cts.GetToken(); componentToken.ComponentVerifyTicketCreateOn = DateTime.Now; componentToken.ComponentVerifyTicket = requestMessage.ComponentVerifyTicket; cts.SaveVerifyToken(componentToken); var expiredTime = componentToken.ComponentAccessTokenCreateOn.AddSeconds(componentToken.ComponentAccessTokenExpiresIn); if (ExpiresIn(expiredTime, 1200)) { //Refresh the token before 1200 seconds when it expired try { var updatedToken = ComponentApi.GetComponentAccessToken(ConfigurationManager.AppSettings["AppId"], ConfigurationManager.AppSettings["AppSecret"], componentToken.ComponentVerifyTicket); componentToken.ComponentAccessTokenCreateOn = DateTime.Now; componentToken.ComponentAccessTokenExpiresIn = updatedToken.expires_in; componentToken.ComponentAccessToken = updatedToken.component_access_token; cts.SaveAccessToken(componentToken); Log("update access token to " + JsonConvert.SerializeObject(componentToken)); } catch (Exception e) { Log(e.ToString(), true); } } expiredTime = componentToken.PreAuthCodeCreateOn.AddSeconds(componentToken.PreAuthCodeExpiresIn); if (ExpiresIn(expiredTime, 1200)) { try { var updatedCode = ComponentApi.GetPreAuthCode(ConfigurationManager.AppSettings["AppId"], componentToken.ComponentAccessToken); componentToken.PreAuthCodeExpiresIn = updatedCode.expires_in; componentToken.PreAuthCode = updatedCode.pre_auth_code; componentToken.PreAuthCodeCreateOn = DateTime.Now; cts.SavePreAuthCode(componentToken); Log("update preauth to " + JsonConvert.SerializeObject(componentToken)); } catch (Exception e2) { Log(e2.ToString(), true); } } return(base.OnComponentVerifyTicketRequest(requestMessage)); }
public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { //使用数据库去记录 var _contextOptions = new DbContextOptionsBuilder <WechatOpenCoreDbContext>() .UseMySql("Server=120.79.31.209;Port=3336;Uid=root;Pwd=628VqB2sgJwLgOvngXQ3;Database=hchh;") .Options; using (var db = new WechatOpenCoreDbContext(_contextOptions)) { var model = db.Query <WechatOpenTicket>() .Where(m => m.AppId == requestMessage.AppId) .FirstOrDefault(); if (model == null) { model = new WechatOpenTicket() { AppId = requestMessage.AppId, OpenTicket = requestMessage.ComponentVerifyTicket, CreateTime = requestMessage.CreateTime }; db.AddTo(model); } else { model.OpenTicket = requestMessage.ComponentVerifyTicket; model.CreateTime = requestMessage.CreateTime; } db.SaveChanges(); } //var openTicketPath = hostingEnvironment.MapPath("/App_Data/OpenTicket"); //if (!Directory.Exists(openTicketPath)) //{ // Directory.CreateDirectory(openTicketPath); //} ////RequestDocument.Save(Path.Combine(openTicketPath, string.Format("{0}_Doc.txt", DateTime.Now.Ticks))); ////记录ComponentVerifyTicket(也可以存入数据库或其他可以持久化的地方) //using (FileStream fs = new FileStream(Path.Combine(openTicketPath, string.Format("{0}.txt", RequestMessage.AppId)),FileMode.OpenOrCreate,FileAccess.ReadWrite)) //{ // using (TextWriter tw = new StreamWriter(fs)) // { // tw.Write(requestMessage.ComponentVerifyTicket); // tw.Flush(); // //tw.Close(); // } //} return(base.OnComponentVerifyTicketRequest(requestMessage)); }
public void FillEntityWithXml() { var xml = @"<xml> <AppId><![CDATA[wxbbd3f07e2945cf2a]]></AppId> <CreateTime>1536250240</CreateTime> <InfoType><![CDATA[component_verify_ticket]]></InfoType> <ComponentVerifyTicket><![CDATA[ticket@@@oj3_KoMMnlH2SZbBs89CAzABbNF3Wfr12AFbIg19aKeLSgebFJXPE9tS60X38ab-kG5a08oskSWVdHEklNCAhA]]></ComponentVerifyTicket> </xml>"; var entity = new RequestMessageComponentVerifyTicket(); var doc = XDocument.Parse(xml); EntityHelper.FillEntityWithXml(entity, doc); Assert.AreEqual("wxbbd3f07e2945cf2a", entity.AppId); //Assert.AreEqual("CreateTime", entity.AppId); Assert.AreEqual(RequestInfoType.component_verify_ticket, entity.InfoType);//只读 Assert.AreEqual("ticket@@@oj3_KoMMnlH2SZbBs89CAzABbNF3Wfr12AFbIg19aKeLSgebFJXPE9tS60X38ab-kG5a08oskSWVdHEklNCAhA", entity.ComponentVerifyTicket); }
/// <summary> /// 推送component_verify_ticket协议 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public virtual string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { return("success"); }
/// <summary> /// 推送component_verify_ticket协议 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public virtual string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { return "success"; }
public ActionResult ReceiveComponentTicket(PostModel postModel) { string postXml = new StreamReader(Request.Body).ReadToEnd(); try { ComponentAuthorizer accessToken = db.ComponentAuthorizer.FirstOrDefault(); if (accessToken != null) { postModel.EncodingAESKey = accessToken.EncodingAESKey; postModel.Token = accessToken.Token; postModel.AppId = accessToken.AppId; byte[] requestData = Encoding.UTF8.GetBytes(postXml); Stream inputStream = new MemoryStream(requestData); HchhThirdPartyMessageHandler handler = new HchhThirdPartyMessageHandler(inputStream, postModel, shopDb, logger); RequestMessageComponentVerifyTicket ticket = handler.RequestMessage as RequestMessageComponentVerifyTicket; if (accessToken.Ticket != ticket.ComponentVerifyTicket) { accessToken.Ticket = ticket.ComponentVerifyTicket; accessToken.TicketTime = ticket.CreateTime; } if (DateTime.Now > accessToken.ExpiredTime.AddMinutes(-30)) //判断到accesstoken即将过期 马上获取新accesstoken { try { string token = ComponentContainer.TryGetComponentAccessToken(accessToken.AppId, accessToken.AppSecret, accessToken.Ticket, true); accessToken.AccessToken = token; accessToken.UpdatedTime = DateTime.Now; accessToken.ExpiredTime = DateTime.Now.AddSeconds(7200); } catch (Exception ex) { logger.Add(new TaskLog() { AddTime = DateTime.Now, ExeResult = accessToken.AppId + ":" + ex.Message, TaskName = "TryGetComponentAccessToken" }); logger.SaveChanges(); } } db.Update(accessToken); db.SaveChanges(); RefreshAuthorizerToken(accessToken.AppId, accessToken.AccessToken); return(Content(handler.ResponseMessageText)); } return(Content("this appid not in database")); } catch (Exception ex) { logger.Add(new TaskLog() { AddTime = DateTime.Now, TaskName = "ReceiveComponentTicket", ExeResult = postXml + "|" + ex.Message }); logger.SaveChanges(); return(Content("error")); } }
public override string OnComponentVerifyTicketRequest(RequestMessageComponentVerifyTicket requestMessage) { return(base.OnComponentVerifyTicketRequest(requestMessage)); }
public XDocument Init() { //解密XML信息 var postDataStr = EcryptRequestDocument.ToString(); 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; } RequestDocument = XDocument.Parse(msgXml);//完成解密 RequestMessage = RequestMessageFactory.GetRequestEntity(RequestDocument); //转成实体 RequestMessageBase requestMessage = null; RequestInfoType infoType; try { infoType = InfoTypeHelper.GetRequestInfoType(RequestDocument); switch (infoType) { case RequestInfoType.component_verify_ticket: requestMessage = new RequestMessageComponentVerifyTicket(); break; case RequestInfoType.unauthorized: requestMessage = new RequestMessageUnauthorized(); break; default: throw new ArgumentOutOfRangeException(); } } catch (Exception ex) { //此处可以记录日志 throw; } requestMessage.FillEntityWithXml(RequestDocument); RequestMessage = requestMessage; return RequestDocument; }