Example #1
0
        public ActionResult Index()
        {
            //MPMenu.CreateMenuDefault();
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            if (Request.HttpMethod == "GET")
            {
                //仅在微信后台填写URL验证时触发
                if (MPBasicSetting.FirstCertification == "1")
                {
                    if (CheckSignature.Check(signature, timestamp, nonce, MPBasicSetting.Token))
                    {
                        FileHelper.WriteLog(echostr);
                        return(Content(echostr));
                    }
                }
            }
            else
            {
                //post method - 当有用户向公众账号发送消息时触发
#if !DEBUG
                if (!CheckSignature.Check(signature, timestamp, nonce, MPBasicSetting.Token))
                {
                    //WriteContent("服务器忙!");
                    FileHelper.WriteLog("Token验证失败", signature + " " + MPBasicSetting.Token);
                    return(Content("服务器忙..."));
                }
#endif

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

                try
                {
                    //当使用加密模式时,此参数有用。
                    var pm = new PostModel()
                    {
                        Signature     = signature,
                        Msg_Signature = Request.QueryString["msg_signature"],
                        Timestamp     = timestamp,
                        Nonce         = nonce,
                        //以下保密信息不会(不应该)在网络上传播,请注意
                        Token = MPBasicSetting.Token,
                        //EncodingAESKey = "mNnY5GekpChwqhy2c4NBH90g3hND6GeI4gii2YCvKLY", //根据自己后台的设置保持一致
                        AppId = MPBasicSetting.AppID    //根据自己后台的设置保持一致
                    };

                    var requestMessageHandler = new MPCustomMessageHandler(Request.InputStream, pm, maxRecordCount);
                    //执行微信处理过程
                    requestMessageHandler.Execute();
                    return(Content(requestMessageHandler.ResponseDocument.ToString()));
                }
                catch (Exception ex)
                {
                    FileHelper.WriteLog("消息处理错误", ex.Message);
                    return(Content("服务器忙..."));
                }
                finally
                {
                }
            }
            ViewBag.WeChatTitleName = MPBasicSetting.WeChatTitleName;
            return(View());
        }
        public ActionResult OldPost(string signature, string timestamp, string nonce, string echostr)
        {
            LocationService locationService = new LocationService();
            EventService    eventService    = new EventService();

            if (!CheckSignature.Check(signature, timestamp, nonce, WeiXinConfiguration.Token))
            {
                return(Content("参数错误!"));
            }
            XDocument requestDoc = null;

            try
            {
                requestDoc = XDocument.Load(Request.InputStream);

                var requestMessage = RequestMessageFactory.GetRequestEntity(requestDoc);
                //如果不需要记录requestDoc,只需要:
                //var requestMessage = RequestMessageFactory.GetRequestEntity(Request.InputStream);

                requestDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + requestMessage.FromUserName + ".txt"));//测试时可开启,帮助跟踪数据
                ResponseMessageBase responseMessage = null;
                switch (requestMessage.MsgType)
                {
                case RequestMsgType.Text:    //文字
                {
                    //TODO:交给Service处理具体信息,参考/Service/EventSercice.cs 及 /Service/LocationSercice.cs
                    var strongRequestMessage  = requestMessage as RequestMessageText;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as
                        ResponseMessageText;
                    strongresponseMessage.Content =
                        string.Format(
                            "您刚才发送了文字信息:{0}\r\n您还可以发送【位置】【图片】【语音】等类型的信息,查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com",
                            strongRequestMessage.Content);
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Location:    //位置
                {
                    responseMessage = locationService.GetResponseMessage(requestMessage as RequestMessageLocation);
                    break;
                }

                case RequestMsgType.Image:    //图片
                {
                    //TODO:交给Service处理具体信息
                    var strongRequestMessage  = requestMessage as RequestMessageImage;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.News) as
                        ResponseMessageNews;
                    strongresponseMessage.Articles.Add(new Article()
                        {
                            Title       = "您刚才发送了图片信息",
                            Description = "您发送的图片将会显示在边上",
                            PicUrl      = strongRequestMessage.PicUrl,
                            Url         = "http://weixin.senparc.com"
                        });
                    strongresponseMessage.Articles.Add(new Article()
                        {
                            Title       = "第二条",
                            Description = "第二条带连接的内容",
                            PicUrl      = strongRequestMessage.PicUrl,
                            Url         = "http://weixin.senparc.com"
                        });
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Voice:    //语音
                {
                    //TODO:交给Service处理具体信息
                    var strongRequestMessage  = requestMessage as RequestMessageVoice;
                    var strongresponseMessage =
                        ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Music) as
                        ResponseMessageMusic;
                    strongresponseMessage.Music.MusicUrl = "http://weixin.senparc.com/Content/music1.mp3";
                    responseMessage = strongresponseMessage;
                    break;
                }

                case RequestMsgType.Event:    //事件
                {
                    responseMessage = eventService.GetResponseMessage(requestMessage as RequestMessageEventBase);
                    break;
                }

                default:
                    throw new ArgumentOutOfRangeException();
                }
                var responseDoc = Senparc.Weixin.MP.Helpers.EntityHelper.ConvertEntityToXml(responseMessage);
                responseDoc.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + responseMessage.ToUserName + ".txt"));//测试时可开启,帮助跟踪数据

                return(Content(responseDoc.ToString()));
                //如果不需要记录responseDoc,只需要:
                //return Content(responseMessage.ConvertEntityToXmlString());
            }
            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 (requestDoc != null)
                    {
                        tw.WriteLine(requestDoc.ToString());
                    }
                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));
            }
        }
Example #3
0
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(Content("参数错误!"));
            }

            postModel.Token          = Token;          //根据自己后台的设置保持一致
            postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = WxOpenAppId;    //根据自己后台的设置保持一致(必须提供)

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

            var logPath = Server.GetMapPath(string.Format("~/App_Data/WxOpen/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));

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

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


            try
            {
                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;

                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                messageHandler.SaveRequestMessageLog();  //记录 Request 日志(可选)

                messageHandler.Execute();                //执行微信处理过程(关键)

                messageHandler.SaveResponseMessageLog(); //记录 Response 日志(可选)

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                return(new FixWeixinBugWeixinResult(messageHandler)); //为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                                                                      //return new WeixinResult(messageHandler);//v0.8+
            }
            catch (Exception ex)
            {
                using (TextWriter tw = new StreamWriter(Server.GetMapPath("~/App_Data/Error_WxOpen_" + _getRandomFileName() + ".txt")))
                {
                    tw.WriteLine("ExecptionMessage:" + ex.Message);
                    tw.WriteLine(ex.Source);
                    tw.WriteLine(ex.StackTrace);
                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));
            }
        }
