Ejemplo n.º 1
0
 public WechatContext(WechatMsgRequestModel request)
 {
     Logger.Debug("微信服务器消息:" + JsonConvert.SerializeObject(request));
     _securityHelper = new WechatSecurityHelper(request.Msg_Signature, request.Timestamp, request.Nonce);
     _requestMessage = _securityHelper.DecryptMsg(request.RequestContent);
     Logger.Debug("收到微信消息:" + _requestMessage);
 }
Ejemplo n.º 2
0
        public async System.Threading.Tasks.Task <ActionResult> PostAsync([FromQuery] WechatMsgRequestModel model)
        {
            Logger.LogDebug("request msg:" + model.ToJson());
            using (var ms = new MemoryStream())
            {
                await Request.Body.CopyToAsync(ms);

                ms.Seek(0, SeekOrigin.Begin);

                using (var reader = new StreamReader(ms, System.Text.Encoding.UTF8))
                {
                    model.RequestContent = await reader.ReadToEndAsync();

                    Logger.LogDebug("RequestContent from Request:" + model.RequestContent);
                }
            }
            if (string.IsNullOrEmpty(model.RequestContent))
            {
                return(Content("RequestContent 为空"));
            }

            var context = new WeChatContext(model);

            return(await WechatAsync(context));
        }
        public void OnAuthorization(AuthorizationFilterContext filterContext)
        {
            var model = new WechatMsgRequestModel
            {
                Nonce         = filterContext.HttpContext.Request.Query["nonce"].FirstOrDefault(),
                Signature     = filterContext.HttpContext.Request.Query["signature"].FirstOrDefault(),
                Timestamp     = filterContext.HttpContext.Request.Query["timestamp"].FirstOrDefault(),
                Msg_Signature = filterContext.HttpContext.Request.Query["msg_signature"].FirstOrDefault()
            };
            //验证
            var token = filterContext.HttpContext.Request.Path.Value.ToLower().Contains("/wechatapp/")
                ? WxAppConsts.Token
                : MpWeChatConsts.Token;

            if (string.IsNullOrEmpty(token))
            {
                token = "Reservation";
            }
            if (!CheckSignature(model, token))
            {
                filterContext.HttpContext.RequestServices.GetRequiredService <ILogger <WechatRequestValidAttribute> >()
                .LogWarning("微信请求签名验证不通过, signature: {Signature}", model.Signature);

                filterContext.Result = new ContentResult
                {
                    Content     = "微信请求验证失败",
                    StatusCode  = 401,
                    ContentType = "text/plain;charset=utf-8",
                };
            }
        }
Ejemplo n.º 4
0
 public async System.Threading.Tasks.Task GetAsync([FromQuery] WechatMsgRequestModel model)
 {
     if (ModelState.IsValid)
     {
         try
         {
             var echoStr = HttpContext.Request.Query["echostr"].FirstOrDefault();
             if (!string.IsNullOrEmpty(echoStr))
             {
                 await Response.WriteAsync(echoStr, HttpContext.RequestAborted);
             }
         }
         catch (Exception ex)
         {
             Logger.Error($"Wechat GET 发生异常,异常信息:{ex.Message}", ex);
         }
     }
 }
        private static bool CheckSignature(WechatMsgRequestModel model)
        {
            //获取请求来的参数
            var signature = model.Signature;
            var timestamp = model.Timestamp;
            var nonce     = model.Nonce;

            //创建数组,将 Token, timestamp, nonce 三个参数加入数组
            string[] array = { WeChatConsts.Token, timestamp, nonce };
            //进行排序
            Array.Sort(array);
            //拼接为一个字符串
            var tempStr = string.Join("", array);

            //对字符串进行 SHA1加密
            tempStr = SecurityHelper.SHA1_Encrypt(tempStr);
            //判断signature 是否正确
            return(tempStr.Equals(signature?.ToUpper()));
        }
        public ActionResult PostAsync(WechatMsgRequestModel model)
        {
            if (model.RequestContent == null)
            {
                using (var reader = new StreamReader(Request.InputStream))
                {
                    Logger.Debug($"Request.InputStream Length:{Request.InputStream.Length}");
                    model.RequestContent = reader.ReadToEnd();
                    Logger.Debug($"RequestContent from Request.InputStream:{model.RequestContent}");
                }
            }
            if (string.IsNullOrEmpty(model.RequestContent))
            {
                return(Content("RequestContent 为空"));
            }
            var context = new WechatContext(model);

            return(Wechat(context));
        }
Ejemplo n.º 7
0
 public void Get(WechatMsgRequestModel model)
 {
     if (ModelState.IsValid)
     {
         try
         {
             var echoStr = HttpContext.Request.Query["echostr"].FirstOrDefault();
             if (!string.IsNullOrEmpty(echoStr))
             {
                 //将随机生成的 echostr 参数 原样输出
                 Response.Body.Write(echoStr.GetBytes());
             }
         }
         catch (Exception ex)
         {
             Logger.Error($"Wechat GET 发生异常,异常信息:{ex.Message}", ex);
         }
     }
 }
