MeiRiYiCheng_1_old/YBDevice.Api/DBServices/WxOpenApp.cs

279 lines
12 KiB
C#

using Nirvana.Common;
using Nirvana.Common.ApiBase;
using Nirvana.Data;
using Senparc.Weixin;
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.Entity;
namespace YBDevice.Api.DBServices
{
/// <summary>
/// 小程序管理
/// </summary>
public partial class WxOpenApp : BaseApp
{
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;
/// <summary>
/// 小程序登录
/// </summary>
/// <returns></returns>
public async Task<ResultInfo> OnLoginAsync(WXOpenLoginSubmitModel model)
{
using (var dbClient = ReadDbContext.GetInstance())
{
//检查小程序是否已授权
if (!await dbClient.Queryable<YB_OfficlaAccount>().AnyAsync(x => x.authorizer_appid == model.appid && x.isauthorize == 1))
{
return new ResultInfo(ResultState.FAIL, "此小程序还未授权");
}
var jsonResult = await SnsApi.JsCode2JsonAsync(model.appid, Component_Appid, Component_Secret, model.code);
if (jsonResult.errcode == ReturnCode.)
{
//得到openid,检查是否绑定有账号,如果有绑定则返回token,否则返回sessionid
var openid = jsonResult.openid;
if (await dbClient.Queryable<YB_UserWX>().AnyAsync(x => x.openid == openid))
{
var userwx = await dbClient.Queryable<YB_UserWX>().Where(x => x.openid == openid).FirstAsync();
//生成token
var token = Token(new WebApiOperaModel
{
UserId = userwx.UserId
});
return new ResultInfo(ResultState.SUCCESS, "登录成功", token);
}
//记录信息
var sessionBag = await SessionContainer.UpdateSessionAsync(null, jsonResult.openid, jsonResult.session_key, jsonResult.unionid);
return new ResultInfo(ResultState.SUCCESS, "success", new WxOpenLoginData
{
sessionid = sessionBag.Key
});
}
return new ResultInfo(ResultState.FAIL, jsonResult.errmsg);
}
}
/// <summary>
/// 解密用户资料,如果未注册则自动进行注册,否则更新资料
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<ResultInfo> DecryptDataAsync(WxOpenDecryptSubmitModel model)
{
using (var dbClient = ReadDbContext.GetInstance())
{
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.sessionId);
}
if (!checkWartmark)
{
return new ResultInfo(ResultState.FAIL, "水印验证不通过");
}
var sessionbage = await SessionContainer.GetSessionAsync(model.sessionId);
if (sessionbage == null)
{
return new ResultInfo(ResultState.FAIL, "登录信息已过期");
}
//检查此openid是否已绑定用户
if (!await dbClient.Queryable<YB_UserWX>().AnyAsync(x => x.openid == sessionbage.OpenId))
{
//未注册自动注册
var userid = await dbClient.Insertable<YB_RegUser>(new YB_RegUser
{
Secret = "",
Status = 1,
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 = userinfo.gender,
Province = userinfo.province.ToStr(),
UnionId = userinfo.unionId.ToStr()
}).ExecuteReturnIdentityAsync();
//增加微信绑定记录
await dbClient.Insertable<YB_UserWX>(new YB_UserWX
{
createtime = DateTime.Now,
openid = userinfo.openId.ToStr(),
unionid = userinfo.unionId.ToStr(),
UserId = userid
}).ExecuteCommandAsync();
//增加一条为自己的家庭成员
var birthday = DateTime.Now.AddYears(-18).Date;
var family = new YB_Family
{
Type = (int)FamilyType.Adult,
Age = 18,
Birthday = birthday,
Sex = userinfo.gender,
IsSelf = 1,
Status = 1,
Createtime = DateTime.Now,
Height = 175,
Name = userinfo.nickName,
UserId = userid,
Weight = 60
};
await dbClient.Insertable<YB_Family>(family).ExecuteCommandAsync();
var token = Token(new WebApiOperaModel
{
UserId = userid
});
return new ResultInfo(ResultState.SUCCESS, "注册成功", token);
}
else
{
var userwx = await dbClient.Queryable<YB_UserWX>().Where(x => x.openid == sessionbage.OpenId).OrderBy(x => x.createtime, OrderByType.Desc).FirstAsync();
var user = await dbClient.Queryable<YB_RegUser>().Where(x => x.Id == userwx.UserId).FirstAsync();
if (user == null)
{
return new ResultInfo(ResultState.FAIL, "用户未找到");
}
//更新登录时间,以及最新的资料
await dbClient.Updateable<YB_RegUser>().SetColumns(x => new YB_RegUser
{
LastVisitIP = Net.Ip,
LastVisitTime = DateTime.Now,
Country = userinfo.country.ToStr(),
Gender = userinfo.gender,
Province = userinfo.province.ToStr(),
City = userinfo.city.ToStr(),
Headimg = userinfo.avatarUrl.ToStr(),
UnionId = userinfo.unionId.ToStr()
}).ExecuteCommandAsync();
var token = Token(new WebApiOperaModel
{
UserId = user.Id
});
return new ResultInfo(ResultState.SUCCESS, "登录成功", token);
}
}
}
/// <summary>
/// 手机号授权,如果未注册会自动进行注册
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<ResultInfo> DecryptPhoneAsync(WxOpenDecryptSubmitModel model)
{
using (var dbClient = ReadDbContext.GetInstance())
{
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<YB_RegUser>().Where(x => x.Phone == phone.phoneNumber).FirstAsync();
//检查此手机号是否已注册
if (user != null)
{
//如果未绑定此openid,则增加一条记录
if (!await dbClient.Queryable<YB_UserWX>().AnyAsync(x => x.openid == sessionBag.OpenId && x.UserId == user.Id))
{
await dbClient.Insertable<YB_UserWX>(new YB_UserWX
{
createtime = DateTime.Now,
openid = sessionBag.OpenId,
unionid = sessionBag.UnionId.ToStr(),
UserId = user.Id
}).ExecuteCommandAsync();
}
var token = Token(new WebApiOperaModel
{
UserId = user.Id
});
return new ResultInfo(ResultState.SUCCESS, "登录成功", token);
}
else
{
//自动进行注册
var userid = await dbClient.Insertable<YB_RegUser>(new YB_RegUser
{
CreateTime = DateTime.Now,
Secret = "",
Status = 1,
Headimg = "",
LastVisitIP = Net.Ip,
LastVisitTime = DateTime.Now,
Name = phone.phoneNumber,
Password = "",
Phone = phone.phoneNumber
}).ExecuteReturnIdentityAsync();
//增加微信绑定记录
await dbClient.Insertable<YB_UserWX>(new YB_UserWX
{
createtime = DateTime.Now,
openid = sessionBag.OpenId,
unionid = sessionBag.UnionId.ToStr(),
UserId = userid
}).ExecuteCommandAsync();
var token = Token(new WebApiOperaModel
{
UserId = userid
});
return new ResultInfo(ResultState.SUCCESS, "注册成功", token);
}
}
}
/// <summary>
/// 检查登录状态
/// </summary>
/// <param name="sessionId"></param>
/// <returns></returns>
public async Task<ResultInfo> CheckLoginAsync(string sessionId)
{
using (var dbClient = ReadDbContext.GetInstance())
{
var sessionBag = await SessionContainer.GetSessionAsync(sessionId);
if (sessionBag == null)
{
return new ResultInfo(ResultState.FAIL, "sessionId已失效");
}
var user = await dbClient.Queryable<YB_UserWX>().Where(x => x.openid == sessionBag.OpenId).FirstAsync();
if (user == null)
{
return new ResultInfo(ResultState.FAIL, "此微信还未绑定");
}
if (!await dbClient.Queryable<YB_RegUser>().AnyAsync(x => x.Id == user.UserId))
{
return new ResultInfo(ResultState.FAIL, "用户未找到");
}
var token = Token(new WebApiOperaModel
{
UserId = user.UserId
});
return new ResultInfo(ResultState.SUCCESS, "登录成功", token);
}
}
}
}