Example #4
0
        public ActionResult Index(long id = 0)
        {
            Log.Info("进入微信API");

            var siteSetting = SiteSettingApplication.SiteSettings;
            //string token = "weixin_test";
            string token = "", signature = "", nonce = "", timestamp = "", echostr = "";

            if (id == 0)
            {
                token = siteSetting.WeixinToken;
            }
            else
            {
                var _tmp = _iVShopService.GetVShopSetting(id);
                if (_tmp == null)
                {
                    throw new HimallException("错误的商铺编号");
                }
                token = _tmp.Token;
            }
            signature = Request["signature"];
            nonce     = Request["nonce"];
            timestamp = Request["timestamp"];
            echostr   = Request["echostr"];
            ActionResult actionResult = Content("");

            Log.Info(string.Format("传入信息:signature = {0} , nonce = {1} , timestamp = {2} , echostr = {3} , id = {4}", signature, nonce, timestamp, echostr, id));
            if (Request.HttpMethod == "GET")
            {
                if (CheckSignature.Check(signature, timestamp, nonce, token))
                {
                    actionResult = Content(echostr);
                }
            }
            else
            {
                //TODO:[lly] 微信消息处理
                if (!CheckSignature.Check(signature, timestamp, nonce, token))
                {
                    Log.Info("验证不通过");
                }

                XDocument requestDoc = XDocument.Load(Request.InputStream);

#if DEBUG
                //调试时记录数据日志
                Core.Log.Debug(requestDoc);
#endif

                var         requestBaseMsg = RequestMessageFactory.GetRequestEntity(requestDoc);
                SceneHelper helper         = new SceneHelper();

                //卡券服务
                var cardser = _iWXCardService;

                switch (requestBaseMsg.MsgType)
                {
                    #region Event处理
                case RequestMsgType.Event:
                    var requestMsg = requestBaseMsg as Senparc.Weixin.MP.Entities.RequestMessageEventBase;
                    Log.Info("进入RequestMsgType - Event:" + requestMsg.Event.ToString());
                    switch (requestMsg.Event)
                    {
                    //取消公众号订阅事件
                    case Event.unsubscribe:
                        UnSubscribe(requestMsg.FromUserName);
                        break;

                    //订阅公众号事件
                    case Event.subscribe:

                        //关注红包
                        actionResult = SendAttentionToUser(requestBaseMsg);


                        #region 关注公众号,欢迎语!
                        int nowtime = ConvertDateTimeInt(DateTime.Now);

                        //string msg = "";//关注时,需要发送的内容
                        var data = WeixinAutoReplyApplication.GetAutoReplyByKey(CommonModel.ReplyType.Follow, "", false, true, true);
                        //string resxml = "<xml><ToUserName><![CDATA[" + requestBaseMsg.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestBaseMsg.ToUserName + "]]></FromUserName><CreateTime>" + nowtime + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + msg + "]]></Content><FuncFlag>0</FuncFlag></xml>";
                        if (data == null)
                        {
                            Log.Info("请设置关注后自动回复消息内容!");
                        }
                        string resxml = GetResxml(data, requestBaseMsg);
                        if (!string.IsNullOrEmpty(resxml))
                        {
                            Response.Write(resxml);
                        }
                        //Response.Write(resxml);
                        #endregion

                        var requestSubscribe = requestMsg as Senparc.Weixin.MP.Entities.RequestMessageEvent_Subscribe;
#if DEBUG
                        Log.Debug(requestSubscribe, new Exception("进入订阅事件"));
#endif
                        bool       isActivityBonus = false;
                        SceneModel sceneModel      = null;
#if DEBUG
                        Log.Info("进入订阅事件requestSubscribe.EventKey =" + requestSubscribe.EventKey);
#endif
                        #region 场景二维码

                        if (requestSubscribe.EventKey != string.Empty)
                        {
                            var scene = requestSubscribe.EventKey.Replace("qrscene_", string.Empty);
                            sceneModel = helper.GetModel(scene);
                            if (sceneModel != null)
                            {
#if DEBUG
                                Log.Info("sceneModel.Type = " + sceneModel.SceneType.ToString());
#endif
                                if (sceneModel.SceneType == QR_SCENE_Type.WithDraw)
                                {        //提现场景(未关注时)
                                    echostr      = ProcessWithDrawScene(requestSubscribe, scene, sceneModel);
                                    actionResult = Content(echostr);
                                }
                                else if (sceneModel.SceneType == QR_SCENE_Type.Bonus)
                                {
                                    //TODO:ZJT 用户通过场景二维码扫描关注后 推送消息给用户
                                    //isActivityBonus用于判断激发关注事件的是活动红包还是其他
                                    isActivityBonus = true;
                                    actionResult    = SendActivityToUser(sceneModel.Object, requestBaseMsg);
                                }
                                else if (sceneModel.SceneType == QR_SCENE_Type.FlashSaleRemind)
                                {
#if DEBUG
                                    Log.Info("进入限时购场景二维码事件");
#endif
                                    long flashSaleId = (long)sceneModel.Object;
                                    SendFlashSaleRemindMessage(flashSaleId, requestBaseMsg.FromUserName);
                                }
                                else if (sceneModel.SceneType == QR_SCENE_Type.Binding)        //绑定微信
                                {
                                    echostr      = Binding(requestSubscribe, scene, sceneModel);
                                    actionResult = Content(echostr);
                                }
                            }
                        }
                        #endregion
                        Log.Info("开始isActivityBonus=" + isActivityBonus);

                        //通过场景二维码进来,并且二维码不是活动红包,则进行关注送红包事件
                        //if (!isActivityBonus && sceneModel != null && sceneModel.SceneType == QR_SCENE_Type.Bonus)
                        //{
                        // actionResult = SendAttentionToUser(requestBaseMsg);
                        //}

#if DEBUG
                        Log.Info("开始Subscribe requestBaseMsg.FromUserName="******"进入限时购场景二维码事件");
                                    long flashSaleId = (long)sceneModel.Object;
                                    SendFlashSaleRemindMessage(flashSaleId, requestBaseMsg.FromUserName);
                                }
                                else if (sceneModel.SceneType == QR_SCENE_Type.Binding)        //绑定微信
                                {
                                    echostr      = Binding(requestScan, requestScan.EventKey, sceneModel);
                                    actionResult = Content(echostr);
                                }
                                else if (sceneModel.SceneType == QR_SCENE_Type.ShopShipper)        //绑定收发货
                                {
                                    echostr      = BindingByShopShipper(requestScan, requestScan.EventKey, sceneModel);
                                    actionResult = Content(echostr);
                                }
                            }
                        }
                        break;

                    case Event.card_pass_check:
                        //TODO:DZY[150907] 卡券审核通过
                        var reqpasscard = requestMsg as Senparc.Weixin.MP.Entities.RequestMessageEvent_Card_Pass_Check;
                        if (!string.IsNullOrWhiteSpace(reqpasscard.CardId))
                        {
                            cardser.Event_Audit(reqpasscard.CardId, Entities.WXCardLogInfo.AuditStatusEnum.Audited);
                        }
                        break;

                    case Event.card_not_pass_check:
                        //TODO:DZY[150907] 卡券审核失败
                        var reqnopasscard = requestMsg as Senparc.Weixin.MP.Entities.RequestMessageEvent_Card_Pass_Check;
                        if (!string.IsNullOrWhiteSpace(reqnopasscard.CardId))
                        {
                            cardser.Event_Audit(reqnopasscard.CardId, Entities.WXCardLogInfo.AuditStatusEnum.AuditNot);
                        }
                        break;

                    case Event.user_del_card:
                        //TODO:DZY[150907] 删除卡包内优惠券
                        var requdelcard = requestMsg as Senparc.Weixin.MP.Entities.RequestMessageEvent_User_Del_Card;
                        if (!string.IsNullOrWhiteSpace(requdelcard.CardId) && !string.IsNullOrWhiteSpace(requdelcard.UserCardCode))
                        {
                            cardser.Event_Unavailable(requdelcard.CardId, requdelcard.UserCardCode);
                        }
                        break;

                    case Event.user_get_card:
                        //TODO:DZY[150907] 用户获取优惠券
                        var requgetcard = requestMsg as Senparc.Weixin.MP.Entities.RequestMessageEvent_User_Get_Card;
                        Log.Debug("WXCard:" + requgetcard.CardId + "_" + requgetcard.UserCardCode);
                        if (!string.IsNullOrWhiteSpace(requgetcard.CardId) && !string.IsNullOrWhiteSpace(requgetcard.UserCardCode))
                        {
                            cardser.Event_Send(requgetcard.CardId, requgetcard.UserCardCode, requgetcard.FromUserName, requgetcard.OuterId);
                        }
                        break;
                    }
                    break;

                    #endregion
                case RequestMsgType.Text:
                    textCase(requestBaseMsg);
                    break;
                }
                Response.End();
            }
            return(actionResult);
        }
Example #5
0
        private readonly string Token = "weixin";//与微信公众账号后台的Token设置保持一致,区分大小写。

        protected void Page_Load(object sender, EventArgs e)
        {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

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

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

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

                try
                {
                    //测试时可开启此记录,帮助跟踪数据
                    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());
                    return;
                }
                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("");
                }
                finally
                {
                    Response.End();
                }
            }
        }
