//
        // GET: /Account/WeChatAuth
        public ActionResult WeChatAuth(string code, string state)
        {
            // 获取微信授权access_token
            var client = new WeChatSnsClient();
            var result = client.GetAccessToken(code);

            if (!string.IsNullOrEmpty(result))
            {
                var json = JToken.Parse(result);

                if (json["access_token"] != null && json["expires_in"] != null
                    && json["refresh_token"] != null && json["openid"] != null && json["scope"] != null)
                {
                    var scope = (ScopeType)Enum.Parse(typeof(ScopeType), json["scope"].Value<string>());
                    var accessToken = json["access_token"].Value<string>();
                    var openId = json["openid"].Value<string>();

                    UserWeChatDto.Authorize(new Guid(state), accessToken, json["expires_in"].Value<double>(),
                        json["refresh_token"].Value<string>(), openId, scope);
                }
            }

            TempData["DataUrl"] = "data-url=/";
            return RedirectToAction("Index", "Home");
        }
        //
        // GET: /Account/WeChatLogin
        public ActionResult WeChatLogin(ScopeType scope)
        {
            var user = UserDto.GetSession();

            if (HttpContext.Request.Url != null)
            {
                var client = new WeChatSnsClient();

                var openUri = client.GetOpenUrl($"http://{HttpContext.Request.Url.Host}/Account/WeChatAuth", scope, user.ID.ToString());

                if (!string.IsNullOrEmpty(openUri))
                {
                    TempData["DataUrl"] = $"data-url={openUri}";
                    return Redirect(openUri);
                }
            }

            TempData["DataUrl"] = "data-url=/Account";
            return RedirectToAction("Index", "Account");
        }
Beispiel #3
0
        public static UserWeChat Authorize(Guid userGuid, string accessToken, double expiresIn, string refreshToken,
            string openId, ScopeType scope, bool anonymous = false)
        {
            using (var conn = new SqlConnection(DataAccess.ConnectString))
            {
                conn.Open();
                var trans = conn.BeginTransaction();

                try
                {
                    IRepository repo = new Repository();

                    // 保存微信用户
                    var user = anonymous ? repo.Single<User>(userGuid) : UserDto.GetSession();

                    if (user != null && user.ID == userGuid)
                    {
                        var u = new UserWeChat();

                        if (repo.Any<UserWeChat>(userGuid))
                        {
                            u = repo.Single<UserWeChat>(userGuid);
                        }

                        u.ID = userGuid;
                        u.UserName = user.UserName;
                        u.LastAuthorizeDate = DateTime.Now;

                        u.AccessToken = accessToken;
                        u.AccessTokenExpiredDate = DateTime.Now.AddSeconds(expiresIn);
                        u.RefreshToken = refreshToken;
                        u.RefreshTokenExpiredDate = DateTime.Now.AddDays(30);

                        u.Gender = 0;

                        if (u.Province == null) u.Province = string.Empty;
                        if (u.City == null) u.City = string.Empty;
                        if (u.Country == null) u.Country = string.Empty;
                        if (u.HeadImgUrl == null) u.HeadImgUrl = string.Empty;
                        if (u.Privilege == null) u.Privilege = string.Empty;
                        if (u.UnionID == null) u.UnionID = string.Empty;

                        repo.Save(u, trans);

                        // 更新普通用户
                        user.WeChatOpenID = openId;

                        // 按scope,获取微信用户详情
                        if (scope.Equals(ScopeType.snsapi_userinfo))
                        {
                            var result = new WeChatSnsClient().GetUserInfo(accessToken, openId);

                            if (!string.IsNullOrEmpty(result))
                            {
                                var json = JToken.Parse(result);

                                user.WeChatNickName = json["nickname"].Value<string>();

                                u.Gender = json["sex"].Value<short>();
                                u.Province = json["province"].Value<string>();
                                u.City = json["city"].Value<string>();
                                u.Country = json["country"].Value<string>();
                                u.HeadImgUrl = json["headimgurl"].Value<string>();
                                u.Privilege = json["privilege"].Value<JArray>().ToString();
                                u.UnionID = json["unionid"] != null ? json["unionid"].Value<string>() : string.Empty;

                                repo.Update(u, trans);
                            }
                        }

                        // 更新user的openId, nickname
                        repo.Update(user, trans);

                        trans.Commit();

                        return u;
                    }

                    return null;
                }
                catch
                {
                    trans.Rollback();

                    throw;
                }
            }
        }