Ejemplo n.º 8
0
        public ActionResult PostAsync(WechatMsgRequestModel model)
        {
            //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
            //var postModel = new PostModel
            //{
            //    Nonce = model.Nonce,
            //    Timestamp = model.Timestamp,
            //    Signature = model.Signature,
            //    Msg_Signature = model.Msg_Signature,
            //    AppId = WeChatConsts.AppId,
            //    EncodingAESKey = WeChatConsts.AESKey,
            //    Token = WeChatConsts.Token,
            //};
            if (model.RequestContent == null)
            {
                using (var reader = new StreamReader(Request.InputStream))
                {
                    logger.Debug($"Request.InputStream Length:{Request.InputStream.Length}");
                    model.RequestContent = reader.ReadToEnd();
                    logger.Debug($"RequestContent from Request.InputStream:{model.RequestContent}");
                }
            }
            if (String.IsNullOrEmpty(model.RequestContent))
            {
                return(Content("RequestContent 为空"));
            }
            //var doc = System.Xml.Linq.XDocument.Parse(model.RequestContent);
            //logger.Debug("doc:" + doc.ToString());
            //var messageHandler = new WechatMsgHandler(doc, postModel);
            //#region 设置消息去重
            ///* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
            // * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的RequestMessage
            // */
            //messageHandler.OmitRepeatedMessage = true;//默认已经开启,此处仅作为演示,也可以设置为false在本次请求中停用此功能
            //#endregion
            //logger.Debug("收到微信消息:" + Common.ConverterHelper.ObjectToJson(messageHandler.RequestDocument));
            //messageHandler.Execute();
            //logger.Debug("返回的消息:" + Common.ConverterHelper.ObjectToJson(messageHandler.ResponseDocument));
            //return Wechat(messageHandler);
            var context = new WechatContext(model);

            return(Wechat(context));
        }
 public void Get(WechatMsgRequestModel model)
 {
     if (ModelState.IsValid)
     {
         try
         {
             var echoStr = HttpContext.Request.QueryString["echostr"];
             if (!string.IsNullOrEmpty(echoStr))
             {
                 //将随机生成的 echostr 参数 原样输出
                 Response.Write(echoStr);
                 //截止输出流
                 Response.End();
             }
         }
         catch (Exception ex)
         {
             Logger.Error($"Wechat GET 发生异常,异常信息:{ex.Message}", ex);
         }
     }
 }
Ejemplo n.º 10
0
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            var model = new WechatMsgRequestModel
            {
                Nonce         = filterContext.HttpContext.Request.QueryString["nonce"],
                Signature     = filterContext.HttpContext.Request.QueryString["signature"],
                Timestamp     = filterContext.HttpContext.Request.QueryString["timestamp"],
                Msg_Signature = filterContext.HttpContext.Request.QueryString["msg_signature"]
            };

            //验证
            if (!CheckSignature(model))
            {
                logger.Error("微信请求签名验证不通过");
                filterContext.Result = new ContentResult
                {
                    Content         = "微信请求验证失败",
                    ContentEncoding = Encoding.UTF8,
                    ContentType     = "text/html"
                };
            }
        }
        public void OnAuthorization(AuthorizationFilterContext filterContext)
        {
            var model = new WechatMsgRequestModel
            {
                Nonce         = filterContext.HttpContext.Request.Query["nonce"].FirstOrDefault(),
                Signature     = filterContext.HttpContext.Request.Query["signature"].FirstOrDefault(),
                Timestamp     = filterContext.HttpContext.Request.Query["timestamp"].FirstOrDefault(),
                Msg_Signature = filterContext.HttpContext.Request.Query["msg_signature"].FirstOrDefault()
            };

            //验证
            if (!CheckSignature(model))
            {
                Logger.Error("微信请求签名验证不通过");
                filterContext.Result = new ContentResult
                {
                    Content     = "微信请求验证失败",
                    StatusCode  = 401,
                    ContentType = "text/html"
                };
            }
        }
Ejemplo n.º 12
0
 public void Get(WechatMsgRequestModel model)
 {
     if (ModelState.IsValid)
     {
         try
         {
             //GET微信验证,获取 echostr 参数并返回
             var echoStr = HttpContext.Request.QueryString["echostr"];
             if (!string.IsNullOrEmpty(echoStr))
             {
                 //将随机生成的 echostr 参数 原样输出
                 Response.Write(echoStr);
                 //截止输出流
                 Response.End();
             }
         }
         catch (Exception ex)
         {
             logger.Error("发生异常,异常信息:" + ex.Message + ex.StackTrace);
         }
     }
 }
Ejemplo n.º 13
0
        private bool CheckSignature(WechatMsgRequestModel model)
        {
            string signature, timestamp, nonce, tempStr;

            //获取请求来的参数
            signature = model.Signature;
            timestamp = model.Timestamp;
            nonce     = model.Nonce;
            //创建数组,将 Token, timestamp, nonce 三个参数加入数组
            string[] array = { WeChatConsts.Token, timestamp, nonce };
            //进行排序
            Array.Sort(array);
            //拼接为一个字符串
            tempStr = String.Join("", array);
            //对字符串进行 SHA1加密
            tempStr = SecurityHelper.SHA1_Encrypt(tempStr);
            //判断signature 是否正确
            if (tempStr.Equals(signature.ToUpperInvariant()))
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 14
0
 public WeChatContext(WechatMsgRequestModel request)
 {
     _securityHelper = new WechatSecurityHelper(request.Msg_Signature, request.Timestamp, request.Nonce);
     _requestMessage = request.RequestContent;
 }