Example #6
0
        /// <summary>
        /// 开始处理
        /// </summary>
        public void Processing()
        {
            HttpContext context = HttpContext.Current;

            if (context == null || context.Request == null)
            {
                throw new Exception("HttpContext信息错误");
            }

            this.Signature = context.Request.QueryString["signature"];
            this.TimeStamp = context.Request.QueryString["timestamp"];
            this.Nonce     = context.Request.QueryString["nonce"];
            this.Echostr   = context.Request.QueryString["echostr"];

            this.EncryptType  = context.Request.QueryString["encrypt_type"];
            this.MsgSignature = context.Request.QueryString["msg_signature"];

            if (AppSettings.IsDebug)
            {
                //DebugLog
                Logger.Info("MsgSig = " + MsgSignature);
                Logger.Info("Signature = " + Signature);
                Logger.Info("TimeStamp = " + TimeStamp);
                Logger.Info("Nonce = " + Nonce);
                Logger.Info("Echostr = " + Echostr);
                Logger.Info("EncryptType = " + EncryptType);
                Logger.Info("MsgSignature = " + MsgSignature);
            }

            if (string.IsNullOrEmpty(this.Signature) ||
                string.IsNullOrEmpty(this.TimeStamp) ||
                string.IsNullOrEmpty(this.Nonce))
            {
                throw new Exception("HttpContext信息错误");
            }
            //校验Token签名(请求来源是否为微信服务器)
            if (!CheckSignature.Check(this.Signature, this.TimeStamp, this.Nonce, WechatConfig.Token))
            {
                throw new Exception("ERR: VerifyURL Fail, 签名校验失败。");
            }

            int ret = 0;

            #region 首次配置服务器信息时,直接返回Echostr
            if (!string.IsNullOrEmpty(this.Echostr))
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write(Echostr);
                return;
            }
            #endregion

            //获取post请求内容
            StreamReader postData       = new StreamReader(context.Request.InputStream);
            string       postDataString = postData.ReadToEnd();

            if (AppSettings.IsDebug)
            {
                Logger.Info("postDataString = " + postDataString);
            }


            if (EncryptType == "aes")
            {
                //解密
                ret = Wxcpt.DecryptMsg(MsgSignature, TimeStamp, Nonce, postDataString, ref postDataString);
                if (ret != 0)
                {
                    throw new Exception("ERR: Decrypt Fail, errorCode: " + ret);
                }
            }
            if (AppSettings.IsDebug)
            {
                Logger.Info("sMsg = " + postDataString);
            }


            //解析XML
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(postDataString);

            ReceiveMessageEnum  messageType   = ReceiveMessageEnum.Unknow;
            ReceiveMessage.Base messageEntity = ReceiveMessageParser.Parse(doc, ref messageType);
            ReplyMessage.Base   retMessage    = null;

            #region 根据接收消息类型 执行相应事件
            switch (messageType)
            {
            case ReceiveMessageEnum.Unknow:
                throw new Exception("未知的接收消息类型。");

            case ReceiveMessageEnum.Text:
                if (ProcessingText != null)
                {
                    ProcessingTextEventArgs e = new ProcessingTextEventArgs(messageEntity as ReceiveMessage.Text);
                    ProcessingText(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Image:
                if (ProcessingImage != null)
                {
                    ProcessingImageEventArgs e = new ProcessingImageEventArgs(messageEntity as ReceiveMessage.Image);
                    ProcessingImage(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Voice:
                if (ProcessingVoice != null)
                {
                    ProcessingVoiceEventArgs e = new ProcessingVoiceEventArgs(messageEntity as ReceiveMessage.Voice);
                    ProcessingVoice(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Video:
                if (ProcessingVideo != null)
                {
                    ProcessingVideoEventArgs e = new ProcessingVideoEventArgs(messageEntity as ReceiveMessage.Video);
                    ProcessingVideo(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.ShortVideo:
                break;

            case ReceiveMessageEnum.Location:
                if (ProcessingLocation != null)
                {
                    ProcessingLocationEventArgs e = new ProcessingLocationEventArgs(messageEntity as ReceiveMessage.Location);
                    ProcessingLocation(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Link:
                break;

            case ReceiveMessageEnum.Event_Subscribe:
                if (ProcessingEventSubscribe != null)
                {
                    ProcessingEventSubscribeEventArgs e = new ProcessingEventSubscribeEventArgs(messageEntity as ReceiveMessage.EventSubscribe);
                    ProcessingEventSubscribe(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Event_Scan:
                break;

            case ReceiveMessageEnum.Event_Location:
                //如果开启位置记录,则缓存
                if (this.EnablePositionRecord)
                {
                    if (AppSettings.IsDebug)
                    {
                        Logger.Info("enablePositionRecord! key = " + CacheKey.UserLocation + messageEntity.FromUserName);
                    }
                    HttpContext.Current.Cache.Insert(CacheKey.UserLocation + messageEntity.FromUserName,
                                                     messageEntity,
                                                     null,
                                                     DateTime.UtcNow.AddHours(this.PositionRecordExpiresHours),
                                                     System.Web.Caching.Cache.NoSlidingExpiration);
                }
                if (ProcessingEventLocation != null)
                {
                    ProcessingEventLocationEventArgs e = new ProcessingEventLocationEventArgs(messageEntity as ReceiveMessage.EventLocation);
                    ProcessingEventLocation(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Event_Click:
                if (ProcessingEventClick != null)
                {
                    ProcessingEventClickEventArgs e = new ProcessingEventClickEventArgs(messageEntity as ReceiveMessage.EventClick);
                    ProcessingEventClick(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            case ReceiveMessageEnum.Event_View:
                break;

            case ReceiveMessageEnum.Event_MasssEndJobFinish:
                if (ProcessingEventMasssEndJobFinish != null)
                {
                    ProcessingEventMasssEndJobFinishEventArgs e = new ProcessingEventMasssEndJobFinishEventArgs(messageEntity as ReceiveMessage.EventMasssEndJobFinish);
                    ProcessingEventMasssEndJobFinish(this, e);
                    retMessage = e.ReplyMessage;
                }
                break;

            default:
                throw new Exception("未知的接收消息类型。");
            }

            #endregion


            if (AppSettings.IsDebug)
            {
                if (retMessage == null)
                {
                    Logger.Info("retMessage = null");
                }
                else
                {
                    Logger.Log("retMessage = " + retMessage.ToString());
                }
            }

            string replyMsg = ""; //xml格式字符串(明文或加密)

            if (retMessage != null)
            {
                //未加密明文字符串
                replyMsg = ReplyMessageBuilder.BuildXml(retMessage);

                if (AppSettings.IsDebug)
                {
                    Logger.Info("replyMsg = " + replyMsg);
                }

                if (EncryptType == "aes")
                {
                    //加密
                    //replyMsg变为xml格式的密文
                    ret = Wxcpt.EncryptMsg(replyMsg, TimeStamp, Nonce, ref replyMsg);
                    if (ret != 0)
                    {
                        throw new Exception("ERR: Encrypt Fail, errorCode: " + ret);
                    }

                    if (AppSettings.IsDebug)
                    {
                        Logger.Info("sEncryptMsg = " + replyMsg);
                    }
                }
            }

            context.Response.ContentType = "text/plain";
            context.Response.Write(replyMsg);
        }
Example #7
0
        private readonly string Token = "YTWL414128";//与微信公众账号后台的Token设置保持一致,区分大小写。
        protected void Page_Load(object sender, EventArgs e)
        {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            if (Request.HttpMethod == "GET")
            {
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token));
                }
            }
            else
            {
                //判断Post或其他方式请求
                //post method - 当有用户想公众账号发送消息时触发
                if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent("参数错误!");
                    return;
                }

                //post method - 当有用户想公众账号发送消息时触发
                var postModel = new PostModel()
                {
                    Signature     = Request.QueryString["signature"],
                    Msg_Signature = Request.QueryString["msg_signature"],
                    Timestamp     = Request.QueryString["timestamp"],
                    Nonce         = Request.QueryString["nonce"],
                    //以下保密信息不会(不应该)在网络上传播,请注意
                    Token          = Token,
                    EncodingAESKey = "mNnY5GekpChwqhy2c4NBH90g3hND6GeI4gii2YCvKLY", //根据自己后台的设置保持一致
                    AppId          = "wx669ef95216eef885"                           //根据自己后台的设置保持一致
                };

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

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

                try
                {
                    //测试时可开启此记录,帮助跟踪数据,使用前请确保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());
                    return;
                }
                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();
                    }
                }
                finally
                {
                    Response.End();
                }
            }
            Response.End();
        }
Example #8
0
        protected void Page_Load(object sender, EventArgs e)
        {
            string Token = "";//与微信公众账号后台的Token设置保持一致,区分大小写。
            int    wid   = 0;

            wid = MyCommFun.RequestInt("apiid");

            if (wid <= 0)
            {
                WriteContent("参数非法");
                return;
            }

            wx_userweixin wbll = new wx_userweixin();

            Token = wbll.GetWeiXinToken(wid);
            if (Token == null || string.IsNullOrEmpty(Token))
            {
                WriteContent("不存在该微信号!");
                return;
            }

            // Token = "uweixin";
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            if (Request.HttpMethod == "GET")
            {
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    WriteContent("failed:" + signature + ",token:" + Token + " " + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                                 "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                }
                Response.End();
            }
            else
            {
                //post method - 当有用户想公众账号发送消息时触发
                //本地测试的时候注释掉 ----start -----

                if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent("参数错误!");
                    return;
                }

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

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

                try
                {
                    //测试时可开启此记录,帮助跟踪数据,使用前请确保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());
                    return;
                }
                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("");
                }
                finally
                {
                    Response.End();
                }
            }
        }
Example #9
0
        public void ProcessRequest(HttpContext context)
        {
            //app.CreateLogs(new SugarModel.SystemLogs()
            //{ Source = "weixin", Title = "begin", Message = "进入,开始" });
            try
            {
                string signature = context.Request["signature"];
                string timestamp = context.Request["timestamp"];
                string nonce     = context.Request["nonce"];
                string echostr   = context.Request["echostr"];
                string code      = context.Request["code"];

                //app.CreateLogs(new SugarModel.Logs()
                //{ Source = "weixin", Title = "param ", Message = context.Request.ToString() });

                if (context.Request.HttpMethod == "GET")
                {
                    //app.CreateLogs(new SugarModel.Logs()
                    //{ Source = "weixin", Title = "get", Message = "进入回调 get" });

                    if (code != null && code.Length > 0)
                    {
                        string  accesstoken  = HttpHelper.sendHttpPost("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WeiXinConfig.AppId + "&secret=" + WeiXinConfig.AppSecret + "&code=" + code + "&grant_type=authorization_code", null, "Get");
                        JObject accesstokenp = JObject.Parse(accesstoken);

                        string  userinf  = HttpHelper.sendHttpPost("https://api.weixin.qq.com/sns/userinfo?access_token=" + accesstokenp["access_token"] + "&openid=" + accesstokenp["openid"] + "&lang=zh_CN", null, "Get");
                        JObject userinfp = JObject.Parse(userinf);

                        string nickName   = userinfp["nickname"].ToString();
                        string openid     = userinfp["openid"].ToString();
                        string headimgurl = userinfp["headimgurl"].ToString();
                    }
                    else
                    {
                        if (CheckSignature.Check(signature, timestamp, nonce, WeiXinConfig.WeixinToken))
                        {
                            context.Response.Output.Write(echostr);
                        }
                    }
                }
                else
                {
                    //app.CreateLogs(new SugarModel.Logs()
                    //{ Source = "weixin", Title = "post", Message = "进入回调 post" });

                    if (!CheckSignature.Check(signature, timestamp, nonce, WeiXinConfig.WeixinToken))
                    {
                        //app.CreateLogs(new SugarModel.Logs()
                        //{ Source = "weixin", Title = "500", Message = "参数错误" });

                        context.Response.Output.Write("参数错误");
                    }

                    //拼接Post参数模型
                    var postModel = new PostModel()
                    {
                        Signature      = context.Request.QueryString["signature"],
                        Msg_Signature  = context.Request.QueryString["msg_signature"],
                        Timestamp      = context.Request.QueryString["timestamp"],
                        Nonce          = context.Request.QueryString["nonce"],
                        Token          = WeiXinConfig.WeixinToken,
                        EncodingAESKey = WeiXinConfig.EncodingAESKey, //根据自己后台的设置保持一致
                        AppId          = WeiXinConfig.AppId           //根据自己后台的设置保持一致
                    };

                    //app.CreateLogs(new SugarModel.Logs()
                    //{ Source = "weixin", Title = "call", Message = "回调事件执行----前" });

                    //回调事件
                    var maxRecordCount = 10;
                    var messageHandler = new CustomMessageHandler(context.Request.InputStream, postModel, maxRecordCount);

                    //app.CreateLogs(new SugarModel.Logs()
                    //{ Source = "weixin", Title = "call", Message = "回调事件执行----后" });

                    messageHandler.Execute();
                    context.Response.Output.Write(messageHandler.ResponseDocument.ToString());
                }
            }
            catch (Exception ex)
            {
                //app.CreateLogs(new SugarModel.Logs()
                //{ Source = "weixin", Title = "catch", Message = ex.Message });
            }
        }
Example #10
0
        public ActionResult Get(PostModel postModel, string echostr, string appId)
        {
            int wxId = 0;

            if (string.IsNullOrWhiteSpace(appId) && !int.TryParse(appId, out wxId))
            {
                return(Content("未知平台接入!"));
            }
            wxId = Convert.ToInt32(appId);
            Weixin_Sys_Info wxInfo = null;

            using (SeekAskContext context = new SeekAskContext())
            {
                wxInfo = context.Weixin_Sys_Info.FirstOrDefault(p => p.WxId == wxId);

                if (wxInfo == null)
                {
                    return(Content("平台未新增管理代号(" + appId + ")!"));
                }

                bool isCheckSignature = CheckSignature.Check(postModel.Signature, postModel.Timestamp,
                                                             postModel.Nonce, wxInfo.Wx_Token);

                #region 记录接入日志
                try
                {
                    Szx_Sys_Log log = new Szx_Sys_Log()
                    {
                        LogID       = Guid.NewGuid().ToString("N"),
                        LogName     = "微信接入验证",
                        Source      = "01",
                        LevelCode   = 0,
                        RequestUrl  = HttpContext.Request.Url.ToString(),
                        LogDate     = DateTime.Now,
                        Message     = "验证结果:" + isCheckSignature,
                        Create_Id   = "wxjk",
                        Create_Name = "微信接口",
                        Create_Time = DateTime.Now,
                        Create_IP   = WebSiteTools.GetRequestIP()
                    };
                    context.Szx_Sys_Log.Add(log);
                    context.SaveChanges();
                }
                catch (Exception) { }
                #endregion

                if (isCheckSignature)
                {
                    try
                    {
                        wxInfo.Wx_Status = 1;   //状态改为已对接
                        context.SaveChanges();
                    }
                    catch (Exception) { }

                    return(Content(echostr)); //返回随机字符串则表示验证通过
                }
                else
                {
                    return(Content("failed:" + postModel.Signature + "," +
                                   CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, wxInfo.Wx_Token) + "。" +
                                   "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"));
                }
            }
        }
Example #11
0
        public ActionResult Post(PostModel postModel, string appId)
        {
            int wxId = 0;

            if (string.IsNullOrWhiteSpace(appId) && !int.TryParse(appId, out wxId))
            {
                return(Content("未知平台接入!"));
            }
            wxId = Convert.ToInt32(appId);
            Weixin_Sys_Info wxInfo = null;

            using (SeekAskContext context = new SeekAskContext())
            {
                wxInfo = context.Weixin_Sys_Info.FirstOrDefault(p => p.WxId == wxId);

                if (wxInfo == null)
                {
                    return(Content("平台未新增管理代号(" + appId + ")!"));
                }

                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wxInfo.Wx_Token))
                {
                    return(Content("参数错误!"));
                }

                postModel.Token          = wxInfo.Wx_Token;          //根据自己后台的设置保持一致
                postModel.EncodingAESKey = wxInfo.Wx_EncodingAESKey; //根据自己后台的设置保持一致
                postModel.AppId          = wxInfo.Wx_AppId;          //根据自己后台的设置保持一致

                var maxRecordCount = 10;

                //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
                var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);
                try
                {
                    /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                     * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                    messageHandler.OmitRepeatedMessage = true;

                    //执行微信处理过程
                    messageHandler.Execute();

                    #region 记录微信操作日志
                    try
                    {
                        if (!messageHandler.CancelExcute)
                        {
                            Weixin_Msg_Request msgRequest = new Weixin_Msg_Request();
                            msgRequest.WxId    = wxInfo.WxId;
                            msgRequest.MsgType = messageHandler.RequestMessage.MsgType.ToString();
                            if (messageHandler.RequestMessage.MsgType != RequestMsgType.Event)
                            {
                                msgRequest.MsgId = messageHandler.RequestMessage.MsgId.ToString();
                            }
                            else
                            {
                                msgRequest.MsgId = Guid.NewGuid().ToString("N");
                            }

                            msgRequest.FromUserName = messageHandler.RequestMessage.FromUserName;
                            msgRequest.ToUserName   = messageHandler.RequestMessage.ToUserName;
                            msgRequest.Encrypt      = null;
                            msgRequest.CreateTime   = messageHandler.RequestMessage.CreateTime;
                            msgRequest.XmlDocument  = messageHandler.RequestDocument.ToString();
                            context.Weixin_Msg_Request.Add(msgRequest);
                            context.SaveChanges();
                        }
                    }
                    catch (Exception) { }
                    #endregion

                    //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                    //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                    return(new WeixinResult(messageHandler));//v0.8+
                }
                catch (Exception ex)
                {
                    #region 记录系统日志
                    try
                    {
                        Szx_Sys_Log log = new Szx_Sys_Log()
                        {
                            LogID       = Guid.NewGuid().ToString("N"),
                            LogName     = "微信消息处理",
                            Source      = "01",
                            LevelCode   = 2,
                            RequestUrl  = HttpContext.Request.Url.ToString(),
                            LogDate     = DateTime.Now,
                            Message     = "处理异常:" + ex.Message,
                            Create_Id   = "wxjk",
                            Create_Name = "微信接口",
                            Create_Time = DateTime.Now,
                            Create_IP   = WebSiteTools.GetRequestIP()
                        };
                        context.Szx_Sys_Log.Add(log);
                        context.SaveChanges();
                    }
                    catch (Exception) { }
                    #endregion
                }
            }

            return(Content("参数错误!"));
        }
        public ActionResult Post(PostModel postModel)
        {
            //Loger.Current.Write("WeixinController.Post() begin");
            try
            {
                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
                {
                    return(Content("参数错误!"));
                }

                postModel.Token          = Token;
                postModel.EncodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"]; //根据自己后台的设置保持一致
                postModel.AppId          = ConfigurationManager.AppSettings["AppId"];          //根据自己后台的设置保持一致

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

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

                try
                {
                    //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                    //Loger.Current.Write("WeixinController.Post() RequestDocument=\r\n" + messageHandler.RequestDocument.ToString());
                    if (messageHandler.UsingEcryptMessage)
                    {
                        //Loger.Current.Write("WeixinController.Post() EcryptRequestDocument=\r\n" + messageHandler.EcryptRequestDocument.ToString());
                    }

                    /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                     * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                    messageHandler.OmitRepeatedMessage = true;

                    //执行微信处理过程
                    messageHandler.Execute();

                    //测试时可开启,帮助跟踪数据
                    //Loger.Current.Write("WeixinController.Post() ResponseDocument=\r\n" + messageHandler.ResponseDocument.ToString());
                    if (messageHandler.UsingEcryptMessage)
                    {
                        //记录加密后的响应信息
                        //Loger.Current.Write("WeixinController.Post() FinalResponseDocument=\r\n" + messageHandler.FinalResponseDocument.ToString());
                    }

                    //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                    return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                    //return new WeixinResult(messageHandler);//v0.8+
                }
                catch (Exception ex)
                {
                    Loger.Current.Write("WeixinController.Post() err=" + ex.Message);
                    if (messageHandler.ResponseDocument != null)
                    {
                        //Loger.Current.Write("WeixinController.Post() ResponseDocument=\r\n" + messageHandler.ResponseDocument.ToString());
                    }
                    return(Content(""));
                }
            }
            catch (Exception ex)
            {
                Loger.Current.Write("WeixinController.Post() err=" + ex.Message);
                return(Content(""));
            }
        }
Example #13
0
        public ActionResult Post(PostModel postModel /*,[FromBody]string requestXml*/)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, token))
            {
                return(Content("参数错误!"));
            }

            #region 打包 PostModel 信息

            postModel.Token          = token;          //根据自己后台的设置保持一致
            postModel.EncodingAESKey = encodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = appId;          //根据自己后台的设置保持一致

            #endregion

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

            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。

#if NET45
            var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);
#else
            string body        = new StreamReader(Request.Body).ReadToEnd();
            byte[] requestData = Encoding.UTF8.GetBytes(body);
            Stream inputStream = new MemoryStream(requestData);

            //var inputStream = Request.Body;
            //byte[] buffer = new byte[Request.ContentLength ?? 0];
            //inputStream.Read(buffer, 0, buffer.Length);
            //var requestXmlStream = new MemoryStream(buffer);
            //var requestXml = Encoding.UTF8.GetString(buffer);


            //int bytesRead = 0;
            //while ((bytesRead = Request.Body.Read(buffer, 0, buffer.Length)) != 0)
            //{
            //    inputStream.Write(buffer, 0, bytesRead);
            //}

            //Request.Body.CopyTo(inputStream);

            var messageHandler = new CustomMessageHandler(inputStream, postModel, maxRecordCount);
#endif

            try
            {
                #region 记录 Request 日志

                var logPath = Server.GetMapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));
                if (!Directory.Exists(logPath))
                {
                    Directory.CreateDirectory(logPath);
                }

                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。

                var requestDocumentFileName       = Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName));
                var ecryptRequestDocumentFileName = Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName));
