/// <summary> /// 获取网页用户授权 /// </summary> /// <param name="code"></param> /// <returns></returns> public static Access_tokenResult GetWeChatAccess_token(string code) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", SystemSet.Appid, SystemSet.Appsecret, code); Access_tokenResult result = new Access_tokenResult(); string resultJson = HttpUtils.Ins.GET(url); if (!resultJson.IsNull()) { if (resultJson.Contains("errcode")) { //WeChatErrorResult errorResult = JsonHelper.DeserializeObject<WeChatErrorResult>(resultJson); ClassLoger.Fail("WeChatAPIHelper.GetWeChatAccess_token(" + code + ")", url); ClassLoger.Fail("WeChatAPIHelper.GetWeChatAccess_token(" + code + ")", resultJson); } else { Dictionary <string, object> resDic = JsonHelper.DeserializeObject(resultJson); result.access_token = resDic["access_token"].TryToString(); result.expires_in = resDic["expires_in"].TryToInt(100); result.openid = resDic["openid"].TryToString(); result.refresh_token = resDic["refresh_token"].TryToString(); result.scope = resDic["scope"].TryToString(); } } return(result); }
/// <summary> /// 刷新access_token(超时刷新) /// </summary> /// <param name="refresh_token"></param> /// <returns></returns> public Access_tokenResult RefreshAccess_token(string refresh_token) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}", Appid, refresh_token); string ReText = WebRequestPostOrGet(url, "");//post/get方法获取信息 Access_tokenResult access_tokenResult = JsonConvert.DeserializeObject <Access_tokenResult>(ReText); return(access_tokenResult); }
/// 用Code换取Openid、Access_token public Access_tokenResult CodeGetOpenidAndAccess_token(string Code) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code); string ReText = WebRequestPostOrGet(url, "");//post/get方法获取信息 Access_tokenResult access_tokenResult = JsonConvert.DeserializeObject <Access_tokenResult>(ReText); return(access_tokenResult); }
/// <summary> /// 刷新access_token(如果需要) /// 由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新, /// refresh_token拥有较长的有效期(7天、30天、60天、90天),当refresh_token失效的后,需要用户重新授权。 /// </summary> /// <param name="refresh_token">通过access_token获取到的refresh_token参数</param> /// <returns></returns> public static Access_tokenResult Refresh_token(string refresh_token) { Access_tokenResult result = new Access_tokenResult(); string url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}", SystemSet.Appid, refresh_token); string resultJson = HttpUtils.Ins.GET(url); if (!resultJson.IsNull()) { if (resultJson.Contains("errcode")) { //WeChatErrorResult errorResult = JsonHelper.DeserializeObject<WeChatErrorResult>(resultJson); ClassLoger.Fail("WeChatAPIHelper.refresh_token(" + refresh_token + ")", url); ClassLoger.Fail("WeChatAPIHelper.refresh_token(" + refresh_token + ")", resultJson); } else { result = JsonHelper.DeserializeObject <Access_tokenResult>(resultJson); } } return(result); }
protected void Page_Load(object sender, EventArgs e) { LoginConfig loginConfig = new LoginConfig(); this.Appid = loginConfig.AppKey; this.Appsecret = loginConfig.AppSecret; this.code = RequestHelper.GetQueryString <string>("code"); if (!string.IsNullOrEmpty(code)) { #region 获取access_token Access_tokenResult access_tokenResult = new Access_tokenResult(); //如果session有值 if (Session["expires_in"] != null && Session["access_token"] != null && Session["openid"] != null) {//如果Session["access_token"]没过期 if (Convert.ToInt32(Session["expires_in"]) >= ShopCommon.ConvertDateTimeInt(DateTime.Now)) { access_tokenResult.access_token = Session["access_token"].ToString(); access_tokenResult.openid = Session["openid"].ToString(); } else//如果Session["access_token"]过期,根据refresh_token刷新access_token { if (Session["refresh_token"] != null) { access_tokenResult = RefreshAccess_token(Session["refresh_token"].ToString()); } } } else { //根据code获取access_token access_tokenResult = CodeGetOpenidAndAccess_token(this.code); if (!string.IsNullOrEmpty(access_tokenResult.errcode) || string.IsNullOrEmpty(access_tokenResult.access_token) || string.IsNullOrEmpty(access_tokenResult.openid)) { Response.Write("参数错误,请稍后重试"); Response.End(); } else { //验证access_token是否有效,失效了重新获取 WeChatMsg _msg = Check_Access_token(access_tokenResult.access_token, access_tokenResult.openid); if (_msg.errcode != "0") { Response.Write("参数错误,请稍后重试"); Response.End(); } else {//access_token有效,重新赋值session Session["expires_in"] = ShopCommon.ConvertDateTimeInt(DateTime.Now) + 7000; Session["access_token"] = access_tokenResult.access_token; Session["refresh_token"] = access_tokenResult.refresh_token; Session["openid"] = access_tokenResult.openid; } } } #endregion //获取userinfo Snsapi_userinfo snsapi_userinfo = GetUserinfo(access_tokenResult.access_token, access_tokenResult.openid); if (!string.IsNullOrEmpty(snsapi_userinfo.errcode) || string.IsNullOrEmpty(snsapi_userinfo.openid)) { Response.Write("参数错误,请稍后重试"); Response.End(); } else { string openID = snsapi_userinfo.openid; //string openID = access_tokenResult.openid; openID = "wx-" + openID; //如果没有用户添加用户 int userID = UserBLL.Read(openID).Id; UserInfo userInfo = new UserInfo(); if (userID <= 0) { userInfo.UserName = Server.UrlDecode(snsapi_userinfo.nickname); userInfo.UserPassword = StringHelper.Password(Guid.NewGuid().ToString(), (PasswordType)ShopConfig.ReadConfigInfo().PasswordType); userInfo.Photo = snsapi_userinfo.headimgurl; int _sex = userInfo.Sex; int.TryParse(snsapi_userinfo.sex, out _sex); //微信sex:1 男,2 女, 0 未知 //本站sex:1 男,2 女, 3 未知 userInfo.Sex = _sex == 0 ? 3 : _sex; userInfo.Email = ""; userInfo.RegisterIP = ClientHelper.IP; userInfo.RegisterDate = RequestHelper.DateNow; userInfo.LastLoginIP = ClientHelper.IP; userInfo.LastLoginDate = RequestHelper.DateNow; userInfo.FindDate = RequestHelper.DateNow; userInfo.Status = (int)UserStatus.Normal; userInfo.OpenId = openID; userID = UserBLL.Add(userInfo); } //当前用户登录 userInfo = UserBLL.Read(userID); UserBLL.UserLoginInit(userInfo); userInfo.LastLoginIP = ClientHelper.IP; userInfo.LastLoginDate = RequestHelper.DateNow; UserBLL.Update(userInfo); //跳转至会员中心 Response.Write("<script> location.href='/Mobile/User/Index.html'</script>"); Response.End(); //ResponseHelper.Redirect("/User/Index.html"); } } }
/// <summary> /// 用户确认授权 /// </summary> /// <param name="code"></param> /// <param name="state"></param> private void getUserinfo(string code, string state) { try { //网络授权有有效期,最好用redis缓存 //获取用户网络授权 string access_token = string.Empty; string openid = string.Empty; if (RedisBase.ContainsKey(code)) { Access_tokenResult accResult = RedisBase.Item_Get <Access_tokenResult>(code); access_token = accResult.access_token; openid = accResult.openid; } else { Access_tokenResult accResult = WeChatAccessTokenAPI.GetWeChatAccess_token(code); RedisBase.Item_Set(code, accResult); RedisBase.ExpireEntryAt(code, DateTime.Now.AddSeconds(accResult.expires_in)); access_token = accResult.access_token; openid = accResult.openid; } //获取用户信息 WeChatUserInfo userinfo = null; string userkey = getWeChatUserKey(access_token, openid); if (RedisBase.ContainsKey(userkey)) { userinfo = RedisBase.Item_Get <WeChatUserInfo>(userkey); } else { userinfo = WeChatUserInfoAPI.GetWeChatUserInfo(access_token, openid); if (userinfo != null) { RedisBase.Item_Set(userkey, userinfo); RedisBase.ExpireEntryAt(userkey, DateTime.Now.AddDays(2)); } } WeChatUser wuser = userbll.GetWeChatUserByUnionID(userinfo.unionid); if (wuser == null) { wuser = new WeChatUser(); wuser.PlatformOpenID = userinfo.openid; wuser.UnionID = userinfo.unionid; userbll.AddWeChatUser(wuser); } else { if (string.IsNullOrEmpty(wuser.PlatformOpenID)) { wuser.PlatformOpenID = userinfo.openid; wuser.UnionID = userinfo.unionid; userbll.UpdateWeChatUser(wuser); } } UserInfoBll ubll = new UserInfoBll(); UserInfo _user = ubll.GetUserInfoByOpenID(userinfo.unionid); // 用户绑定微信 string bindkey = string.Format("bind_{0}", state); string msg = MqttAgreement.GetWeChatLoginMA(state, true); if (RedisBase.ContainsKey(bindkey)) { //用户之前已经关注过微信公共号,需要把之前微信公共号账户中的信息更新到这个账户中 if (_user != null) { _user.Openid = ""; ubll.UpdateUserinfo(_user); } UserInfo binduser = RedisBase.Item_Get <UserInfo>(bindkey); binduser.Openid = userinfo.unionid; ubll.UpdateUserinfo(binduser); } else { WeChatLogin login = loginbll.GetWeChatLoginByUUID(state); if (login == null) { login = new WeChatLogin(); login.UUID = state; login.CreateTime = DateTime.Now; login.LoginData = DateTime.Now.ToString("yyyy-MM-dd"); } login.Headimgurl = userinfo.headimgurl; login.Nickname = userinfo.nickname; login.Openid = userinfo.unionid; login.Sex = userinfo.sex.TryToString(); login.State = 1; login.LoginData = DateTime.Now.ToString("yyyy-MM-dd"); login.CreateTime = DateTime.Now; loginbll.UpdateWeChatLogin(login); if (_user == null) { _user = new UserInfo(); _user.Openid = userinfo.unionid; _user.CreateTime = DateTime.Now; _user.Headimgurl = userinfo.headimgurl; _user.Nickname = userinfo.nickname; _user.Sex = (SexEnum)userinfo.sex; _user.Name = userinfo.nickname; _user.city = userinfo.city; _user.province = userinfo.province; ubll.UpdateUserinfo(_user); } //向客户端推送消息 MqttPublishClient.Ins.PublishOneClient(login.LockCode, msg); } MqttPublishClient.Ins.PublishAllClient(msg); } catch (Exception ex) { ClassLoger.Error("WeChatLoginCallBackController.getUserinfo", ex); } }
public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; //context.Response.Write("Hello World"); this.code = RequestHelper.GetQueryString <string>("code"); if (!string.IsNullOrEmpty(code)) { #region 获取access_token Access_tokenResult access_tokenResult = new Access_tokenResult(); //如果session有值 if (context.Session["expires_in"] != null && context.Session["access_token"] != null && context.Session["openid"] != null) {//如果Session["access_token"]没过期 if (Convert.ToInt32(context.Session["expires_in"]) >= ShopCommon.ConvertDateTimeInt(DateTime.Now)) { access_tokenResult.access_token = context.Session["access_token"].ToString(); access_tokenResult.openid = context.Session["openid"].ToString(); } else//如果Session["access_token"]过期,根据refresh_token刷新access_token { if (context.Session["refresh_token"] != null) { access_tokenResult = RefreshAccess_token(context.Session["refresh_token"].ToString()); } } } else { //根据code获取access_token access_tokenResult = CodeGetOpenidAndAccess_token(this.code); if (!string.IsNullOrEmpty(access_tokenResult.errcode) || string.IsNullOrEmpty(access_tokenResult.access_token) || string.IsNullOrEmpty(access_tokenResult.openid)) { context.Response.Write("参数错误,请稍后重试"); context.Response.End(); } else { //验证access_token是否有效,失效了重新获取 WeChatMsg _msg = Check_Access_token(access_tokenResult.access_token, access_tokenResult.openid); if (_msg.errcode != "0") { context.Response.Write("参数错误,请稍后重试"); context.Response.End(); } else {//access_token有效,重新赋值session context.Session["expires_in"] = ShopCommon.ConvertDateTimeInt(DateTime.Now) + 7000; context.Session["access_token"] = access_tokenResult.access_token; context.Session["refresh_token"] = access_tokenResult.refresh_token; context.Session["openid"] = access_tokenResult.openid; } } } #endregion //获取userinfo Snsapi_userinfo snsapi_userinfo = GetUserinfo(access_tokenResult.access_token, access_tokenResult.openid); if (!string.IsNullOrEmpty(snsapi_userinfo.errcode) || string.IsNullOrEmpty(snsapi_userinfo.openid)) { context.Response.Write("参数错误,请稍后重试"); context.Response.End(); } else { string openID = snsapi_userinfo.openid; //string openID = access_tokenResult.openid; openID = "wx-" + openID; //如果没有用户添加用户 int userID = UserBLL.Read(openID).Id; UserInfo userInfo = new UserInfo(); if (userID <= 0) { userInfo.UserName = snsapi_userinfo.nickname; userInfo.UserPassword = StringHelper.Password(Guid.NewGuid().ToString(), (PasswordType)ShopConfig.ReadConfigInfo().PasswordType); userInfo.Photo = snsapi_userinfo.headimgurl; int _sex = userInfo.Sex; int.TryParse(snsapi_userinfo.sex, out _sex); //微信sex:1 男,2 女, 0 未知 //本站sex:1 男,2 女, 3 未知 userInfo.Sex = _sex == 0 ? 3 : _sex; userInfo.Email = ""; userInfo.RegisterIP = ClientHelper.IP; userInfo.RegisterDate = RequestHelper.DateNow; userInfo.LastLoginIP = ClientHelper.IP; userInfo.LastLoginDate = RequestHelper.DateNow; userInfo.FindDate = RequestHelper.DateNow; userInfo.Status = (int)UserStatus.Normal; userInfo.OpenId = openID; userID = UserBLL.Add(userInfo); } //当前用户登录 userInfo = UserBLL.Read(userID); UserBLL.UserLoginInit(userInfo); userInfo.LastLoginIP = ClientHelper.IP; userInfo.LastLoginDate = RequestHelper.DateNow; UserBLL.Update(userInfo); //跳转至会员中心 ResponseHelper.Redirect("/mobile/User/Index.html"); } } }
public ActionResult CallBackRedirect() { //网络授权有有效期,最好用redis缓存 //获取用户网络授权 string code = Request["code"].TryToString(); string state = Request["state"].TryToString(); ClassLoger.Info("WeixinRedirectController.CallBackRedirect", state, code); string access_token = string.Empty; string openid = string.Empty; if (RedisBase.ContainsKey(code)) { Access_tokenResult accResult = RedisBase.Item_Get <Access_tokenResult>(code); access_token = accResult.access_token; openid = accResult.openid; } else { Access_tokenResult accResult = WeChatAccessTokenAPI.GetWeChatServiceAccess_token(code); RedisBase.Item_Set(code, accResult); RedisBase.ExpireEntryAt(code, DateTime.Now.AddSeconds(accResult.expires_in)); access_token = accResult.access_token; openid = accResult.openid; } //获取用户信息 WeChatUserInfo userinfo = null; string userkey = getWeChatUserKey(access_token, openid); if (RedisBase.ContainsKey(userkey)) { userinfo = RedisBase.Item_Get <WeChatUserInfo>(userkey); } else { userinfo = WeChatUserInfoAPI.GetWeChatUserInfo(access_token, openid); if (userinfo != null) { RedisBase.Item_Set(userkey, userinfo); RedisBase.ExpireEntryAt(userkey, DateTime.Now.AddDays(2)); } } UserInfo _user = userbll.GetUserInfoByOpenID(userinfo.unionid); if (_user == null) { _user = new UserInfo(); _user.Openid = userinfo.unionid; _user.CreateTime = DateTime.Now; _user.Headimgurl = userinfo.headimgurl; _user.Nickname = userinfo.nickname; _user.Sex = (SexEnum)userinfo.sex; _user.Name = userinfo.nickname; _user.city = userinfo.city; _user.province = userinfo.province; userbll.UpdateUserinfo(_user); } ClassLoger.Info("CallBackRedirect", userkey); RedisSession <UserInfo> redissession = new Models.RedisSession <UserInfo>(HttpContext, true, 120); redissession["UserCode"] = _user; switch (state) { //普通用户个人中心 case "UserCore": return(RedirectToAction("Index", "UserCore")); case "AdminCore": //return RedirectToAction("Index", "AdminCore"); default: string url = HttpUtils.Ins.UrlDecode(state); if (RedisBase.ContainsKey(state)) { url = RedisBase.Item_Get <string>(state); } return(Redirect(url)); } }