示例#1
0
        /// <summary>
        /// 验证签名,检验是否是从微信服务器上发出的请求
        /// </summary>
        /// <param name="model">请求参数模型 Model</param>
        /// <returns>是否验证通过</returns>
        private bool CheckSignature(WeChatRequestModel model)
        {
            string signature, timestamp, nonce, tempStr;

            //获取请求来的参数
            signature = model.signature;
            timestamp = model.timestamp;
            nonce     = model.nonce;
            //创建数组,将 Token, timestamp, nonce 三个参数加入数组
            string[] array = { Token, timestamp, nonce };
            //进行排序
            Array.Sort(array);
            //拼接为一个字符串
            tempStr = String.Join("", array);
            //对字符串进行 SHA1加密
            tempStr = Get_SHA1_Method2(tempStr);
            //判断signature 是否正确
            if (tempStr.Equals(signature))
            {
                return(true);
            }
            else
            {
                return(false);
            }
            //return true;
        }
示例#2
0
        /// <summary>
        /// 整个验证的核心
        /// </summary>
        /// <param name="model"></param>

        //可以给WeChatRequestModel 加东西,比如我加了Code。
        //登录的时候我就可以从微信拿到Code
        public async Task <GetUser> Valid(WeChatRequestModel model)
        {
            //获取请求来的 echostr 参数
            string echoStr = model.echostr;

            //通过验证,出于安全考虑。(也可以跳过)
            if (CheckSignature(model))
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    //将随机生成的 echostr 参数 原样输出
                    await Response.WriteAsync(echoStr);

                    //截止输出流
                    //Response.end();
                }
            }
            //解析连接的类
            WxPayConfig wxPayConfig = new WxPayConfig();
            //通过code换取网页授权access_token
            string     url          = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wxPayConfig.appid + "&secret=" + wxPayConfig.appSecret + "&code=" + model.code + "&grant_type=authorization_code";
            HttpClient httpClient   = new HttpClient();
            var        getParameter = await httpClient.GetStringAsync(url); //getHttp.GetJson(url);

            //把结果字符串反序列化成List对象。
            var parameter = JsonConvert.DeserializeObject <GetToken>(getParameter);
            //拉取用户信息
            //如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
            string Userurl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + parameter.access_token + "&openid=" + parameter.openid + "&lang=zh_CN";
            //获得连接字符串的数据

            var getUser = await httpClient.GetStringAsync(Userurl);

            //把结果字符串反序列化成List对象。1
            var User = JsonConvert.DeserializeObject <GetUser>(getUser);

            return(User);
        }
示例#3
0
        public ActionResult Post(WeChatRequestModel model)
        {
            Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;

            byte[] requestByte = new byte[requestStream.Length];
            requestStream.Read(requestByte, 0, (int)requestStream.Length);
            string requestStr = Encoding.UTF8.GetString(requestByte);
            var    XML        = "";

            if (!string.IsNullOrEmpty(requestStr))
            {
                //封装请求类
                var requestDocXml = new XmlDocument();
                requestDocXml.LoadXml(requestStr);
                var rootElement = requestDocXml.DocumentElement;

                if (rootElement == null)
                {
                    return(Content("There is no element!"));
                }

                var wxXmlModel = new WxXmlModel
                {
                    ToUserName   = rootElement.SelectSingleNode("ToUserName").InnerText,
                    FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
                    CreateTime   = rootElement.SelectSingleNode("CreateTime").InnerText,
                    MsgType      = rootElement.SelectSingleNode("MsgType").InnerText
                };

                switch (wxXmlModel.MsgType)
                {
                case "Text":    //文本
                    wxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText;
                    XML = ResponseMessage.GetText(wxXmlModel.FromUserName, wxXmlModel.ToUserName, wxXmlModel.Content);
                    break;

                case "Image":    //图片
                    wxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                    break;
                //case "Voice"://语音
                //    wxXmlModel.PicUrl = rootElement.SelectSingleNode("Media_id").InnerText;
                //    break;
                //case "Video"://视频
                //    wxXmlModel.PicUrl = rootElement.SelectSingleNode("Media_id").InnerText;
                //    break;
                //case "Shortvideo"://小视频
                //    wxXmlModel.PicUrl = rootElement.SelectSingleNode("Media_id").InnerText;
                //    break;
                //case "Location"://位置
                //    wxXmlModel.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
                //    wxXmlModel.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
                //    break;

                case "event":    //事件

                    wxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText;
                    switch (wxXmlModel.Event)
                    {
                    case "subscribe":
                        if (string.IsNullOrEmpty(wxXmlModel.EventKey))
                        {
                            XML = ResponseMessage.GetText(wxXmlModel.FromUserName, wxXmlModel.ToUserName, "关注成功");
                        }
                        else
                        {
                            XML = ResponseMessage.GetText(wxXmlModel.FromUserName, wxXmlModel.ToUserName, wxXmlModel.EventKey);
                        }
                        break;

                    case "SCAN":
                        XML = ResponseMessage.ScanQrcode(wxXmlModel.FromUserName, wxXmlModel.ToUserName, wxXmlModel.EventKey);        //扫描已关注二维码已关注,直接推送事件
                        break;
                    }
                    if (wxXmlModel.Event != "TEMPLATESENDJOBFINISH")    //关注类型
                    {
                        wxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
                    }
                    break;

                default:
                    break;
                }
            }
            return(Content(XML));
        }