#if NET45
                messageHandler.RequestDocument.Save(requestDocumentFileName);
                if (messageHandler.UsingEcryptMessage)
                {
                    messageHandler.EcryptRequestDocument.Save(ecryptRequestDocumentFileName);
                }
#else
                using (FileStream fs = new FileStream(requestDocumentFileName, FileMode.CreateNew, FileAccess.ReadWrite))
                {
                    messageHandler.RequestDocument.Save(fs);
                }
                if (messageHandler.UsingEcryptMessage)
                {
                    using (FileStream fs = new FileStream(ecryptRequestDocumentFileName, FileMode.CreateNew, FileAccess.ReadWrite))
                    {
                        messageHandler.EcryptRequestDocument.Save(fs);
                    }
                }
#endif


                #endregion

                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;

                //执行微信处理过程
                messageHandler.Execute();

                #region 记录 Response 日志

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

                //if (messageHandler.ResponseDocument == null)
                //{
                //    throw new Exception(messageHandler.RequestDocument.ToString());
                //}

                var responseDocumentFileName       = Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName));
                var ecryptResponseDocumentFileName = Path.Combine(logPath, string.Format("{0}_Response_Final_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName));

                if (messageHandler.ResponseDocument != null)
                {
                    using (FileStream fs = new FileStream(responseDocumentFileName, FileMode.CreateNew, FileAccess.ReadWrite))
                    {
                        messageHandler.ResponseDocument.Save(fs);
                    }
                }

                if (messageHandler.UsingEcryptMessage && messageHandler.FinalResponseDocument != null)
                {
                    using (FileStream fs = new FileStream(ecryptResponseDocumentFileName, FileMode.CreateNew, FileAccess.ReadWrite))
                    {
                        //记录加密后的响应信息
                        messageHandler.FinalResponseDocument.Save(fs);
                    }
                }

                #endregion `

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                //return new WeixinResult(messageHandler);//v0.8+
                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            }
            catch (Exception ex)
            {
                #region 异常处理
                WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);


                using (var fs = new FileStream(Server.GetMapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt"), FileMode.CreateNew, FileAccess.ReadWrite))
                {
                    using (TextWriter tw = new StreamWriter(fs))
                    {
                        tw.WriteLine("ExecptionMessage:" + ex.Message);
                        tw.WriteLine(ex.Source);
                        tw.WriteLine(ex.StackTrace);
                        //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                        tw.Flush();
                        //tw.Close();
                    }
                }
                return(Content(""));

                #endregion
            }
        }
Example #14
0
        public ActionResult Post(PostModel postModel)
        {
            GzhCfg gzh = dp2WeiXinService.Instance.gzhContainer.GetDefault();

            if (string.IsNullOrEmpty(postModel.AppId) == false)
            {
                gzh = dp2WeiXinService.Instance.gzhContainer.GetByAppId(postModel.AppId);
                dp2WeiXinService.Instance.WriteErrorLog1("惊喜post中有appId=" + postModel.AppId);
            }

            if (gzh == null)
            {
                string tempError = "Post未找到公众号[" + postModel.AppId + "]的配置信息。";
                dp2WeiXinService.Instance.WriteErrorLog1(tempError);
                return(new WeixinResult(tempError));
            }

            // 本机调试注掉
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, gzh.token))
            {
                return(Content("参数错误!"));
            }

            //string appId = dp2WeiXinService.Instance.gzhContainer.GetDefault().appId;
            //postModel.AppId = appId;



            // 开始时间
            DateTime start_time = DateTime.Now;

            //与公众后台的设置保持一致
            postModel.AppId          = gzh.appId;
            postModel.Token          = gzh.token;
            postModel.EncodingAESKey = gzh.encodingAESKey;


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

            // 日志总目录,使用前请确保App_Data文件夹存在,且有读写权限。
            var logDir = dp2WeiXinService.Instance.weiXinLogDir;

            //// 当日日志目录,用于详细输出消息
            //var logToday =string.Format(logDir + "/{0}/", DateTime.Now.ToString("yyyy-MM-dd"));
            //if (!Directory.Exists(logToday))
            //{
            //    Directory.CreateDirectory(logToday);
            //}

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

            try
            {
                ////测试时可开启此记录,帮助跟踪数据
                //string id=_getRandomFileName();
                //string tempPath = Path.Combine(logToday, string.Format("{0}_Request_{1}.txt", id, messageHandler.RequestMessage.FromUserName));
                //messageHandler.RequestDocument.Save(tempPath);
                //if (messageHandler.UsingEcryptMessage)
                //{
                //    tempPath = Path.Combine(logToday, string.Format("{0}_Request_Ecrypt_{1}.txt", id, messageHandler.RequestMessage.FromUserName));
                //    messageHandler.EcryptRequestDocument.Save(tempPath);
                //}

                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                //messageHandler.OmitRepeatedMessage = true;

                //执行微信处理过程
                messageHandler.Execute();

                //////测试时可开启,帮助跟踪数据
                //if (messageHandler.ResponseDocument != null)
                //{
                //    //tempPath = Path.Combine(logToday, string.Format("{0}_Response_{1}.txt", id, messageHandler.RequestMessage.FromUserName));
                //    string path = dp2WeiXinService.Instance.weiXinDataDir+"/test.txt";
                //    messageHandler.ResponseDocument.Save(path);
                //}
                //if (messageHandler.UsingEcryptMessage)
                //{
                //    //记录加密后的响应信息
                //    tempPath = Path.Combine(logToday, string.Format("{0}_Response_Final_{1}.txt", id, messageHandler.RequestMessage.FromUserName));
                //    messageHandler.FinalResponseDocument.Save(tempPath);
                //}

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可

                // 测试异常
                //throw new Exception("test");



                // 计算处理消息用了多少时间
                TimeSpan time_length   = DateTime.Now - start_time;
                string   strMsgContext = "";
                if (messageHandler.RequestMessage is RequestMessageText)
                {
                    strMsgContext = ((RequestMessageText)messageHandler.RequestMessage).Content;
                }
                string info = "处理[" + messageHandler.RequestMessage.CreateTime + "-" + messageHandler.RequestMessage.MsgType.ToString() + "-" + strMsgContext + "]消息,time span: " + time_length.TotalSeconds.ToString() + " secs";
                if (time_length.TotalSeconds > 5)
                {
                    info = "请求超时:" + info;
                    dp2WeiXinService.Instance.WriteLog1(info);
                }
                else
                {
                    dp2WeiXinService.Instance.WriteLog3(info);
                }

                // 发送客服消息
                //messageHandler.SendCustomeMessage(info);

                // 如果消息是空内容,直接返回空,这样微信就不是重试了,用于 用户请求书目详细消息,公众号以客户消息返回
                if (messageHandler.ResponseMessage is ResponseMessageText)
                {
                    var mess = (ResponseMessageText)messageHandler.ResponseMessage;
                    if (String.IsNullOrEmpty(mess.Content) == true)
                    {
                        return(Content(""));
                    }
                }
                return(new WeixinResult(messageHandler.TextResponseMessage));// ResponseMessage);//v0.8+
            }
            catch (Exception ex)
            {
                // 发送客服消息
                //messageHandler.SendCustomeMessage("异常:" + ex.Message);

                string error = "ExecptionMessage:" + ex.Message + "\n";
                error += ex.Source + "\n";
                error += ex.StackTrace + "\n";
                if (ex.InnerException != null)
                {
                    error += "========= InnerException =========" + "\n";;
                    error += ex.InnerException.Message + "\n";;
                    error += ex.InnerException.Source + "\n";;
                    error += ex.InnerException.StackTrace + "\n";;
                }

                //将程序运行中发生的错误记录到日志
                dp2WeiXinService.Instance.WriteErrorLog1(error);

                // 返回error信息
                return(new WeixinResult(error));
            }
        }
