Пример #1
0
        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;
        }
Пример #2
0
        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;
        }
Пример #5
0
        /// <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";
        }
Пример #6
0
        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);
        }
Пример #8
0
        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));
        }
Пример #9
0
        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));
        }
Пример #10
0
        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";
 }
Пример #13
0
        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"));
            }
        }
Пример #14
0
 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;
        }