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