Example #15
0
        public ActionResult Index(string url, string token, RequestMsgType requestType, Event?eventType,
                                  bool testConcurrence, int testConcurrenceCount,
                                  bool testEncrypt, string encodingAESKey, string appId)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                var requestMessaageDoc = GetrequestMessaageDoc(/*url, token,*/ requestType, eventType);
                requestMessaageDoc.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);

                string msgSigature    = null;
                var    timeStamp      = SystemTime.NowTicks.ToString();
                var    nonce          = (SystemTime.NowTicks * 2).ToString();
                string encryptTypeAll = null;
                string openIdAll      = null;

                //对请求消息进行加密
                if (testEncrypt)
                {
                    try
                    {
                        var openId     = requestMessaageDoc.Root.Element("FromUserName").Value;
                        var toUserName = requestMessaageDoc.Root.Element("ToUserName").Value;

                        WXBizMsgCrypt msgCrype         = new WXBizMsgCrypt(token, encodingAESKey, appId);
                        string        finalResponseXml = null;
                        var           ret = msgCrype.EncryptRequestMsg(requestMessaageDoc.ToString(), timeStamp, nonce, toUserName, ref finalResponseXml, ref msgSigature);

                        if (ret == 0)
                        {
                            requestMessaageDoc = XDocument.Parse(finalResponseXml);//赋值最新的加密信息
                            openIdAll          = $"openid={openId}";
                            encryptTypeAll     = "&encrypt_type=aes";
                        }
                    }
                    catch (Exception ex)
                    {
                        var data = new { Success = false, LoadTime = "N/A", Result = "发生错误:" + ex.ToString() };
                        return(Json(data, new JsonSerializerSettings()
                        {
                            ContractResolver = new DefaultContractResolver()
                        }));

                        throw;
                    }

                    //Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("模拟测试-加密消息:", requestMessaageDoc?.ToString());
                }

                var sigature = CheckSignature.GetSignature(timeStamp, nonce, token);

                url += url.Contains("?") ? "&" : "?";
                url += $"signature={sigature}&timeStamp={timeStamp}&nonce={nonce}&msg_signature={msgSigature}{encryptTypeAll}{openIdAll}";
                //参数如:signature=330ed3b64e363dc876f35e54a79e59b48739f567&timestamp=1570075722&nonce=863153744&openid=olPjZjsXuQPJoV0HlruZkNzKc91E&encrypt_type=aes&msg_signature=71dc359205a4660bc3b3046b643452c994b5897d

                var dt1 = SystemTime.Now;
                var responseMessageXml = MessageAgent.RequestXml(null, url, token, requestMessaageDoc.ToString(), autoFillUrlParameters: false);

                if (string.IsNullOrEmpty(responseMessageXml))
                {
                    responseMessageXml = "返回消息为空,可能已经被去重。\r\nMsgId相同的连续消息将被自动去重。";
                }

                try
                {
                    if (testConcurrence)
                    {
                        dt1 = SystemTime.Now;
                        testConcurrenceCount = testConcurrenceCount > 30 ? 30 : testConcurrenceCount;//设定最高限额

                        //模拟并发请求
                        List <Task <string> > taskList = new List <Task <string> >();
                        for (int i = 0; i < testConcurrenceCount; i++)
                        {
                            var task = TestAsyncTask(url, token, requestMessaageDoc, autoFillUrlParameters: false, sleepMillionSeconds: 100);
                            taskList.Add(task);
                        }
                        Task.WaitAll(taskList.ToArray(), 1500 * 10);
                    }

                    var cache = CacheStrategyFactory.GetObjectCacheStrategyInstance();
                    var data  = new
                    {
                        Success          = true,
                        LoadTime         = SystemTime.DiffTotalMS(dt1, "f4"),
                        Result           = responseMessageXml,
                        CacheType        = cache.GetType().Name,
                        ConcurrenceCount = testConcurrenceCount
                    };
                    return(Json(data, new JsonSerializerSettings()
                    {
                        ContractResolver = new DefaultContractResolver()
                    }));
                }
                catch (Exception ex)
                {
                    var msg = string.Format("{0}\r\n{1}\r\n{2}", ex.Message, null, ex.InnerException != null ? ex.InnerException.Message : null);
                    return(Json(new { Success = false, Result = msg }, new JsonSerializerSettings()
                    {
                        ContractResolver = new DefaultContractResolver()
                    }));
                }
            }
        }
Example #16
0
        protected void Page_Load(object sender, EventArgs e)
        {
            string Token = "";//与微信公众账号后台的Token设置保持一致,区分大小写。
            int    wid   = 0;

            wid = MyCommFun.RequestInt("apiid");

            if (wid <= 0)
            {
                WriteContent("参数非法");
                return;
            }
            wx_userweixin wbll = new wx_userweixin();

            Token = wbll.GetWeiXinToken(wid);
            if (Token == null || string.IsNullOrEmpty(Token))
            {
                WriteContent("不存在该微信号或账号已过期或已被禁用!");
                return;
            }


            // Token = "uweixin";
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            if (Request.HttpMethod == "GET")
            {
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    WriteContent("failed:" + signature + ",token:" + Token + " " + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                                 "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                }
                Response.End();
            }
            else
            {
                //本地测试的时候注释掉 ----start -----

                //if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                //{
                //    WriteContent("参数错误!");
                //    return;
                //}
                //本地测试的时候注释掉 ----end -----

                //post method - 当有用户想公众账号发送消息时触发
                Model.wx_userweixin uweixin = wbll.GetModel(wid);
                var postModel = new PostModel()
                {
                    Signature     = Request.QueryString["signature"],
                    Msg_Signature = Request.QueryString["msg_signature"],
                    Timestamp     = Request.QueryString["timestamp"],
                    Nonce         = Request.QueryString["nonce"],
                    //以下保密信息不会(不应该)在网络上传播,请注意
                    Token          = Token,
                    EncodingAESKey = uweixin.extStr, //根据自己后台的设置保持一致
                    AppId          = uweixin.AppId   //根据自己后台的设置保持一致
                };


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

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

                try
                {
                    //测试时可开启此记录,帮助跟踪数据,使用前请确保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"));


                    //为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 begin
                    string lastStr = "";
                    if (messageHandler != null && messageHandler.ResponseDocument != null && messageHandler.ResponseDocument.ToString().Trim() != "")
                    {
                        lastStr = messageHandler.ResponseDocument.ToString().Replace("\r\n", "\n");
                    }
                    else
                    {
                        lastStr = messageHandler.ResponseDocument.ToString();
                    }
                    // WriteContent( messageHandler.ResponseDocument.ToString());
                    //为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可 end

                    //如果自动回复已经关闭,则不返回内容,start 1220

                    WeiXCommFun wxcomm = new WeiXCommFun();
                    int         apiid  = wxcomm.getApiid();
                    if (!wxcomm.wxCloseKW(apiid))
                    {
                        lastStr = "";
                    }
                    //如果自动回复已经关闭,则不返回内容,end 1220

                    WriteContent(lastStr);
                    return;
                }
                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("");
                }
                finally
                {
                    Response.End();
                }
            }
        }
        public ActionResult CommonPost(PostModel postModel)
        {
            var account = GetAccount(GetQueryString("MpID"));

            if (account == null)
            {
                return(new WeixinResult("未添加公众号!"));//v0.8+
            }
            postModel.Token          = account.Token;
            postModel.EncodingAESKey = account.EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = account.AppID;          //根据自己后台的设置保持一致

            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, postModel.Token))
            {
                return(Content("参数错误!"));
            }

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

            var logPath = Server.MapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));

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

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

            try
            {
                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName)));
                if (messageHandler.UsingEcryptMessage)
                {
                    messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}.txt", DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName)));
                }

                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;


                //执行微信处理过程
                messageHandler.Execute();

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

                //if (messageHandler.ResponseDocument == null)
                //{
                //    throw new Exception(messageHandler.RequestDocument.ToString());
                //}

                if (messageHandler.ResponseDocument != null)
                {
                    messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName)));
                }

                if (messageHandler.UsingEcryptMessage)
                {
                    //记录加密后的响应信息
                    messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}.txt", DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName)));
                }

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                //return new WeixinResult(messageHandler);//v0.8+
            }
            catch (Exception ex)
            {
                using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
                {
                    tw.WriteLine("ExecptionMessage:" + ex.Message);
                    tw.WriteLine(ex.Source);
                    tw.WriteLine(ex.StackTrace);
                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));
            }
        }
