Exemple #1
0
        static void HandleClient(Server server, TcpClient client)
        {
            byte[] bytes = new byte[256];
            string data;

            while (true)
            {
                NetworkStream stream = client.GetStream();

                int i;

                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);

                    // Verschlüsselung: data entschlüsseln

                    GenericMessage genericMessage = JsonSerializer.Deserialize <GenericMessage>(data);

                    IMessage message = MessageFactory.GetMessage(genericMessage.MessageId, data);

                    IMessageHandler handler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId);
                    handler.Execute(server, client, message);
                }
            }
        }
Exemple #2
0
 static void ReceiveData()
 {
     while (true)
     {
         byte[]          data           = new byte[256];
         int             bytes          = client.GetStream().Read(data, 0, data.Length);
         string          responseData   = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
         GenericMessage  genericMessage = JsonSerializer.Deserialize <GenericMessage>(responseData);
         IMessage        message        = MessageFactory.GetMessage(genericMessage.MessageId, responseData);
         IMessageHandler messageHandler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId);
         messageHandler.Execute(client, message);
     }
 }
Exemple #3
0
        public void Run(object state)
        {
            while (true)
            {
                IMessageHandler handler = null;
                try
                {
                    MessageToken job = GetItem();

                    if (job != null)
                    {
                        if (mHandlers.TryGetValue(job.Message.GetType(), out handler))
                        {
                            handler.Execute(job);
                        }
                        else
                        {
                            "{0} message handler not found".Log4Error(job.Message.GetType());
                        }
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(10);
                    }
                }
                catch (Exception e_)
                {
                    if (handler != null)
                    {
                        "{0} invoke error {1}".Log4Error(e_, handler.GetType(), e_.Message);
                    }
                    else
                    {
                        "Dispatcher error {0}".Log4Error(e_, e_.Message);
                    }
                }
            }
        }
Exemple #4
0
 static void ReceiveData()
 {
     while (client != null)
     {
         try
         {
             lock (client)
             {
                 byte[]          data           = new byte[1024];
                 int             bytes          = client.GetStream().Read(data, 0, data.Length);
                 string          responseData   = System.Text.Encoding.UTF8.GetString(data, 0, bytes);
                 GenericMessage  genericMessage = JsonSerializer.Deserialize <GenericMessage>(responseData);
                 IMessage        message        = MessageFactory.GetMessage(genericMessage.MessageId, responseData);
                 IMessageHandler messageHandler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId);
                 messageHandler.Execute(client, message);
             }
         }
         catch (System.IO.IOException)
         { }
         catch (System.ObjectDisposedException)
         { }
     }
 }
