/// <summary> /// 绑定第三方并且授权 /// </summary> /// <param name="openId"></param> /// <param name="unionId"></param> /// <param name="platform"></param> /// <param name="output"></param> /// <param name="user"></param> /// <param name="unitOfWork"></param> /// <returns></returns> private async Task BindAndTokenAuth(string openId, string unionId, OpenIdPlatforms?platform, AppRegisterOrLoginOutput output, User user, IUnitOfWorkCompleteHandle unitOfWork) { #region 关联第三方OpenId if (!openId.IsNullOrEmpty() || !unionId.IsNullOrEmpty()) { var appTokenAuthInput = new AppTokenAuthInput { OpenIdOrUnionId = unionId ?? openId }; switch (platform) { case OpenIdPlatforms.WeChat: appTokenAuthInput.From = openId.IsNullOrWhiteSpace() ? AppTokenAuthInput.FromEnum.WeChatUnionId : AppTokenAuthInput.FromEnum.WeChat; break; case OpenIdPlatforms.WechatMiniProgram: appTokenAuthInput.From = AppTokenAuthInput.FromEnum.WeChatMiniProgram; break; default: break; } if (platform != null && !_appUserOpenIdResposotory.GetAll().Any(p => (p.OpenId == openId || p.UnionId == unionId) && p.From == platform && p.UserId == user.Id && p.TenantId == AbpSession.TenantId)) { var appUserOpenId = new AppUserOpenId { OpenId = openId, UnionId = unionId, From = platform.Value, UserId = user.Id, CreationTime = Clock.Now, TenantId = AbpSession.TenantId }; _appUserOpenIdResposotory.Insert(appUserOpenId); } } //获取授权信息 var result = await CreateToken(user); output.AccessToken = result.AccessToken; output.ExpireInSeconds = result.ExpireInSeconds; output.UserId = result.UserId; output.Phone = user.PhoneNumber; await unitOfWork.CompleteAsync(); #endregion }
private async Task <AppRegisterOrLoginOutput> RegisterOrLogin(string phone = null, string name = null, string openId = null, string unionId = null, OpenIdPlatforms?platform = null) { var output = new AppRegisterOrLoginOutput(); using (var unitOfWork = _unitOfWorkManager.Begin()) { User user; if (phone != null) { user = _userManager.Users.FirstOrDefault(p => p.PhoneNumber == phone); if (user != null) { await BindAndTokenAuth(openId, unionId, platform, output, user, unitOfWork); return(output); } } var hasPhone = !phone.IsNullOrEmpty(); //支持游客注册 var userName = hasPhone ? phone : Guid.NewGuid().ToString("N"); user = new User { IsActive = true, Name = name ?? "游客", PhoneNumber = phone, UserName = userName, TenantId = AbpSession.TenantId, Password = User.CreateRandomPassword(), ShouldChangePasswordOnNextLogin = false, IsPhoneNumberConfirmed = hasPhone, EmailAddress = userName + "@xin-lai.com", Surname = name ?? "游客" }; user.Password = _passwordHasher.HashPassword(user, user.Password); output.Phone = phone; CheckErrors(await _userManager.CreateAsync(user)); await BindAndTokenAuth(openId, unionId, platform, output, user, unitOfWork); } return(output); }