Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// 用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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 7
0
        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");
                }
            }
        }
Esempio n. 8
0
        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));
            }
        }