Example #18
0
        private readonly string Token = "lsyclazjj22Oo77yy";//与微信公众账号后台的Token设置保持一致,区分大小写。

        protected void Page_Load(object sender, EventArgs e)
        {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

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

                //post method - 当有用户想公众账号发送消息时触发
                var postModel = new PostModel()
                {
                    Signature     = Request.QueryString["signature"],
                    Msg_Signature = Request.QueryString["msg_signature"],
                    Timestamp     = Request.QueryString["timestamp"],
                    Nonce         = Request.QueryString["nonce"],
                    //以下保密信息不会(不应该)在网络上传播,请注意
                    Token          = Token,
                    EncodingAESKey = "dIE8PJ6i1yJivVvd7fk3fh33EDE3QVYNlLB91cbssxI", //根据自己后台的设置保持一致
                    AppId          = "wx1b5c7dbfe9a3555d"                           //根据自己后台的设置保持一致
                };

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

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

                //try
                //{
                //    //测试时可开启此记录,帮助跟踪数据,使用前请确保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());
                //    return;
                //}
                //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();
                //    }
                //}
                //finally
                //{
                //    Response.End();
                //}
            }
        }
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            var Request = context.Request;

            Response = context.Response;
            var    Server    = context.Server;
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];
            string Token     = "myweixin";

            if (Request.HttpMethod == "GET")
            {
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                                 "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                }
                Response.End();
            }
            else
            {
                //post method - 当有用户向公众账号发送消息时触发
                if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent("参数错误!");
                    return;
                }

                //post method - 当有用户向公众账号发送消息时触发
                var postModel = new PostModel()
                {
                    Signature     = Request.QueryString["signature"],
                    Msg_Signature = Request.QueryString["msg_signature"],
                    Timestamp     = Request.QueryString["timestamp"],
                    Nonce         = Request.QueryString["nonce"],
                    //以下保密信息不会(不应该)在网络上传播,请注意
                    Token          = Token,
                    EncodingAESKey = "T79NgH9wXHWta4dwPqcGxx1z92YAl4hSreDiIkZfRWo",          //根据自己后台的设置保持一致
                    AppId          = WebConfigurationManager.AppSettings["ShortWeixinAppId"] //根据自己后台的设置保持一致
                };
                var maxRecordCount = 10;
                var messageHandler = new ShortCustomHandler(Request.InputStream, postModel, maxRecordCount);
                try
                {
                    messageHandler.Execute();
                    WriteContent(messageHandler.ResponseDocument.ToString());
                    return;
                }
                catch (Exception ex)
                {
                    Logger log = LogManager.GetCurrentClassLogger();
                    log.ErrorException("订阅号异常", 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();
                    //}
                }
                finally
                {
                    Response.End();
                }
            }
        }
Example #20
0
 public HttpResponseMessage Index(string signature, string timestamp, string nonce, string echostr)
 {
     if (CheckSignature.Check(signature, timestamp, nonce, Config.Token))
     {
         var result   = new StringContent(echostr, UTF8Encoding.UTF8, "application/x-www-form-urlencoded");
         var response = new HttpResponseMessage {
             Content = result
         };
         return(response);
     }
     return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Config.Token) + "。" +
                                        "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"));
 }
Example #21
0
        public ActionResult Post(PostModel postModel)

        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(Content("参数错误!"));
            }

            postModel.Token          = Token;
            postModel.EncodingAESKey = "";                   //根据自己后台的设置保持一致
            postModel.AppId          = GetAppSettings.AppID; //根据自己后台的设置保持一致

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

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

            try
            {
                CommonService.CustomMessageHandler.CustomMessageHandler.CreateUserInfo(messageHandler.RequestMessage.FromUserName);
                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                //messageHandler.RequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + messageHandler.RequestMessage.FromUserName + ".txt"));
                //if (messageHandler.UsingEcryptMessage)
                //{
                //    messageHandler.EcryptRequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_Ecrypt_" + messageHandler.RequestMessage.FromUserName + ".txt"));
                //}

                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;

                //执行微信处理过程
                messageHandler.Execute();

                //测试时可开启,帮助跟踪数据
                //messageHandler.ResponseDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + messageHandler.ResponseMessage.ToUserName + ".txt"));
                //if (messageHandler.UsingEcryptMessage)
                //{
                //    //记录加密后的响应信息
                //    messageHandler.FinalResponseDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_Final_" + messageHandler.ResponseMessage.ToUserName + ".txt"));
                //}

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                //return new WeixinResult(messageHandler);//v0.8+
            }
            catch (Exception ex)
            {
                //using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt")))
                //{
                //    tw.WriteLine("ExecptionMessage:" + ex.Message);
                //    tw.WriteLine(ex.Source);
                //    tw.WriteLine(ex.StackTrace);
                //    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

                //    if (messageHandler.ResponseDocument != null)
                //    {
                //        tw.WriteLine(messageHandler.ResponseDocument.ToString());
                //    }
                //    tw.Flush();
                //    tw.Close();
                //}
                return(Content(""));
            }
        }
Example #22
0
        private readonly string AppId          = WebConfigurationManager.AppSettings["AppId"];    //appid
        protected void Page_Load(object sender, EventArgs e)
        {
            string signature = Request["signature"];
            string timestamp = Request["timestamp"];
            string nonce     = Request["nonce"];
            string echostr   = Request["echostr"];

            if (Request.HttpMethod == "GET")
            {
                //get method - 仅在微信后台填写URL验证时触发
                if (CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent(echostr); //返回随机字符串则表示验证通过
                }
                else
                {
                    WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                                 "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
                }
                Response.End();
            }
            else
            {
                //post method - 当有用户想公众账号发送消息时触发
                if (!CheckSignature.Check(signature, timestamp, nonce, Token))
                {
                    WriteContent("参数错误!");
                    return;
                }
                var postModel = new PostModel()
                {
                    Signature     = Request.QueryString["signature"],
                    Msg_Signature = Request.QueryString["msg_signature"],
                    Timestamp     = Request.QueryString["timestamp"],
                    Nonce         = Request.QueryString["nonce"],
                    //以下保密信息不会(不应该)在网络上传播,请注意
                    Token          = WebConfigurationManager.AppSettings["APPToken"],
                    EncodingAESKey = WebConfigurationManager.AppSettings["AesKey"], //根据自己后台的设置保持一致
                    AppId          = WebConfigurationManager.AppSettings["AppId"]   //根据自己后台的设置保持一致
                };

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

                //自定义MessageHandler,对微信请求的详细判断操作都在这里面
                //测试时可开启此记录,帮助跟踪数据

                var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);

                try
                {
                    //测试时可开启此记录,帮助跟踪数据
                    messageHandler.RequestDocument.Save(
                        Server.MapPath("~/dll/" + DateTime.Now.Ticks + "_Request_" +
                                       messageHandler.RequestMessage.FromUserName + ".txt"));
                    //执行微信处理过程
                    //if (messageHandler.UsingEcryptMessage)
                    //{
                    //    messageHandler.EcryptRequestDocument.Save(Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_Ecrypt_" + messageHandler.RequestMessage.FromUserName + ".txt"));
                    //}
                    // messageHandler.UsingEcryptMessage = true;
                    messageHandler.Execute();
                    //测试时可开启,帮助跟踪数据
                    messageHandler.ResponseDocument.Save(
                        Server.MapPath("~/dll/" + DateTime.Now.Ticks + "_Response_" +
                                       messageHandler.ResponseMessage.ToUserName + ".txt"));
                    if (messageHandler.UsingEcryptMessage)
                    {
                        //记录加密后的响应信息
                        messageHandler.FinalResponseDocument.Save(Server.MapPath("~/dll/" + DateTime.Now.Ticks + "_Response_Final_" + messageHandler.ResponseMessage.ToUserName + ".txt"));
                    }
                    WriteContent(messageHandler.FinalResponseDocument.ToString());
                    return;
                }
                catch (Exception ex)
                {
                    using (TextWriter tw = new StreamWriter(Server.MapPath("~/dll/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("");
                }
                finally
                {
                    Response.End();
                }
            }
        }
Example #23
0
        public ActionResult Post(PostModel postModel)
        {
            try
            {
                _logger.LogTrace(string.Format("post:进入!"));
                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, wechatOptions.Token))
                {
                    _logger.LogTrace(string.Format("post:参数错误!"));
                    return(Content("参数错误!"));
                }
                _logger.LogTrace(string.Format("post:Check End!"));

                postModel.Token          = wechatOptions.Token;          //根据自己后台的设置保持一致
                postModel.EncodingAESKey = wechatOptions.EncodingAESKey; //根据自己后台的设置保持一致
                postModel.AppId          = wechatOptions.AppId;          //根据自己后台的设置保持一致

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

                //XDocument xdoc = null;
                //using (XmlReader reader = XmlReader.Create(Request.Body))
                //{
                //    xdoc = XDocument.Load(reader);
                //}

                ////自定义MessageHandler,对微信请求的详细判断操作都在这里面。
                //_logger.LogTrace(string.Format("post:new Handler"));

                //var messageHandler = new WechatCoreMessageHandler(wechatCoreDb, wechatOptions.AppId, wechatOptions.AppSecret, xdoc, postModel, _logger, maxRecordCount);


                string body           = new StreamReader(Request.Body).ReadToEnd();
                byte[] requestData    = Encoding.UTF8.GetBytes(body);
                Stream inputStream    = new MemoryStream(requestData);
                var    messageHandler = new WechatCoreMessageHandler(wechatCoreDb, wechatOptions.AppId, wechatOptions.AppSecret, inputStream, postModel, _logger, maxRecordCount);


                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;

                //执行微信处理过程
                messageHandler.Execute();
                _logger.LogTrace($"post:finish messageHandler.Execute");

                if (messageHandler.ResponseDocument != null)
                {
                    _logger.LogTrace($"post:{messageHandler.ResponseDocument.ToString()}");
                }

                //return new WeixinResult(messageHandler);
                //return Content("success");

                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            }
            catch (Exception ex)
            {
                _logger.LogError(new EventId(10001), ex, "weixin post error");
                var aa = ex.Message;
                while (ex.InnerException != null)
                {
                    ex  = ex.InnerException;
                    aa += " | " + ex.Message;
                }
                _logger.LogError(new EventId(10002), ex, "weixin post error" + aa + ex.StackTrace);
                return(Content("success"));
            }
        }
