/// <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; }
/// <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); }
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)); }