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