Example #24
0
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(Content("参数错误!"));
            }

            postModel.Token          = Token;               //根据自己后台的设置保持一致
            postModel.EncodingAESKey = this.EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = AppId;               //根据自己后台的设置保持一致

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

            var logPath = string.Format("{1}/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd"), rootPath);

            if (!Directory.Exists(logPath))
            {
                Directory.CreateDirectory(logPath);
            }
            var       stream = this.HttpContext.Request.Body;
            XDocument doc    = XDocument.Load(stream);
            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
            var messageHandler = new CustomMessageHandler(doc, postModel, maxRecordCount);


            try
            {
                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                string     filePath = Path.Combine(logPath, string.Format("{0}_Request_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName));
                FileStream fs       = new FileStream(filePath, FileMode.OpenOrCreate);
                messageHandler.RequestDocument.Save(fs);
                if (messageHandler.UsingEcryptMessage)
                {
                    FileStream fsx = new FileStream(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName)), FileMode.OpenOrCreate);
                    messageHandler.EcryptRequestDocument.Save(fsx);
                }

                /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
                messageHandler.OmitRepeatedMessage = true;


                //执行微信处理过程
                messageHandler.Execute();

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

                //if (messageHandler.ResponseDocument == null)
                //{
                //    throw new Exception(messageHandler.RequestDocument.ToString());
                //}

                if (messageHandler.ResponseDocument != null)
                {
                    FileStream fsa = new FileStream(Path.Combine(logPath, string.Format("{0}_Response_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName)), FileMode.CreateNew);
                    messageHandler.ResponseDocument.Save(fsa);
                }

                if (messageHandler.UsingEcryptMessage)
                {
                    FileStream fsb = new FileStream(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}.txt", _getRandomFileName(), messageHandler.RequestMessage.FromUserName)), FileMode.CreateNew);
                    //记录加密后的响应信息
                    messageHandler.FinalResponseDocument.Save(fsb);
                }

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
                return(new WeixinResult(messageHandler));//v0.8+
            }
            catch (Exception ex)
            {
                FileStream fsc = new FileStream(rootPath + "/App_Data/Error_" + _getRandomFileName() + ".txt", FileMode.CreateNew);
                using (TextWriter tw = new StreamWriter(fsc))
                {
                    tw.WriteLine("ExecptionMessage:" + ex.Message);
                    tw.WriteLine(ex.Source);
                    tw.WriteLine(ex.StackTrace);
                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                    tw.Flush();
                }
                return(Content(""));
            }
        }
Example #25
0
    private readonly string Token = "08efecf60208e6909df002";//定义一个局部变量不可以被修改,这里定义的变量要与接口配置信息中填写的Token一致
    protected void Page_Load(object sender, EventArgs e)
    {
        log4net.LogManager.GetLogger("loginfo").Info("可以访问!");

        string signature = Request["signature"];
        string timestamp = Request["timestamp"];
        string nonce     = Request["nonce"];
        string echostr   = Request["echostr"];

        if (Request.HttpMethod == "GET")
        {
            //get method - 仅在微信后台填写URL验证时触发
            if (CheckSignature.Check(signature, timestamp, nonce, Token))
            {
                WriteContent(echostr); //返回随机字符串则表示验证通过
            }
            else
            {
                WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
                             "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
            }
            Response.End();
        }
        else
        {
            log4net.LogManager.GetLogger("loginfo").Info("开始获取accesstoken值");
            var accessToken = AccessTokenContainer.TryGetAccessToken("wx422044a7a4be9609", "a12eca08b53a58d3806c6226efbb1364");//appid,appsecret
            log4net.LogManager.GetLogger("loginfo").Info("已获取accesstoken");
            log4net.LogManager.GetLogger("loginfo").Info("开始创建菜单");

            ButtonGroup bg = new ButtonGroup();
            bg.button.Add(new SingleViewButton()
            {
                name = "自由查单",
                url  = "http://client.chahuobao.net/manager/WxQuery"
            });

            //二级菜单
            var subButton = new SubButton()
            {
                name = "微服务"
            };
            //subButton.sub_button.Add(new SingleViewButton()
            //{
            //    url = "http://www.wuliubaoxianpingtai.com/weixin/",
            //    name = "关于我们"
            //});
            subButton.sub_button.Add(new SingleViewButton()
            {
                url  = "http://a.app.qq.com/o/simple.jsp?pkgname=io.dcloud.H5A57DD98",
                name = "软件下载"
            });

            bg.button.Add(subButton);

            //bg.button.Add(new SingleViewButton()
            //{
            //    name = "物流女神",
            //    url = "http://471280.v.caoapp.cn/mobile/cutebabyvote/index.jsp?aid=71DF2E37D6E98216&wuid=471280&isFromApiFilter=1"
            //});

            bg.button.Add(new SingleViewButton()
            {
                name = "运费券",
                url  = "http://wx.chahuobao.net/weixin/html/BuyPointsListNew.html"
            });

            var result = CommonApi.CreateMenu(accessToken, bg);
            log4net.LogManager.GetLogger("loginfo").Info(result);
            log4net.LogManager.GetLogger("loginfo").Info("菜单创建完毕");

            //post method - 当有用户向公众账号发送消息时触发
            if (!CheckSignature.Check(signature, timestamp, nonce, Token))
            {
                WriteContent("参数错误!");
                return;
            }

            //post method - 当有用户想公众账号发送消息时触发
            var postModel = new PostModel()
            {
                Signature     = Request.QueryString["signature"],
                Msg_Signature = Request.QueryString["msg_signature"],
                Timestamp     = Request.QueryString["timestamp"],
                Nonce         = Request.QueryString["nonce"],
                //以下保密信息不会(不应该)在网络上传播,请注意
                Token          = Token,
                EncodingAESKey = "chb7390fhunxg16sdjlkxnfhjdsk3gaz", //根据自己后台的设置保持一致
                AppId          = "wx422044a7a4be9609"                //根据自己后台的设置保持一致
            };

            var maxRecordCount = 10;

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

            try
            {
                //执行微信处理过程
                messageHandler.Execute();

                WriteContent(messageHandler.ResponseDocument.ToString());
                return;
            }
            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();
                }
            }
            finally
            {
                Response.End();
            }
        }
    }
Example #26
0
        public ActionResult Post(string signature, string timestamp, string nonce, string openid, string encrypt_type, string msg_signature)
        {
            //StringBuilder log = new StringBuilder();
            LogService.AnyLog("WeChatWebHook", $"WxApi\tPost In");//{DateTime.Now.ToString("HH:mm:ss.fffffff")}\t

            PostModel postModel = new PostModel()
            {
                Token          = WechatMpSettings.Default.Token, //根据自己后台的设置保持一致
                Signature      = signature,
                Timestamp      = timestamp,
                Nonce          = nonce,
                AppId          = WechatMpSettings.Default.AppId,
                EncodingAESKey = WechatMpSettings.Default.EncodingAESKey,
                Msg_Signature  = msg_signature,
            };

            try
            {
                //加密异常
                if (encrypt_type == "aes" && string.IsNullOrEmpty(postModel.EncodingAESKey))
                {
                    return(Content("公从号接口有异常,请通过其它途径解决您的问题,并反馈此消息"));
                }
                if (encrypt_type == "aes" && wxcrypt == null)
                {
                    wxcrypt = new WXBizMsgCrypt(postModel.Token, postModel.EncodingAESKey, postModel.AppId);
                }

                if (!CheckSignature.Check(signature, postModel))
                {
                    return(Content("参数错误!"));
                }

                String PostXml = Request.GetBodyString();
                //解密信息
                if (encrypt_type == "aes")
                {
                    var    aeskey = WechatMpSettings.Default.EncodingAESKey;
                    string detext = null;
                    var    res    = wxcrypt.DecryptMsg(postModel.Msg_Signature, postModel.Timestamp, postModel.Nonce, PostXml, ref detext);
                    //Console.WriteLine($"{res} detext({postModel.Token},{postModel.EncodingAESKey},{postModel.AppId},{postModel.Msg_Signature}, {postModel.Timestamp}, {postModel.Nonce},{PostXml})>{detext}");
                    PostXml = detext;
                }

                WechatResponse wxsponse  = new WechatResponse(Request, PostXml);
                var            botsponse = wxsponse.Rebot();
                LogService.AnyLog("WeChatWebHook", "响应源数据", $"{botsponse.Content}");
                //加密信息
                if (encrypt_type == "aes")
                {
                    var    rTimeStamp = DateTime.Now.GetTimestamp10();
                    var    rNonce     = RandomString.BuildRndString(16);
                    string restr      = null;
                    var    rb         = wxcrypt.EncryptMsg(botsponse.Content, rTimeStamp + "", rNonce, ref restr);
                    if (rb == 0)
                    {
                        botsponse.Content = restr;
                    }
                    else
                    {
                        $"{rb} EncryptMsg".WriteErrorLine();
                    }
                }
                LogService.AnyLog("WeChatWebHook", "响应密数据", $"{botsponse.Content}");
                return(botsponse);
            }
            catch (Exception ex)
            {
                #region 异常处理
                LogService.AnyLog("WeChatWebHook", $"{ex.Message}");
                LogService.Exception(ex);
                return(Content(""));

                #endregion
            }
            finally
            {
                LogService.AnyLog("WeChatWebHook", $"WxApi\tPost Out");
            }
        }
