/// <summary> /// 微信加密数据解密 /// </summary> /// <param name="encryptedData"></param> /// <param name="sessionId"></param> /// <param name="vi"></param> /// <returns></returns> public string WxDecrypt(string encryptedData, string sessionId, string vi) { var cacheKey = string.Format(CacheKey.WX_SESSIONID_KEY, sessionId); var dict = (Dictionary <string, object>)_cacheService.GetValue(cacheKey); var sessionKey = dict["session_key"].ToString(); return(WXBizDataCrypt.AESDecrypt(encryptedData, sessionKey, vi)); }
public string GetUserInfo(string session_key, string iv, string encryptedData) { //获取用户数据 string jo = WXBizDataCrypt.AESDecrypt(encryptedData, session_key, iv); //转成json格式 JObject job = (JObject)JsonConvert.DeserializeObject(jo); //用户类 赋值 tb_User userinfo = new tb_User(); userinfo.OpenId = job["openId"].ToString(); userinfo.NickName = job["nickName"].ToString(); userinfo.AvatarUrl = job["avatarUrl"].ToString(); object watermark = job["watermark"].ToString(); object timestamp = job["watermark"]["timestamp"].ToString(); int count = 1; //创建连接对象 MySqlConnection conn = new MySqlConnection("server=192.168.43.80;User Id=root;password=1234;Database=restaurant"); //打开连接池 conn.Open(); //查询是否有当前用户 string sql = "SELECT * FROM `tb_user` where OpenId='" + userinfo.OpenId + "'"; MySqlCommand cmd1 = new MySqlCommand(sql, conn); object obj = cmd1.ExecuteScalar(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { //添加当前用户的信息 string str1 = $"insert into tb_user(OpenId,NickName,AvatarUrl,Count,TimeStamp) VALUES('{userinfo.OpenId}', '{userinfo.NickName}', '{userinfo.AvatarUrl}', {count}, '{timestamp.ToString()}')"; MySqlCommand cmd2 = new MySqlCommand(str1, conn); try { int row = cmd2.ExecuteNonQuery(); } catch (Exception) { throw; } } else { //修改用户登录的次数 string str2 = $"update tb_user set Count=Count+1 where OpenId='{userinfo.OpenId}'"; MySqlCommand cmd3 = new MySqlCommand(str2, conn); int row = cmd3.ExecuteNonQuery(); } //关闭连接池 conn.Close(); return(jo); }
/// <summary> /// 获取/绑定用户 /// </summary> /// <param name="appid"></param> /// <param name="sessionKey"></param> /// <param name="encryptedDataStr"></param> /// <param name="iv"></param> /// <returns>unionID</returns> public Users GetUser(string appid, string sessionKey, string encryptedDataStr, string iv) { var encryptedData = WXBizDataCrypt.DecryptData(sessionKey, encryptedDataStr, iv); logger.Debug($"用户完整信息:{encryptedData}"); UserInfoFull userinfoFull = JsonConvert.DeserializeObject <UserInfoFull>(encryptedData); if (userinfoFull.watermark.appid != appid) { throw new Exception("userinfofull.wartemark.appid 不等于 appid!"); } Users user = null; if (string.IsNullOrEmpty(userinfoFull.openId)) { throw new Exception("openId is null or empty!"); } user = _db.Users.SingleOrDefault(u => u.OpenId == userinfoFull.openId); if (user == null) { Users u = new Users(); u.Name = userinfoFull.nickName; u.Address = userinfoFull.country + userinfoFull.province + userinfoFull.city; u.CreateTime = DateTime.Now; u.LastTime = DateTime.Now; u.Sex = userinfoFull.gender; u.UserStatus = UserStatus.Ok; u.OpenId = userinfoFull.openId; u.UserTypeId = 1; _db.Users.Add(u); _db.SaveChanges(); return(u); } return(user); }
public JsonResult Login(string encryptedData, string iv, string code) { if (string.IsNullOrEmpty(code)) { return(Json(new { success = false, errMsg = "获取code失败!" }, JsonRequestBehavior.AllowGet)); } //string sessionKey; //if (!SessionKeys.TryGetValue(model.session_id, out sessionKey)) //{ // return Json(new { success = false, errMsg = "在安全字典中获取session_key失败" }); //} var url = string.Format(GetSessionKeyUrl, AppId, AppSecret, code); logger.Debug(url); var jsonStr = Encoding.UTF8.GetString(new WebClient().DownloadData(url)); logger.Debug(jsonStr); var session = JsonConvert.DeserializeObject <SessionKey>(jsonStr); if (string.IsNullOrEmpty(session.session_key)) { return(Json(new { success = true, errMsg = "session_key参数:null" }, JsonRequestBehavior.AllowGet)); } var user = db.Users.ToList().Find(u => u.OpenId == session.openid); try { var encryptedDataStr = WXBizDataCrypt.DecryptData(session.session_key, encryptedData, iv); Models.UserInfo userinfoFull = JsonConvert.DeserializeObject <Models.UserInfo>(encryptedDataStr); if (user == null) { user = new User(); user.OpenId = session.openid; user.CreateTime = DateTime.Now; user.Account = new Account() { Money = 0, MoneyLocked = 0, }; db.Users.Add(user); } //获取用户头像 string headImg = userinfoFull.avatarUrl; if (!String.IsNullOrEmpty(headImg)) { //下载头像并保存 string rootUrl = headImg.Substring(0, headImg.LastIndexOf("/")); string headImgHash = CryptoHelper.Md5(rootUrl); //下载原尺寸、64的两个 int[] sizes = new int[] { 0, 64 }; //WebClient webCLient = new WebClient(); foreach (var size in sizes) { string hurl = rootUrl + "/" + size; try { byte[] buffer = Utils.DownloadData(hurl); string dest = String.Format("{0}.png", size); string headImageDir = Path.Combine(Server.MapPath("~/Upload/") + String.Format("headimgs/{0}/", user.Id)); //判断目录 if (!Directory.Exists(headImageDir)) { Directory.CreateDirectory(headImageDir); } string headPath = headImageDir + dest; //判断文件 if (System.IO.File.Exists(headPath)) { System.IO.File.Delete(headPath); } Image image = Utils.BytToImg(buffer); image.Save(headPath); } catch (Exception e) { logger.Error("下载用户头像失败:" + hurl, e); } } user.HeadImg = "headimgs/" + user.Id; user.HeadImgHash = headImgHash; } user.Name = userinfoFull.nickName; user.Sex = userinfoFull.gender; user.Country = userinfoFull.country; user.City = userinfoFull.city; user.Province = userinfoFull.province; db.SaveChanges(); //session_id = CryptoHelper.Base64Encode(WxProvider.GetUser(AppId, session.session_key, encryptedData, iv)); } catch (Exception ex) { logger.Error("save user:error," + ex.Message); return(Json(new { success = false, errMsg = "save user:error," + ex.Message }, JsonRequestBehavior.AllowGet)); } return(Json(new { success = true, errMsg = "save user:ok", openid = session.openid }, JsonRequestBehavior.AllowGet)); }
public async Task <bool> ExcuteAsync(MiniProgramLoginContext context) { try { var session_key = context.MiniProgramUser?.session_key; var encryptedData = context.MiniProgramUser.Input.GetProperty("encryptedData").GetString(); var iv = context.MiniProgramUser.Input.GetProperty("iv").GetString(); this.httpContext = context.HttpContext; this.httpResponse = httpContext.Response; var deMPUserInfo = WXBizDataCrypt.AESDecrypt(encryptedData, session_key, iv); var mpUser = JsonSerializer.Deserialize <mp_user>(deMPUserInfo); var openId = mpUser?.openId; var mpUserModel = _baseService.GetModels(a => a.openId == openId).SingleOrDefault(); if (mpUserModel != default) // 如果登录用户存在 { mpUserModel.updatedAt = DateTime.Now; await _baseService.UpdateAsync(mpUserModel); var sessionKeyModel = await _sessionKeyService.GetEntityAsync(a => a.uid == mpUserModel.id); sessionKeyModel.sessionKey = session_key; sessionKeyModel.updatedAt = DateTime.Now; await _sessionKeyService.UpdateAsync(sessionKeyModel); // 生成jwt,返回给小程序端 var claims = new List <Claim> { new Claim("uid", mpUser.id.ToString()), new Claim("nickName", mpUser.nickName), new Claim("avatarUrl", mpUser.avatarUrl), new Claim("openId", mpUser.openId), new Claim("sessionKey", session_key) }; var accessToken = IssueJwt(claims); var userInfo = MapUtils.ObjectToMap(mpUserModel); userInfo.Add("authorizationToken", accessToken); this.httpResponse.ContentType = "application/json"; this.httpResponse.StatusCode = 200; await WriteJsonAsync(new { code = 200, msg = "ok", data = userInfo }); } else // 未找到关联本地账号 { // 将小程序登录用户信息保存到本地数据库,同时生成jwt返回给小程序端 // 将session_key保存到缓存中或token中或数据库中 mpUser.createdAt = DateTime.Now; var insertResult = await _baseService.AddAsync(mpUser); var sessionKeyModel = new session_key { uid = insertResult.id, createdAt = DateTime.Now, sessionKey = session_key }; await _sessionKeyService.InsertAsync(sessionKeyModel); var sessionKey = new session_key { uid = mpUser.id, sessionKey = session_key, createdAt = DateTime.Now }; var claims = new List <Claim> { new Claim("uid", mpUser.id.ToString()), new Claim("nickName", mpUser.nickName), new Claim("avatarUrl", mpUser.avatarUrl), new Claim("openId", mpUser.openId), new Claim("sessionKey", session_key) }; var accessToken = IssueJwt(claims); var userInfo = MapUtils.ObjectToMap(insertResult); userInfo.Add("authorizationToken", accessToken); this.httpResponse.ContentType = "application/json"; this.httpResponse.StatusCode = 200; await WriteJsonAsync(new { code = 200, msg = "ok", data = userInfo }); } return(true); } catch (Exception) { return(false); } }