using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Security.Cryptography; using System.Text; using System.IO; using Library; using LitJson; using MySystem.Models; namespace MySystem.Areas.Api.Controllers { [Area("Api")] [Route("Api/[controller]/[action]")] public class UserAuthController : BaseController { public UserAuthController(IHttpContextAccessor accessor, ILogger logger, IOptions setting) : base(accessor, logger, setting) { } #region 小程序-获取secret public JsonResult GetSecret(string value) { value = DesDecrypt(value); JsonData data = JsonMapper.ToObject(value); string AppId = data["appId"].ToString(); //小程序AppId string AuthCode = data["authCode"].ToString(); //小程序授权码 Projects pro = db.Projects.FirstOrDefault(m => m.AppId == AppId); if(pro == null) { return Json(new AppResultJson() { Status = "-1", Info = "appid不存在" }); } pro = db.Projects.FirstOrDefault(m => m.AppId == AppId && m.AuthCode == AuthCode); if(pro == null) { return Json(new AppResultJson() { Status = "-1", Info = "授权码不正确" }); } Dictionary Obj = new Dictionary(); Obj.Add("appSecret", pro.AppSecret); //小程序密钥 Obj.Add("appSalt", pro.AppIv); //小程序IV return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj }); } #endregion #region 小程序-授权 public JsonResult Auth(string value) { value = DesDecrypt(value); JsonData data = JsonMapper.ToObject(value); string AppId = data["appId"].ToString(); //小程序AppId string Code = data["code"].ToString(); //加密Code Projects pro = db.Projects.FirstOrDefault(m => m.AppId == AppId); if(pro == null) { return Json(new AppResultJson() { Status = "-1", Info = "appid不存在" }); } string Data = AppDesDecrypt(Code, pro.AppSecret, pro.AppIv); if(string.IsNullOrEmpty(Data)) { return Json(new AppResultJson() { Status = "-1", Info = "授权失败" }); } string CheckAppId = Data.Substring(0, 16); if(CheckAppId != AppId) { return Json(new AppResultJson() { Status = "-1", Info = "授权失败" }); } string UserId = Data.Substring(16); int PlateformUserId = int.Parse(UserId); string OpenId = "kxsmp_" + function.MD5_16(UserId + AppId); string Token = function.MD532(Guid.NewGuid().ToString() + "948576"); UserForProject userFor = db.UserForProject.FirstOrDefault(m => m.PlateformUserId == PlateformUserId && m.AppId == AppId); if(userFor == null) { userFor = db.UserForProject.Add(new UserForProject() { CreateDate = DateTime.Now, UpdateDate = DateTime.Now.AddHours(1), PlateformUserId = PlateformUserId, AppId = AppId, OpenId = OpenId, Token = Token, }).Entity; } else { userFor.UpdateDate = DateTime.Now.AddHours(1); userFor.OpenId = OpenId; userFor.Token = Token; } db.SaveChanges(); Dictionary Obj = new Dictionary(); Obj.Add("appToken", Token); //小程序获取用户信息的Token Obj.Add("openId", OpenId); //小程序openId return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj }); } #endregion #region 小程序-获取用户信息 public JsonResult GetUserInfo(string value) { value = DesDecrypt(value); JsonData data = JsonMapper.ToObject(value); string AppToken = data["appToken"].ToString(); //小程序获取用户信息的Token string OpenId = data["openId"].ToString(); //小程序openId DateTime now = DateTime.Now; Dictionary Obj = new Dictionary(); UserForProject userFor = db.UserForProject.FirstOrDefault(m => m.Token == AppToken && m.OpenId == OpenId && m.UpdateDate > now); if(userFor == null) { return Json(new AppResultJson() { Status = "-1", Info = "获取用户信息失败" }); } PlateformModels.Users user = pdb.Users.FirstOrDefault(m => m.Id == userFor.PlateformUserId) ?? new PlateformModels.Users(); Obj.Add("mobile", user.Mobile); Obj.Add("nickName", user.RealName); //昵称 Obj.Add("headPhoto", SourceHost + user.HeadPhoto); //头像 Obj.Add("makerCode", user.MakerCode); string province = ""; string city = ""; string district = ""; if(!string.IsNullOrEmpty(user.Areas)) { string[] AreaList = user.Areas.Split(','); if(AreaList.Length > 0) province = AreaList[0]; if(AreaList.Length > 1) province = AreaList[1]; if(AreaList.Length > 2) province = AreaList[2]; } Obj.Add("province", province); //省 Obj.Add("city", city); //市 Obj.Add("district", district); //区 return Json(new AppResultJson() { Status = "1", Info = "", Data = Obj }); } #endregion #region 3DES解密 private string AppDesDecrypt(string encryptedText, string key, string iv) { string decryptedText = ""; try { byte[] keyArray; byte[] ivArray; byte[] encryptedTextArray; byte[] decryptedTextArray; TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); keyArray = UTF8Encoding.UTF8.GetBytes(key.Substring(0, 24)); ivArray = UTF8Encoding.UTF8.GetBytes(iv); encryptedTextArray = Convert.FromBase64String(encryptedText); tripleDES.Key = keyArray; tripleDES.IV = ivArray; ICryptoTransform decryptor = tripleDES.CreateDecryptor(tripleDES.Key, tripleDES.IV); using (MemoryStream ms = new MemoryStream(encryptedTextArray)) { using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (StreamReader sr = new StreamReader(cs)) { decryptedTextArray = Encoding.UTF8.GetBytes(sr.ReadToEnd()); } } } decryptedText = Encoding.UTF8.GetString(decryptedTextArray); } catch(Exception ex) { function.WriteLog(DateTime.Now.ToString() + "\n" + ex.ToString(), "3DES解密异常"); } return decryptedText; } #endregion } }