Example #27
0
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(Content("参数错误!"));
            }

            #region 打包 PostModel 信息

            postModel.Token          = Token;          //根据自己后台的设置保持一致
            postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = AppId;          //根据自己后台的设置保持一致

            #endregion

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

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

            #region 设置消息去重

            /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
             * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
            messageHandler.OmitRepeatedMessage = true;//默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能

            #endregion

            try
            {
                #region 记录 Request 日志

                var logPath = Server.GetMapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));
                if (!Directory.Exists(logPath))
                {
                    Directory.CreateDirectory(logPath);
                }

                //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}_{2}.txt", _getRandomFileName(),
                                                                                        messageHandler.RequestMessage.FromUserName,
                                                                                        messageHandler.RequestMessage.MsgType)));
                if (messageHandler.UsingEcryptMessage)
                {
                    messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}_{2}.txt", _getRandomFileName(),
                                                                                                  messageHandler.RequestMessage.FromUserName,
                                                                                                  messageHandler.RequestMessage.MsgType)));
                }

                #endregion

                //执行微信处理过程
                messageHandler.Execute();

                #region 记录 Response 日志

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

                //if (messageHandler.ResponseDocument == null)
                //{
                //    throw new Exception(messageHandler.RequestDocument.ToString());
                //}
                if (messageHandler.ResponseDocument != null && messageHandler.ResponseDocument.Root != null)
                {
                    messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}_{2}.txt", _getRandomFileName(),
                                                                                             messageHandler.ResponseMessage.ToUserName,
                                                                                             messageHandler.ResponseMessage.MsgType)));
                }

                if (messageHandler.UsingEcryptMessage &&
                    messageHandler.FinalResponseDocument != null && messageHandler.FinalResponseDocument.Root != null)
                {
                    //记录加密后的响应信息
                    messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}_{2}.txt", _getRandomFileName(),
                                                                                                  messageHandler.ResponseMessage.ToUserName,
                                                                                                  messageHandler.ResponseMessage.MsgType)));
                }

                #endregion

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                //return new WeixinResult(messageHandler);//v0.8+
                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            }
            catch (Exception ex)
            {
                #region 异常处理
                WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);

                using (TextWriter tw = new StreamWriter(Server.GetMapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt")))
                {
                    tw.WriteLine("ExecptionMessage:" + ex.Message);
                    tw.WriteLine(ex.Source);
                    tw.WriteLine(ex.StackTrace);
                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));

                #endregion
            }
        }
Example #28
0
        public async Task <ActionResult> Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(new WeixinResult("参数错误!"));
            }

            postModel.Token          = Token;
            postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = AppId;          //根据自己后台的设置保持一致

            var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, 10);

            messageHandler.DefaultMessageHandlerAsyncEvent = Weixin.MessageHandlers.DefaultMessageHandlerAsyncEvent.SelfSynicMethod;//没有重写的异步方法将默认尝试调用同步方法中的代码(为了偷懒)

            #region 设置消息去重

            /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
             * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
            messageHandler.OmitRepeatedMessage = true;//默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能

            #endregion

            #region 记录 Request 日志

            var logPath = Server.MapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));
            if (!Directory.Exists(logPath))
            {
                Directory.CreateDirectory(logPath);
            }

            //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
            messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}_{2}.txt", _getRandomFileName(),
                                                                                    messageHandler.RequestMessage.FromUserName,
                                                                                    messageHandler.RequestMessage.MsgType)));
            if (messageHandler.UsingEcryptMessage)
            {
                messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}_{2}.txt", _getRandomFileName(),
                                                                                              messageHandler.RequestMessage.FromUserName,
                                                                                              messageHandler.RequestMessage.MsgType)));
            }

            #endregion

            await messageHandler.ExecuteAsync(); //执行微信处理过程

            #region 记录 Response 日志

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

            //if (messageHandler.ResponseDocument == null)
            //{
            //    throw new Exception(messageHandler.RequestDocument.ToString());
            //}
            if (messageHandler.ResponseDocument != null)
            {
                messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}_{2}.txt", _getRandomFileName(),
                                                                                         messageHandler.ResponseMessage.ToUserName,
                                                                                         messageHandler.ResponseMessage.MsgType)));
            }

            if (messageHandler.UsingEcryptMessage && messageHandler.FinalResponseDocument != null)
            {
                //记录加密后的响应信息
                messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}_{2}.txt", _getRandomFileName(),
                                                                                              messageHandler.ResponseMessage.ToUserName,
                                                                                              messageHandler.ResponseMessage.MsgType)));
            }

            #endregion

            MessageHandler = messageHandler;//开放出MessageHandler是为了做单元测试,实际使用过程中不需要

            return(new FixWeixinBugWeixinResult(messageHandler));
        }
Example #29
0
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                return(Content("参数错误!"));
            }

            #region 打包 PostModel 信息

            postModel.Token          = Token;          //根据自己后台的设置保持一致
            postModel.EncodingAESKey = EncodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = AppId;          //根据自己后台的设置保持一致(必须提供)

            #endregion

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

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

            #region 设置消息去重

            /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
             * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
            messageHandler.OmitRepeatedMessage = true;//默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能

            #endregion

            try
            {
                messageHandler.SaveRequestMessageLog();  //记录 Request 日志(可选)

                messageHandler.Execute();                //执行微信处理过程(关键)

                messageHandler.SaveResponseMessageLog(); //记录 Response 日志(可选)

                //return Content(messageHandler.ResponseDocument.ToString());//v0.7-
                //return new WeixinResult(messageHandler);//v0.8+
                return(new FixWeixinBugWeixinResult(messageHandler));//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            }
            catch (Exception ex)
            {
                #region 异常处理
                WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);

                using (TextWriter tw = new StreamWriter(ServerUtility.ContentRootMapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt")))
                {
                    tw.WriteLine("ExecptionMessage:" + ex.Message);
                    tw.WriteLine(ex.Source);
                    tw.WriteLine(ex.StackTrace);
                    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

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

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

                    tw.Flush();
                    tw.Close();
                }
                return(Content(""));

                #endregion
            }
        }
        public ActionResult Post(PostModel postModel)
        {
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, token))
            {
                return(Content("参数错误!"));
            }

            #region 打包 PostModel 信息

            postModel.Token          = token;          //根据自己后台的设置保持一致
            postModel.EncodingAESKey = encodingAESKey; //根据自己后台的设置保持一致
            postModel.AppId          = appId;          //根据自己后台的设置保持一致

            #endregion

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

            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
            MessageHandler <CustomMessageContext> messageHandler;
            var messageHandlerType = WeiXinConfiguration.WeiXinMessageHandlerType;
            if (messageHandlerType != null)
            {
                messageHandler = Activator.CreateInstance(messageHandlerType, Request.GetRequestMemoryStream(), postModel, maxRecordCount) as MessageHandler <CustomMessageContext>;
            }
            else
            {
                messageHandler = new CustomMessageHandler(Request.GetRequestMemoryStream(), postModel, maxRecordCount);
            }


            #region 设置消息去重

            /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
             * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage*/
            messageHandler.OmitRepeatedMessage = true;//默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能

            #endregion

            try
            {
                #region 记录 Request 日志
                //var logPath = Server.GetMapPath(string.Format("~/App_Data/MP/{0}/", DateTime.Now.ToString("yyyy-MM-dd")));
                //if (!Directory.Exists(logPath))
                //{
                //    Directory.CreateDirectory(logPath);
                //}

                ////测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。
                //messageHandler.RequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_{1}_{2}.txt", _getRandomFileName(),
                //    messageHandler.RequestMessage.FromUserName,
                //    messageHandler.RequestMessage.MsgType)));
                //if (messageHandler.UsingEcryptMessage)
                //{
                //    messageHandler.EcryptRequestDocument.Save(Path.Combine(logPath, string.Format("{0}_Request_Ecrypt_{1}_{2}.txt", _getRandomFileName(),
                //        messageHandler.RequestMessage.FromUserName,
                //        messageHandler.RequestMessage.MsgType)));
                //}
                Logger.Info($"WeChat Request Message:{messageHandler.RequestMessage.FromUserName},{messageHandler.RequestMessage.MsgType}");

                #endregion

                //执行微信处理过程
                messageHandler.Execute();

                #region 记录 Response 日志

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

                //if (messageHandler.ResponseDocument == null)
                //{
                //    throw new Exception(messageHandler.RequestDocument.ToString());
                //}
                //if (messageHandler.ResponseDocument != null)
                //{
                //    messageHandler.ResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_{1}_{2}.txt", _getRandomFileName(),
                //        messageHandler.ResponseMessage.ToUserName,
                //        messageHandler.ResponseMessage.MsgType)));
                //}

                //if (messageHandler.UsingEcryptMessage && messageHandler.FinalResponseDocument != null)
                //{
                //    记录加密后的响应信息
                //    messageHandler.FinalResponseDocument.Save(Path.Combine(logPath, string.Format("{0}_Response_Final_{1}_{2}.txt", _getRandomFileName(),
                //        messageHandler.ResponseMessage.ToUserName,
                //        messageHandler.ResponseMessage.MsgType)));
                //}
                Logger.Info($"WeChat Response Message:{messageHandler.ResponseMessage.ToUserName},{messageHandler.ResponseMessage.MsgType}");
                #endregion

                return(Content(messageHandler.ResponseDocument.ToString()));//v0.7-
                //return new WeixinResult(messageHandler);//v0.8+
                //return new FixWeixinBugWeixinResult(messageHandler);//为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            }
            catch (Exception ex)
            {
                #region 异常处理
                WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);
                Logger.Error("MessageHandler错误:" + ex.Message, ex);

                return(Content(""));

                #endregion
            }
        }