/// <summary> /// 根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法 /// </summary> /// <param name="loginInfo">登陆信息</param> /// <returns>用户信息</returns> public WechatUserInfo Decrypt(WechatLoginInfo loginInfo) { if (loginInfo == null) { return(null); } if (String.IsNullOrEmpty(loginInfo.code)) { return(null); } OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo); if (oiask == null) { return(null); } if (!VaildateUserInfo(loginInfo, oiask)) { return(null); } WechatUserInfo userInfo = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key); return(userInfo); }
/// <summary> /// 反序列化包含OpenId和SessionKey的Json数据包 /// </summary> /// <param name="code">Json数据包</param> /// <returns>包含OpenId和SessionKey的类</returns> public OpenIdAndSessionKey DecodeOpenIdAndSessionKey(WechatLoginInfo loginInfo) { OpenIdAndSessionKey oiask = JsonConvert.DeserializeObject <OpenIdAndSessionKey>(GetOpenIdAndSessionKeyString(loginInfo.code)); if (!String.IsNullOrEmpty(oiask.errcode)) { return(null); } return(oiask); }
/// <summary> /// 根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法 /// </summary> /// <param name="loginInfo">登陆信息</param> /// <returns>用户信息</returns> public WechatUserInfo Decrypt(WechatLoginInfo loginInfo) { WechatUserInfo userInfo; if (loginInfo == null) { return(null); } if (string.IsNullOrEmpty(loginInfo.code)) { return(null); } OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo); if (oiask == null) { return(null); } if (!String.IsNullOrWhiteSpace(oiask.openid) && !string.IsNullOrWhiteSpace(loginInfo.rawData)) { userInfo = JsonConvert.DeserializeObject <WechatUserInfo>(loginInfo.rawData); userInfo.openId = oiask.openid; userInfo.unionId = oiask.unionId; return(userInfo); } //if (!VaildateUserInfo(loginInfo, oiask)) // return null; userInfo = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key); userInfo.openId = oiask.openid; return(userInfo); }
/// <summary> /// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效 /// </summary> /// <param name="loginInfo">登陆信息</param> /// <param name="idAndKey">包含OpenId和SessionKey的类</param> /// <returns>True:资料有效,False:资料无效</returns> public bool VaildateUserInfo(WechatLoginInfo loginInfo, OpenIdAndSessionKey idAndKey) { return(VaildateUserInfo(loginInfo, idAndKey.session_key)); }
/// <summary> /// 资讯用户插入 /// </summary> /// <returns></returns> public string InsertUserNew() { string code = ""; string iv = ""; string encryptedData = ""; try { code = HttpContext.Request.QueryString["code"].ToString(); iv = HttpContext.Request.QueryString["iv"].ToString(); encryptedData = Server.UrlDecode(HttpContext.Request.QueryString["encryptedData"].ToString()); } catch (Exception ex) { Response.Write("code:" + code + "|iv:" + iv + "|encryptedData:" + encryptedData); } string Appid = "wxba92380dc6210082";//资讯的 string Secret = "8938f3c2513bfc3883038284b67e0316"; string grant_type = "authorization_code"; //向微信服务端 使用登录凭证 code 获取 session_key 和 openid string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + Appid + "&secret=" + Secret + "&js_code=" + code + "&grant_type=" + grant_type; string type = "utf-8"; GetUsersHelper GetUsersHelper = new GetUsersHelper(); string j = GetUsersHelper.GetUrltoHtml(url, type);//获取微信服务器返回字符串 //return string.Format("j:{0}---"+"code:" + code + "|iv:" + iv ,j); //将字符串转换为json格式 JObject jo = (JObject)JsonConvert.DeserializeObject(j); OpenIdAndSessionKey res = new OpenIdAndSessionKey(); try { //微信服务器验证成功 res.openid = jo["openid"].ToString(); res.session_key = jo["session_key"].ToString(); } catch (Exception) { //微信服务器验证失败 res.errcode = jo["errcode"].ToString(); res.errmsg = jo["errmsg"].ToString(); } if (!string.IsNullOrEmpty(res.openid)) { //用户数据解密 GetUsersHelper.AesIV = iv; GetUsersHelper.AesKey = res.session_key; string result = GetUsersHelper.AESDecrypt(encryptedData); //return string.Format("j:{0}---" + "code:" + code + "|iv:" + iv + "result:" + result+ "encryptedData:"+ encryptedData+ "AesIV:"+iv+ "AesKey:"+ res.session_key, j); //存储用户数据 JObject _usrInfo = (JObject)JsonConvert.DeserializeObject(result); WechatUserInfo userInfo = new WechatUserInfo(); userInfo.openId = _usrInfo["openId"].ToString(); try //部分验证返回值中没有unionId { userInfo.unionId = _usrInfo["unionId"].ToString(); } catch (Exception) { userInfo.unionId = "unionId"; } userInfo.nickName = _usrInfo["nickName"].ToString(); userInfo.gender = _usrInfo["gender"].ToString(); userInfo.city = _usrInfo["city"].ToString(); userInfo.province = _usrInfo["province"].ToString(); userInfo.country = _usrInfo["country"].ToString(); userInfo.avatarUrl = _usrInfo["avatarUrl"].ToString(); object watermark = _usrInfo["watermark"].ToString(); object appid = _usrInfo["watermark"]["appid"].ToString(); object timestamp = _usrInfo["watermark"]["timestamp"].ToString(); //return "code:" + code + "|iv:" + iv + "|encryptedData:" + encryptedData + "openId:" + userInfo.openId; #region 插入数据库 //创建连接池对象(与数据库服务器进行连接) MySqlConnection conn = new MySqlConnection("Database=ourtool;Data Source=101.201.69.84;Port=3306;User=root;Password=qsx123456;CharSet=utf8;Allow User Variables=True;Connect Timeout=300;"); //打开连接池 conn.Open(); //创建命令对象 string Qrystr = "SELECT * FROM WeChatUsers WHERE openId='" + userInfo.openId + "'"; MySqlCommand cmdQry = new MySqlCommand(Qrystr, conn); object obj = cmdQry.ExecuteScalar(); if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))) { string str = "INSERT into `ourtool`.`WeChatUsers` ( `OpenId`, `NickName`, `Gender`, `City`, `Province`, `Country`, `AvatarUrl`, `Appid`, `Memo`, `Counts`,Type,CreateTime ) values('" + userInfo.openId + "','" + userInfo.nickName + "','" + userInfo.gender + "','" + userInfo.city + "','" + userInfo.province + "','" + userInfo.country + "','" + userInfo.avatarUrl + "','" + appid.ToString() + "','来自资讯小程序','1',2,now())"; MySqlCommand cmdUp = new MySqlCommand(str, conn); // 执行操作 try { int row = cmdUp.ExecuteNonQuery(); } catch (Exception ex) { Response.Write(ex.ToString()); } } else { //多次访问,记录访问次数counts 更新unionId是预防最初没有,后期关联后却仍未记录 string str = "UPDATE WeChatUsers SET counts = counts+1,EditeTime=now() WHERE OpenId='" + userInfo.openId + "'"; MySqlCommand cmdUp = new MySqlCommand(str, conn); int row = cmdUp.ExecuteNonQuery(); } //关闭连接池 conn.Close(); #endregion //返回解密后的用户数据 //Response.Write(result); } else { //Response.Write(j); } return("code:" + code + "|iv:" + iv + "|encryptedData:" + encryptedData + "openId:" + res.openid); }