Exemple #5
0
        protected void Page_Load(object sender, EventArgs e)
        {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            string inputXml = string.Empty;

            using (StreamReader sr = new StreamReader(Request.InputStream))
            {
                inputXml = sr.ReadToEnd();
                inputXml = HttpUtility.UrlDecode(inputXml);
            }

            string updateMenu = Request["updatemenu"];

            if (!string.IsNullOrWhiteSpace(updateMenu))
            {
                foreach (var menu in Activator.WeChatMenuContainer.WeChatMenus)
                {
                    try
                    {
                        if (!AccessTokenContainer.CheckRegistered(menu.AppId))
                        {
                            AccessTokenContainer.Register(menu.AppId, menu.Secret);
                        }

                        AccessTokenResult tokenRes = null;
                        try
                        {
                            tokenRes = AccessTokenContainer.GetTokenResult(menu.AppId); //CommonAPIs.CommonApi.GetToken(appId, appSecret);
                            WriteContent(string.Format("获取到 token 为:{0}, 有效时间为 {1} 秒。", tokenRes.access_token, tokenRes.expires_in));

                            //var menuRes = CommonApi.GetMenu(tokenRes.access_token);
                        }
                        catch
                        {
                            WriteContent(string.Format("获取到 token 失败, appid: {0},secret: {1}。", menu.AppId, menu.Secret));
                        }

                        try
                        {
                            if (tokenRes != null)
                            {
                                //重新整理按钮信息
                                ButtonGroup bg = new ButtonGroup();
                                foreach (var menuButton in menu.MenuButtons)
                                {
                                    BaseButton but = null;
                                    switch (menuButton.Type)
                                    {
                                    case ButtonType.Click:
                                        but = new SingleClickButton()
                                        {
                                            name = menuButton.Name, key = menuButton.Key, type = "click"
                                        };
                                        break;

                                    case ButtonType.View:
                                        but = new SingleViewButton()
                                        {
                                            name = menuButton.Name, url = menuButton.Url, type = "view"
                                        };
                                        break;

                                    case ButtonType.SubButton:
                                        List <SingleButton> subButtons = new List <SingleButton>();

                                        foreach (var subBut in menuButton.MenuSubButtons)
                                        {
                                            SingleButton singleBut = null;
                                            switch (subBut.Type)
                                            {
                                            case ButtonType.Click:
                                                singleBut = new SingleClickButton()
                                                {
                                                    name = subBut.Name, key = subBut.Key, type = "click"
                                                };
                                                break;

                                            case ButtonType.View:
                                                singleBut = new SingleViewButton()
                                                {
                                                    name = subBut.Name, url = subBut.Url, type = "view"
                                                };
                                                break;
                                            }

                                            if (singleBut != null)
                                            {
                                                subButtons.Add(singleBut);
                                            }
                                        }

                                        but = new SubButton()
                                        {
                                            name = menuButton.Name, sub_button = subButtons
                                        };
                                        break;
                                    }

                                    if (but != null)
                                    {
                                        bg.button.Add(but);
                                    }
                                }

                                var result = CommonApi.CreateMenu(tokenRes.access_token, bg);
                                WriteContent(string.Format("创建结果信息:{0}, 返回值 {1} ({2})。", result.errmsg, (int)result.errcode, result.errcode.ToString()));
                            }
                        }
                        catch
                        {
                            WriteContent("创建菜单失败!");
                        }
                    }
                    catch (Exception)
                    {
                        //TODO:为简化代码,这里不处理异常(如Token过期)
                        WriteContent("执行过程发生错误!");
                    }
                }
            }

            foreach (var proxy in Activator.WeChatProxyContainer.WeChatProxies)
            {
                string token = proxy.Token;

                if (Request.HttpMethod == "GET")
                {
                    //get method - 仅在微信后台填写URL验证时触发
                    if (CheckSignature.Check(signature, timestamp, nonce, token))
                    {
                        WriteContent(echostr); //返回随机字符串则表示验证通过
                        //如果有多个相同的Token,则第一个验证通过就返回
                        break;
                    }
                    else
                    {
                        //WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, token) + "。" +
                        //            "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                        //如果失败应该不返回任何东西,以便循环校验下一个Token
                        continue;
                    }
                }
                else
                {
                    //post method - 当有用户想公众账号发送消息时触发
                    if (!CheckSignature.Check(signature, timestamp, nonce, token))
                    {
                        WriteContent("参数错误!");
                        continue;
                    }

                    //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制
                    var maxRecordCount = 10;

                    //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
                    //var messageHandler = new CustomMessageHandler(Request.InputStream, maxRecordCount);

                    IMessageHandler messageHandler = null;
                    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(inputXml)))
                    {
                        Type type       = proxy.Bundle.LoadClass(proxy.Handler);
                        var  parameters = new object[] { stream, token, proxy.AppID, proxy.Secret, maxRecordCount };
                        messageHandler = System.Activator.CreateInstance(type, parameters) as IMessageHandler;
                    }

                    try
                    {
                        if (messageHandler != null)
                        {
                            //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                            messageHandler.RequestDocument.Save(
                                Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" +
                                               messageHandler.RequestMessage.FromUserName + ".txt"));
                            //执行微信处理过程
                            messageHandler.Execute();
                            //测试时可开启,帮助跟踪数据
                            messageHandler.ResponseDocument.Save(
                                Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" +
                                               messageHandler.ResponseMessage.ToUserName + ".txt"));
                            WriteContent(messageHandler.ResponseDocument.ToString());

                            continue;
                        }
                    }
                    catch (Exception ex)
                    {
                        using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
                        {
                            tw.WriteLine(ex.Message);
                            tw.WriteLine(ex.InnerException.Message);

                            if (messageHandler.ResponseDocument != null)
                            {
                                tw.WriteLine(messageHandler.ResponseDocument.ToString());
                            }

                            tw.Flush();
                            tw.Close();
                        }

                        WriteContent("");
                    }
                }
            }

            Response.End();
        }
Exemple #6
0
        public ActionResult PostPost(string key, PostModel postModel)
        {
            //根据加密的Key获取QyApp信息
            var qyApp = _encryptionService.CheckDecodedQyAppKey(key, SiteConfig.WEIXIN_QY_KEY_KEY);

            if (qyApp == null)
            {
                return(null);
            }

            postModel.Token          = qyApp.Token;
            postModel.EncodingAESKey = qyApp.EncodingAESKey;
            postModel.CorpId         = qyApp.CorpId;

            var appKind = (AppKind)qyApp.Id;

            var dir = Senparc.Core.Utility.Server.GetMapPath("~/App_Data/QyAppLog/{0}/{1}".With(appKind.ToString(), DateTime.Now.ToString("yyyy-MM-dd")));

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }

            try
            {
                IMessageHandler <IRequestMessageBase, IResponseMessageBase> messageHandler = AppMessageHandlerFactory.GetMessageHandler(appKind, Request.InputStream, postModel, qyApp);

                var doc = messageHandler.RequestDocument;
                doc.Save(Path.Combine(dir,
                                      "{0}_Request_{1}.txt".With(DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName)));
                //测试时可开启,帮助跟踪数据

                messageHandler.Execute(); //执行微信操作

                var responseDoc = messageHandler.ResponseDocument;
                responseDoc.Save(Path.Combine(dir,
                                              "{0}_Response_{1}.txt".With(DateTime.Now.Ticks, messageHandler.ResponseMessage.ToUserName)));

                //测试时可开启,帮助跟踪数据

                //return Content(responseDoc.ToString());
                return(new FixWeixinBugWeixinResult(messageHandler));
                //return new WeixinResult(messageHandler);
            }
            catch (Exception ex)
            {
                //LogUtility.WeixinLogger.Error(ex.Message, ex);
                TextWriter tw =
                    new StreamWriter(Path.Combine(dir, "Error_{0}.txt".With(DateTime.Now.Ticks + "_" + ex.Message)));
                tw.WriteLine(ex.Message);
                tw.WriteLine(ex.StackTrace);

                if (ex.InnerException != null)
                {
                    tw.WriteLine(ex.InnerException.Message);
                }

                tw.Flush();
                tw.Close();
                return(Content(""));
            }
        }
 private void ConsumeHandler(object ch, BasicDeliverEventArgs ea)
 {
     _channel.BasicAck(ea.DeliveryTag, false);
     _messageHandler.Execute(ea, _publisher);
 }