예제 #1
0
        public async Task <Result> SignInWithWeChatAsync(string wechatCode, WeChatAppIdSecret idSecret)
        {
            if (idSecret.Type == null)
            {
                throw new ArgumentException($"Unknown {nameof(WeChatAppIdSecret)}.{nameof(WeChatAppIdSecret.Type)}");
            }

            var wechat = _me.ServiceProvider.GetRequiredService <WeChatService>().User();

            var accessToken = await wechat.GetUserAccessTokenAsync(wechatCode, idSecret);

            if (!accessToken.Ok || accessToken.Data == null)
            {
                return(new Failure(LoginResult.FailureWeChatRequestToken.ToLabel()));
            }

            var user = _db.Users
                       .AsNoTracking()
                       .Where(x => x.WeChat != null && x.WeChat.OpenIds.Any(y => y.OpenIdValue == accessToken.Data.OpenId))
                       .SingleOrDefault();

            //用户还不存在,即该微信账号第一次登录,进一步读取用户资料完成自动注册
            if (user == null)
            {
                var wechatUser = await wechat.GetUserInfoAsync(accessToken.Data);

                if (!wechatUser.Ok || wechatUser.Data == null)
                {
                    return(new Failure(LoginResult.FailureWeChatRequestUserInfo.ToLabel()));
                }

                //寻找用户,看该微信账号是否有相同UnionId
                if (!string.IsNullOrEmpty(wechatUser.Data.UnionId))
                {
                    user = _db.Users
                           .Include(x => x.WeChat)
                           .ThenInclude(x => x !.OpenIds)
                           .Where(x => x.WeChat != null)
                           .Where(x => x.WeChat !.UnionId == wechatUser.Data.UnionId)
                           .SingleOrDefault();
                }

                //如果仍然没找到已注册用户,判断用户当前是否已经通过其它方式登录,是的话直接使用该用户身份
                if (user == null && _me.IsAuthenticated)
                {
                    user = _db.Users
                           .Include(x => x.WeChat)
                           .ThenInclude(x => x !.OpenIds)
                           .Where(x => x.Id == _me.Id)
                           .SingleOrDefault();
                }

                //如果都没有,就新建用户
                if (user == null)
                {
                    user = new User();
                    _db.Users.Add(user);
                }
                else
                {
                    //用户记录是异常状态时,阻止获得登录身份
                    if (user.Status == RowStatus.Suspended)
                    {
                        return(await AddLoginRecordAsync(LoginResult.RejectedAccountSuspended, "WeChatApi", user.Id));
                    }
                    if (user.Status == RowStatus.Deleted)
                    {
                        return(await AddLoginRecordAsync(LoginResult.RejectedAccountDeleted, "WeChatApi", user.Id));
                    }
                    if (user.Status != RowStatus.Active)
                    {
                        return(await AddLoginRecordAsync(LoginResult.RejectedAccountInactive, "WeChatApi", user.Id));
                    }
                }

                //更新 User 表字段
                user.DisplayName ??= wechatUser.Data.NickName.Left(36);
                user.PhotoUrl ??= wechatUser.Data.HeadImageUrl;

                //更新 UserWeChat 表字段
                user.WeChat ??= new UserWeChat();

                if (!user.WeChat.OpenIds.Any(x => x.OpenIdValue == wechatUser.Data.OpenId))
                {
                    user.WeChat.OpenIds.Add(new UserWeChatOpenId {
                        OpenIdType  = (WeChatField)(int)idSecret.Type,
                        OpenIdValue = wechatUser.Data.OpenId
                    });
                }
                user.WeChat.UnionId      = wechatUser.Data.UnionId;
                user.WeChat.NickName     = wechatUser.Data.NickName.Left(36) !;
                user.WeChat.Sex          = wechatUser.Data.Sex;
                user.WeChat.HeadImageUrl = wechatUser.Data.HeadImageUrl;
                user.WeChat.Province     = wechatUser.Data.Province?.Left(24);
                user.WeChat.City         = wechatUser.Data.City?.Left(24);
                user.WeChat.Country      = wechatUser.Data.Country?.Left(24);

                await _db.Normalize().SaveChangesAsync();
            }

            _me.Id          = user.Id;
            _me.DisplayName = user.DisplayName ?? $"User#{user.Id}";
            _me.IdentityManager?.SaveIdentity(_me);

            return(await AddLoginRecordAsync(LoginResult.Success, "WeChatApi", user.Id));
        }
