using Furion.DependencyInjection; using Mapster; using Nirvana.Common; using Nirvana.Common.ApiBase; using Senparc.Weixin; using Senparc.Weixin.Open.Containers; using Senparc.Weixin.Open.WxaAPIs.Sns; using Senparc.Weixin.WxOpen.Containers; using Senparc.Weixin.WxOpen.Entities; using Senparc.Weixin.WxOpen.Helpers; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using YBDevice.Core; using YBDevice.Entity; namespace YBDevice.NApi.Application.UserInfo { /// /// 小程序管理 /// public class WxOpenService : BaseService, IWxOpenService, ITransient { public static readonly string Component_Token = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Token; public static readonly string Component_EncodingAESKey = Senparc.Weixin.Config.SenparcWeixinSetting.Component_EncodingAESKey; public static readonly string Component_Appid = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Appid; public static readonly string Component_Secret = Senparc.Weixin.Config.SenparcWeixinSetting.Component_Secret; private readonly ISqlSugarRepository repository; private readonly SqlSugarClient dbClient; public WxOpenService(ISqlSugarRepository sqlSugarRepository) { repository = sqlSugarRepository; dbClient = repository.Context; } /// /// 检查登录状态 /// /// /// public async Task CheckLoginAsync(string sessionId) { var sessionBag = await SessionContainer.GetSessionAsync(sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId已失效"); } var user = await dbClient.Queryable().Where(x => x.openid == sessionBag.OpenId).FirstAsync(); if (user == null) { return new ResultInfo(ResultState.FAIL, "此微信还未绑定"); } if (!await dbClient.Queryable().AnyAsync(x => x.Id == user.UserId)) { return new ResultInfo(ResultState.FAIL, "用户未找到"); } var token = Token(new WebApiOperaModel { UserId = user.UserId, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", token); } /// /// 检查登录状态是否已失效 /// /// /// public async Task CheckStatusAsync(string sessionId) { var sessionBag = await SessionContainer.GetSessionAsync(sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "登录已失效"); } return new ResultInfo(ResultState.SUCCESS, "success"); } /// /// 解密用户资料,如果未注册则自动进行注册,否则更新资料 /// /// /// public async Task DecryptDataAsync(WxOpenDecryptSubmitModel model) { var sessionbage = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionbage == null) { return new ResultInfo(ResultState.FAIL, "登录信息已过期"); } DecodeEntityBase decodedEntity = null; DecodedUserInfo userinfo = null; userinfo = EncryptHelper.DecodeUserInfoBySessionId( model.sessionId, model.encryptedData, model.iv); //记录日志 //_loggerService.AddLogger($"解密后的用户资料:{userinfo.ToJson()}"); decodedEntity = userinfo; //检验水印 var checkWartmark = false; if (decodedEntity != null) { checkWartmark = decodedEntity.CheckWatermark(model.appid); } if (!checkWartmark) { return new ResultInfo(ResultState.FAIL, "水印验证不通过"); } //检查此openid是否已绑定用户 if (!await dbClient.Queryable().AnyAsync(x => x.openid == sessionbage.OpenId)) { //未注册自动注册 var userid = await dbClient.Insertable(new YB_RegUser { Secret = "", Status = StatusType.Enabled, CreateTime = DateTime.Now, Headimg = userinfo.avatarUrl.ToStr(), LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now, Name = userinfo.nickName.ToStr(), Password = "", Phone = "", City = userinfo.city.ToStr(), Country = userinfo.country.ToStr(), Gender = (GenderType)userinfo.gender, Province = userinfo.province.ToStr(), UnionId = userinfo.unionId.ToStr() }).ExecuteReturnIdentityAsync(); //增加一条用户数据记录 await dbClient.Insertable(new YB_UserRealData { UserId = userid, TopStep = 0, TopStepTime = 0 }).ExecuteCommandAsync(); //增加微信绑定记录 await dbClient.Insertable(new YB_UserWX { createtime = DateTime.Now, openid = sessionbage.OpenId.ToStr(), unionid = sessionbage.UnionId.ToStr(), UserId = userid, IsOutLogin = 1 }).ExecuteCommandAsync(); //增加一条为自己的家庭成员 var birthday = DateTime.Now.AddYears(-18).Date; var family = new YB_Family { Type = FamilyType.Adult, Age = 18, Birthday = birthday, Sex = (GenderType)userinfo.gender, IsSelf = 1, Status = StatusType.Enabled, Createtime = DateTime.Now, Height = 175, Name = userinfo.nickName, UserId = userid, Weight = 0, HeadImg = userinfo.avatarUrl.ToStr() }; int familyid = await dbClient.Insertable(family).ExecuteReturnIdentityAsync(); //增加一条家庭成员数据记录 await dbClient.Insertable(new YB_FamilyData { FamilyId = familyid, AdultHeight = 0, CreateTime = DateTime.Now, DadHeight = 0, HalfYearHeight = 0, MomHeight = 0, YearHeight = 0 }).ExecuteCommandAsync(); //更新或者新增统计数据 if (await dbClient.Queryable().AnyAsync(x => x.Id == 1)) { await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayRegCnt = x.TodayRegCnt + 1, TotalRegCnt = x.TotalRegCnt + 1 }).Where(x => x.Id == 1).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_Combined { Id = 1, TodayDevCnt = 0, TotalDevCnt = 0, TodayIncome = 0, TodayRegCnt = 1, TodayResultCnt = 0, TotalIncome = 0, TotalRegCnt = 1, TotalResultCnt = 0 }).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = userid, OpenId = sessionbage.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new { token = token, sessionid = model.sessionId }); } else { var userwx = await dbClient.Queryable().Where(x => x.openid == sessionbage.OpenId).OrderBy(x => x.createtime, OrderByType.Desc).FirstAsync(); if (!await dbClient.Queryable().Where(x => x.Id == userwx.UserId).AnyAsync()) { return new ResultInfo(ResultState.FAIL, "用户未找到"); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now, Headimg = userinfo.avatarUrl.ToStr(), UnionId = userinfo.unionId.ToStr(), Name = userinfo.nickName }) .Where(x => x.Id == userwx.UserId) .ExecuteCommandAsync(); //更新关联的家庭成员资料 await dbClient.Updateable().SetColumns(x => new YB_Family { HeadImg = userinfo.avatarUrl.ToStr(), Name = userinfo.nickName.ToStr() }).Where(x => x.IsSelf == 1 && x.UserId == userwx.UserId).ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = userwx.UserId, OpenId = sessionbage.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new { token = token, sessionid = model.sessionId }); } } /// /// 手机号授权,如果未注册会自动进行注册 /// /// /// public async Task DecryptPhoneAsync(WxOpenDecryptSubmitModel model) { var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId未找到"); } var phone = EncryptHelper.DecryptPhoneNumber(model.sessionId, model.encryptedData, model.iv); return await Reg(phone.purePhoneNumber, model.fansid, model.sessionId, sessionBag); var user = await dbClient.Queryable().Where(x => x.Phone == phone.purePhoneNumber).FirstAsync(); //检查此手机号是否已注册 if (user != null) { if (!await dbClient.Queryable().AnyAsync(x => x.openid == sessionBag.OpenId && x.UserId == user.Id)) { await dbClient.Insertable(new YB_UserWX { openid = sessionBag.OpenId, createtime = DateTime.Now, unionid = sessionBag.UnionId.ToStr(), UserId = user.Id, IsOutLogin = 1 }).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now }) .Where(x => x.Id == user.Id) .ExecuteCommandAsync(); //检测是否绑定了fansid Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; //更新用户资料和绑定的fansid await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = model.fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = user.Id, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new { token = token, sessionid = model.sessionId, info = new { headimg = user.Headimg, nickname = user.Name } }); } else { //自动进行注册 user = new YB_RegUser { Secret = "", Status = StatusType.Enabled, CreateTime = DateTime.Now, Headimg = "", LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now, Name = phone.purePhoneNumber, Password = "", Phone = phone.purePhoneNumber, City = "", Country = "", Gender = 0, Province = "", UnionId = sessionBag.UnionId.ToStr(), FansId = model.fansid }; //检测是否绑定了fansid if (model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; user.Gender = fansdata.Sex; } var userid = await dbClient.Insertable(user).ExecuteReturnIdentityAsync(); //增加微信绑定记录 await dbClient.Insertable(new YB_UserWX { createtime = DateTime.Now, openid = sessionBag.OpenId.ToStr(), unionid = sessionBag.UnionId.ToStr(), UserId = userid, IsOutLogin = 1 }).ExecuteCommandAsync(); //增加一条用户数据记录 await dbClient.Insertable(new YB_UserRealData { UserId = userid, TopStep = 0, TopStepTime = 0 }).ExecuteCommandAsync(); //增加一条为自己的家庭成员 var birthday = DateTime.Now.AddYears(-18).Date; var family = new YB_Family { Type = FamilyType.Adult, Age = 18, Birthday = birthday, Sex = user.Gender, IsSelf = 1, Status = StatusType.Enabled, Createtime = DateTime.Now, Height = 0, Name = user.Name, UserId = userid, Weight = 0, HeadImg = user.Headimg, LastHeartTime = null }; int familyid = await dbClient.Insertable(family).ExecuteReturnIdentityAsync(); //增加一条家庭成员数据记录 await dbClient.Insertable(new YB_FamilyData { FamilyId = familyid, AdultHeight = 0, CreateTime = DateTime.Now, DadHeight = 0, HalfYearHeight = 0, MomHeight = 0, YearHeight = 0 }).ExecuteCommandAsync(); //更新或者新增统计数据 if (await dbClient.Queryable().AnyAsync(x => x.Id == 1)) { await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayRegCnt = x.TodayRegCnt + 1, TotalRegCnt = x.TotalRegCnt + 1 }).Where(x => x.Id == 1).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_Combined { Id = 1, TodayDevCnt = 0, TotalDevCnt = 0, TodayIncome = 0, TodayRegCnt = 1, TodayResultCnt = 0, TotalIncome = 0, TotalRegCnt = 1, TotalResultCnt = 0 }).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = userid, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new { token = token, sessionid = model.sessionId, info = new { headimg = user.Headimg, nickname = user.Name } }); } } /// /// 解密用户资料 /// /// /// public async Task DecryptUserInfoAsync(WxOpenDecryptSubmitModel model) { var sessionbage = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionbage == null) { return new ResultInfo(ResultState.FAIL, "登录信息已过期"); } DecodeEntityBase decodedEntity = null; DecodedUserInfo userinfo = null; userinfo = EncryptHelper.DecodeUserInfoBySessionId( model.sessionId, model.encryptedData, model.iv); decodedEntity = userinfo; //检验水印 var checkWartmark = false; if (decodedEntity != null) { checkWartmark = decodedEntity.CheckWatermark(model.appid); } if (!checkWartmark) { return new ResultInfo(ResultState.FAIL, "水印验证不通过"); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { Country = userinfo.country.ToStr(), Gender = (GenderType)userinfo.gender, Province = userinfo.province.ToStr(), City = userinfo.city.ToStr(), Headimg = userinfo.avatarUrl.ToStr(), UnionId = userinfo.unionId.ToStr(), Name = userinfo.nickName }) .Where(x => x.Id == authInfo.UserId) .ExecuteCommandAsync(); //更新关联的家庭成员资料 await dbClient.Updateable().SetColumns(x => new YB_Family { HeadImg = userinfo.avatarUrl.ToStr(), Name = userinfo.nickName.ToStr() }).Where(x => x.IsSelf == 1 && x.UserId == authInfo.UserId).ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = authInfo.UserId, OpenId = sessionbage.OpenId }); return new ResultInfo(ResultState.SUCCESS, "资料更新成功"); } /// /// 小程序登录 /// /// /// public async Task OnLoginAsync(WXOpenLoginSubmitModel model) { //检查小程序是否已授权 if (!await dbClient.Queryable().AnyAsync(x => x.authorizer_appid == model.appid && x.isauthorize == 1)) { return new ResultInfo(ResultState.FAIL, "此小程序还未授权"); } var accesstoken = await ComponentContainer.TryGetComponentAccessTokenAsync(Component_Appid, Component_Secret); //这里使用的是componentaccesstoken。不是小程序的token var jsonResult = await SnsApi.JsCode2JsonAsync(model.appid, Component_Appid, accesstoken, model.code); // _loggerService.AddLogger($"登录授权信息:{jsonResult.ToJson()}"); if (jsonResult.errcode == ReturnCode.请求成功) { //得到openid,检查是否绑定有账号,如果有绑定则返回token,否则返回sessionid var openid = jsonResult.openid; TimeSpan val = new TimeSpan(1, 0, 0);//一个小时 if (!model.fansid.IsEmpty()) { var reguser = await dbClient.Queryable().Where(x => x.FansId == model.fansid).Select(x => new YB_RegUser { Id = x.Id, Headimg = x.Headimg, Name = x.Name }).FirstAsync(); if (reguser != null) { if (await dbClient.Queryable().AnyAsync(x => x.openid == openid && x.UserId == reguser.Id)) { await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == openid && x.UserId == reguser.Id).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_UserWX { createtime = DateTime.Now, IsOutLogin = 1, openid = openid, unionid = jsonResult.unionid.ToStr(), UserId = reguser.Id }).ExecuteCommandAsync(); } //刷新key var sessionbag = await SessionContainer.UpdateSessionAsync(jsonResult.openid, jsonResult.openid, jsonResult.session_key, jsonResult.unionid, val); //生成token var token = Token(new WebApiOperaModel { UserId = reguser.Id, OpenId = openid }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new { token = token, sessionid = sessionbag.Key, iswxphone = true,//是否展示微信快捷手机号注册 info = new { headimg = reguser.Headimg, nickname = reguser.Name } }); } } if (await dbClient.Queryable().AnyAsync(x => x.openid == openid && x.IsOutLogin == 1)) { var userwx = await dbClient.Queryable().Where(x => x.openid == openid).FirstAsync(); //生成token var token = Token(new WebApiOperaModel { UserId = userwx.UserId, OpenId = openid }); //检测是否绑定了fansid var user = await dbClient.Queryable().FirstAsync(x => x.Id == userwx.UserId); if (user != null) { Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = model.fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName, Gender = fansdata.Sex }).Where(x => x.Id == userwx.UserId).ExecuteCommandAsync(); } //刷新key var sessionbag = await SessionContainer.UpdateSessionAsync(jsonResult.openid, jsonResult.openid, jsonResult.session_key, jsonResult.unionid, val); return new ResultInfo(ResultState.SUCCESS, "登录成功", new { token = token, sessionid = sessionbag.Key, iswxphone = true,//是否展示微信快捷手机号注册 info = new { headimg = user.Headimg, nickname = user.Name } }); } else { //清理无效的信息 await dbClient.Deleteable().Where(x => x.UserId == userwx.UserId).ExecuteCommandAsync(); } } //记录信息 var sessionBag = await SessionContainer.UpdateSessionAsync(jsonResult.openid, jsonResult.openid, jsonResult.session_key, jsonResult.unionid, val); return new ResultInfo(ResultState.WXUNAUTHORITY, "success", new WxOpenLoginData { sessionid = sessionBag.Key, iswxphone = model.appid == "wx884a6420e7515bc8" ? false : true }); } return new ResultInfo(ResultState.FAIL, jsonResult.errmsg); } /// /// 根据手机号进行注册 /// /// /// public async Task RegisterAsync(RegModel model) { var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId未找到"); } if (string.IsNullOrEmpty(model.phone)) { return new ResultInfo(ResultState.FAIL, "手机号不可为空"); } if (model.isvrcode) { if (string.IsNullOrEmpty(model.code)) { return new ResultInfo(ResultState.FAIL, "验证码不可为空"); } //检查验证码 var yzm = RedisHelpers.stringGet($"ybdevice_yam_{model.phone}"); if (model.code != yzm) { return new ResultInfo() { code = ResultState.FAIL, message = "验证码错误" }; } } return await Reg(model.phone, model.fansid, model.sessionId, sessionBag); } private async Task Reg(string phone, Guid? _fansid, string sessionId, SessionBag sessionBag) { var user = await dbClient.Queryable().Where(x => x.Phone == phone).FirstAsync(); //检查此手机号是否已注册 if (user != null) { if (!await dbClient.Queryable().AnyAsync(x => x.openid == sessionBag.OpenId && x.UserId == user.Id)) { await dbClient.Insertable(new YB_UserWX { openid = sessionBag.OpenId, createtime = DateTime.Now, unionid = sessionBag.UnionId.ToStr(), UserId = user.Id, IsOutLogin = 1 }).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); } //检测是否绑定了fansid Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && _fansid.HasValue && _fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == _fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = _fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName, Gender = fansdata.Sex }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now }) .Where(x => x.Id == user.Id) .ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = user.Id, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new RegSuccessS2CDto { token = token, sessionid = sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } else { //自动进行注册 user = new YB_RegUser { Secret = "", Status = StatusType.Enabled, CreateTime = DateTime.Now, Headimg = "", LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now, Name = phone, Password = "", Phone = phone, City = "", Country = "", Gender = 0, Province = "", UnionId = sessionBag.UnionId.ToStr(), FansId = _fansid }; if (_fansid.HasValue && _fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == _fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; user.Gender = fansdata.Sex; await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = _fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName, Gender = fansdata.Sex }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } var userid = await dbClient.Insertable(user).ExecuteReturnIdentityAsync(); //增加微信绑定记录 await dbClient.Insertable(new YB_UserWX { createtime = DateTime.Now, openid = sessionBag.OpenId.ToStr(), unionid = sessionBag.UnionId.ToStr(), UserId = userid, IsOutLogin = 1 }).ExecuteCommandAsync(); //增加一条用户数据记录 await dbClient.Insertable(new YB_UserRealData { UserId = userid, TopStep = 0, TopStepTime = 0 }).ExecuteCommandAsync(); //增加一条为自己的家庭成员 var birthday = DateTime.Now.AddYears(-18).Date; var family = new YB_Family { Type = FamilyType.Adult, Age = 0, Birthday = birthday, Sex = user.Gender, IsSelf = 1, Status = StatusType.Enabled, Createtime = DateTime.Now, Height = 0, Name = user.Name, UserId = userid, Weight = 0, HeadImg = user.Headimg, LastHeartTime = null }; int familyid = await dbClient.Insertable(family).ExecuteReturnIdentityAsync(); //增加一条家庭成员数据记录 await dbClient.Insertable(new YB_FamilyData { FamilyId = familyid, AdultHeight = 0, CreateTime = DateTime.Now, DadHeight = 0, HalfYearHeight = 0, MomHeight = 0, YearHeight = 0 }).ExecuteCommandAsync(); //更新或者新增统计数据 if (await dbClient.Queryable().AnyAsync(x => x.Id == 1)) { await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayRegCnt = x.TodayRegCnt + 1, TotalRegCnt = x.TotalRegCnt + 1 }).Where(x => x.Id == 1).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_Combined { Id = 1, TodayDevCnt = 0, TotalDevCnt = 0, TodayIncome = 0, TodayRegCnt = 1, TodayResultCnt = 0, TotalIncome = 0, TotalRegCnt = 1, TotalResultCnt = 0 }).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = userid, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new RegSuccessS2CDto { token = token, sessionid = sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } } #region 新版用户注册流程,2021/11/26 /// /// 解密用户资料 /// /// /// public async Task DeUserInfoAsync(WxOpenDecryptSubmitModel model) { var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId未找到"); } DecodeEntityBase decodedEntity = null; DecodedUserInfo userinfo = null; userinfo = EncryptHelper.DecodeUserInfoBySessionId( model.sessionId, model.encryptedData, model.iv); decodedEntity = userinfo; //检验水印 var checkWartmark = false; if (decodedEntity != null) { checkWartmark = decodedEntity.CheckWatermark(model.appid); } if (!checkWartmark) { return new ResultInfo(ResultState.FAIL, "水印验证不通过"); } //如果存在用户则直接使用 var userwx = await dbClient.Queryable().FirstAsync(x => x.openid == sessionBag.OpenId); if (userwx != null) { var user = await dbClient.Queryable().FirstAsync(x => x.Id == userwx.UserId); //检测是否绑定了fansid Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; //更新用户资料和绑定的fansid await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = model.fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = user.Id, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } else { //自动进行注册 var user = new YB_RegUser { Secret = "", Status = StatusType.Enabled, CreateTime = DateTime.Now, Headimg = userinfo.avatarUrl.ToStr(), LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now, Name = userinfo.nickName.ToStr(), Password = "", Phone = "", City = "", Country = "", Gender = 0, Province = "", UnionId = sessionBag.UnionId.ToStr(), FansId = model.fansid }; //检测是否绑定了fansid if (model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; } var userid = await dbClient.Insertable(user).ExecuteReturnIdentityAsync(); //增加微信绑定记录 await dbClient.Insertable(new YB_UserWX { createtime = DateTime.Now, openid = sessionBag.OpenId.ToStr(), unionid = sessionBag.UnionId.ToStr(), UserId = userid, IsOutLogin = 1 }).ExecuteCommandAsync(); //增加一条用户数据记录 await dbClient.Insertable(new YB_UserRealData { UserId = userid, TopStep = 0, TopStepTime = 0 }).ExecuteCommandAsync(); //增加一条为自己的家庭成员 var family = new YB_Family { Type = FamilyType.Adult, Age = 0, Birthday = DateTime.Now.Date, Sex = user.Gender, IsSelf = 1, Status = StatusType.Enabled, Createtime = DateTime.Now, Height = 0, Name = user.Name, UserId = userid, Weight = 0, HeadImg = user.Headimg, LastHeartTime = null }; int familyid = await dbClient.Insertable(family).ExecuteReturnIdentityAsync(); //增加一条家庭成员数据记录 await dbClient.Insertable(new YB_FamilyData { FamilyId = familyid, AdultHeight = 0, CreateTime = DateTime.Now, DadHeight = 0, HalfYearHeight = 0, MomHeight = 0, YearHeight = 0 }).ExecuteCommandAsync(); //更新或者新增统计数据 if (await dbClient.Queryable().AnyAsync(x => x.Id == 1)) { await dbClient.Updateable().SetColumns(x => new YB_Combined { TodayRegCnt = x.TodayRegCnt + 1, TotalRegCnt = x.TotalRegCnt + 1 }).Where(x => x.Id == 1).ExecuteCommandAsync(); } else { await dbClient.Insertable(new YB_Combined { Id = 1, TodayDevCnt = 0, TotalDevCnt = 0, TodayIncome = 0, TodayRegCnt = 1, TodayResultCnt = 0, TotalIncome = 0, TotalRegCnt = 1, TotalResultCnt = 0 }).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = userid, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } } /// /// 解密手机号 /// /// /// public async Task DeUserPhone(WxOpenDecryptSubmitModel model) { var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId未找到"); } var phone = EncryptHelper.DecryptPhoneNumber(model.sessionId, model.encryptedData, model.iv); var user = await dbClient.Queryable().Where(x => x.Phone == phone.purePhoneNumber).FirstAsync(); //检查此手机号是否已注册 if (user != null) { if (!await dbClient.Queryable().AnyAsync(x => x.openid == sessionBag.OpenId && x.UserId == user.Id)) { await dbClient.Insertable(new YB_UserWX { openid = sessionBag.OpenId, createtime = DateTime.Now, unionid = sessionBag.UnionId.ToStr(), UserId = user.Id, IsOutLogin = 1 }).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now }) .Where(x => x.Id == user.Id) .ExecuteCommandAsync(); //检测是否绑定了fansid Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; //更新用户资料和绑定的fansid await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = model.fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = user.Id, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } else { //更新用户绑定的手机号 var userwx = await dbClient.Queryable().FirstAsync(x => x.openid == sessionBag.OpenId); if (userwx == null) { return new ResultInfo(ResultState.FAIL, "微信绑定未找到"); } user = await dbClient.Queryable().Where(x => x.Id == userwx.UserId).FirstAsync(); await dbClient.Updateable().SetColumns(x => new YB_RegUser { Phone = phone.purePhoneNumber }).Where(x => x.Id == userwx.UserId).ExecuteCommandAsync(); await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = userwx.UserId, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } } /// /// 根据手机号进行注册 /// /// /// public async Task DeRegisterAsync(RegModel model) { var sessionBag = await SessionContainer.GetSessionAsync(model.sessionId); if (sessionBag == null) { return new ResultInfo(ResultState.FAIL, "sessionId未找到"); } if (string.IsNullOrEmpty(model.phone)) { return new ResultInfo(ResultState.FAIL, "手机号不可为空"); } if (model.isvrcode) { if (string.IsNullOrEmpty(model.code)) { return new ResultInfo(ResultState.FAIL, "验证码不可为空"); } //检查验证码 var yzm = RedisHelpers.stringGet($"ybdevice_yam_{model.phone}"); if (model.code != yzm) { return new ResultInfo() { code = ResultState.FAIL, message = "验证码错误" }; } } var user = await dbClient.Queryable().Where(x => x.Phone == model.phone).FirstAsync(); //检查此手机号是否已注册 if (user != null) { if (!await dbClient.Queryable().AnyAsync(x => x.openid == sessionBag.OpenId && x.UserId == user.Id)) { await dbClient.Insertable(new YB_UserWX { openid = sessionBag.OpenId, createtime = DateTime.Now, unionid = sessionBag.UnionId.ToStr(), UserId = user.Id, IsOutLogin = 1 }).ExecuteCommandAsync(); } else { await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); } //更新登录时间,以及最新的资料 await dbClient.Updateable().SetColumns(x => new YB_RegUser { LastVisitIP = Net.Ip, LastVisitTime = DateTime.Now }) .Where(x => x.Id == user.Id) .ExecuteCommandAsync(); //检测是否绑定了fansid Guid? fansid = user.FansId; if ((!fansid.HasValue || fansid.Value == Guid.Empty) && model.fansid.HasValue && model.fansid.Value != Guid.Empty) { YB_WXFans fansdata = await dbClient.Queryable().FirstAsync(x => x.Id == model.fansid); user.Headimg = fansdata.HeadImgUrl; user.Name = fansdata.NickName; //更新用户资料和绑定的fansid await dbClient.Updateable().SetColumns(x => new YB_RegUser { FansId = model.fansid, Headimg = fansdata.HeadImgUrl, Name = fansdata.NickName }).Where(x => x.Id == user.Id).ExecuteCommandAsync(); } var token = Token(new WebApiOperaModel { UserId = user.Id, OpenId = sessionBag.OpenId, }); return new ResultInfo(ResultState.SUCCESS, "登录成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } else { //更新用户绑定的手机号 var userwx = await dbClient.Queryable().FirstAsync(x => x.openid == sessionBag.OpenId); if (userwx == null) { return new ResultInfo(ResultState.FAIL, "微信绑定未找到"); } user = await dbClient.Queryable().Where(x => x.Id == userwx.UserId).FirstAsync(); await dbClient.Updateable().SetColumns(x => new YB_RegUser { Phone = model.phone }).Where(x => x.Id == userwx.UserId).ExecuteCommandAsync(); await dbClient.Updateable().SetColumns(x => new YB_UserWX { IsOutLogin = 1 }).Where(x => x.openid == sessionBag.OpenId).ExecuteCommandAsync(); var token = Token(new WebApiOperaModel { UserId = userwx.UserId, OpenId = sessionBag.OpenId }); return new ResultInfo(ResultState.SUCCESS, "注册成功", new RegSuccessS2CDto { token = token, sessionid = model.sessionId, info = new RegUserInfoS2CDto { headimg = user.Headimg, nickname = user.Name } }); } } /// /// 获取小程序升级信息 /// /// /// public async Task UpgradeAsync(WxOpenUpgradeC2SDto input) { var data = await dbClient.Queryable().Where(x => input.AppId == x.appid && x.Status == 5).OrderBy(x => x.CreateTime).Select(x => new YB_MiniProgramHistory { UserVersion = x.UserVersion, UserDesc = x.UserDesc }).FirstAsync(); if (data == null) { return new ResultInfo(ResultState.FAIL, "未找到升级信息"); } if (data.UserVersion != input.Version) { var returndata = data.Adapt(); return new ResultInfo(ResultState.SUCCESS, "发现新版本", returndata); } return new ResultInfo(ResultState.FAIL, "不需要升级"); } #endregion } }