예제 #2
0
        public async Task <Result <WeChatUserAccessToken> > RefreshUserAccessTokenAsync(string refreshToken, WeChatAppIdSecret overrideIdSecret)
        {
            overrideIdSecret.NotNull();

            var url = $"https://api.weixin.qq.com/sns/oauth2/refresh_token" +
                      $"?appid={overrideIdSecret.AppId}" +
                      $"&refresh_token={refreshToken}" +
                      $"&grant_type=refresh_token";

            return(await GetUserAccessTokenFromResolvedUrlAsync(url));
        }
예제 #3
0
        public async Task <Result <WeChatUserAccessToken> > GetUserAccessTokenAsync(string code, WeChatAppIdSecret overrideIdSecret)
        {
            overrideIdSecret.NotNull();

            var url = $"https://api.weixin.qq.com/sns/oauth2/access_token" +
                      $"?appid={overrideIdSecret.AppId}" +
                      $"&secret={overrideIdSecret.AppSecret}" +
                      $"&code={code}" +
                      $"&grant_type=authorization_code";

            return(await GetUserAccessTokenFromResolvedUrlAsync(url));
        }
        public async Task <Result> SignInWithWeChat(string wechatCode, WeChatAppIdSecret idSecret)
        {
            if (_wechat == null)
            {
                throw new Exception($"缺少微信服务组件 {typeof(WeChatService).Assembly.GetName()}");
            }
            if (idSecret.Type == null)
            {
                throw new ArgumentException($"未指明 {nameof(WeChatAppIdSecret)}.{nameof(WeChatAppIdSecret.Type)}");
            }

            var wechatUserService = _wechat.UserService();

            var accessToken = wechatUserService.GetUserAccessToken(wechatCode, idSecret);

            if (accessToken == null)
            {
                return(new Failure(LoginResult.FailureWeChatRequestToken.ToLabel()));
            }
            var wechatUser = wechatUserService.GetUserInfo(accessToken);

            if (wechatUser == null)
            {
                return(new Failure(LoginResult.FailureWeChatRequestUserInfo.ToLabel()));
            }

            //寻找用户,看该微信账号是否已经注册过
            var user = _db.Users
                       .Include(x => x.WeChat)
                       .Where(x => x.WeChat != null)
                       .Where(x => x.WeChat !.UnionId == wechatUser.UnionId || x.WeChat.OpenIds.Any(y => y.OpenIdValue == wechatUser.OpenId))
                       .SingleOrDefault();

            //如果通过传入微信信息没找到已注册用户,判断用户当前是否已经通过其它方式登录,是的话直接使用该用户身份
            if (user == null && _me.IsAuthenticated)
            {
                user = _db.Users
                       .Where(x => x.Id == _me.Id)
                       .SingleOrDefault();
            }

            //如果都没有,就新建用户
            if (user == null)
            {
                user = new User();
                _db.Users.Add(user);
            }
            else
            {
                //用户记录是异常状态时,阻止获得登录身份
                if (user.Status == RowStatus.Suspended)
                {
                    return(await AddLoginRecord(LoginResult.RejectedAccountSuspended, "WeChatApi", user.Id));
                }
                if (user.Status == RowStatus.DeletedByAdmin || user.Status == RowStatus.DeletedByUser)
                {
                    return(await AddLoginRecord(LoginResult.RejectedAccountDeleted, "WeChatApi", user.Id));
                }
                if (user.Status != RowStatus.Active)
                {
                    return(await AddLoginRecord(LoginResult.RejectedAccountInactive, "WeChatApi", user.Id));
                }
            }

            //更新 User 表字段
            user.DisplayName ??= wechatUser.NickName.Left(36);
            user.PhotoUrl ??= wechatUser.HeadImageUrl;

            //更新 UserWeChat 表字段
            user.WeChat ??= new UserWeChat();

            if (!user.WeChat.OpenIds.Any(x => x.OpenIdValue == wechatUser.OpenId))
            {
                user.WeChat.OpenIds.Add(new UserWeChatOpenId {
                    OpenIdType  = (WeChatOpenIdType)(int)idSecret.Type,
                    OpenIdValue = wechatUser.OpenId
                });
            }
            user.WeChat.UnionId      = wechatUser.UnionId;
            user.WeChat.NickName     = wechatUser.NickName.Left(36) !;
            user.WeChat.Sex          = wechatUser.Sex;
            user.WeChat.HeadImageUrl = wechatUser.HeadImageUrl;
            user.WeChat.Province     = wechatUser.Province?.Left(24);
            user.WeChat.City         = wechatUser.City?.Left(24);
            user.WeChat.Country      = wechatUser.Country?.Left(24);

            await _db.Normalize().SaveChangesAsync();

            _me.Id          = user.Id;
            _me.DisplayName = user.DisplayName !;
            _me.IdentityManager.SaveIdentity(_me);

            return(await AddLoginRecord(LoginResult.Success, "WeChatApi", user.Id));
        }