public async Task <IActionResult> WxLoginAsync(WxLoginParam loginParam) { // 使用IHttpClientFactory创建的HttpClient OpenIdParam openIdParam = await WxUtils.GetOpenIdAsync(loginParam, clientFactory.CreateClient()); if (openIdParam == null || string.IsNullOrEmpty(openIdParam.session_key)) { return(ValidationProblem("验证错误,Secret可能失效")); } WxPhoneModel wxPhoneModel = WxAppEncryptUtil.GetEncryptedDataStr(loginParam.EncryptedData, openIdParam.session_key, loginParam.Iv); if (wxPhoneModel == null) { return(ValidationProblem("用户信息解析错误")); } string phone = wxPhoneModel.PurePhoneNumber ?? wxPhoneModel.PhoneNumber; if (string.IsNullOrEmpty(phone)) { return(ValidationProblem("可能未绑定手机号")); } TbUser user = await rep.GetEntityAsync(s => s.Phone.Equals(phone), s => new TbUser { State = s.State }); if (user == null) { return(ValidationProblem("用户未注册")); } string token = AuthorizationUtil.GetToken(30, user.Id, user.Name, "user", user.CarNum); return(Ok(new { access_token = token })); }
public static WxPhoneModel GetEncryptedDataStr(string encryptedDataStr, string key, string iv) { WxPhoneModel model = null; //判断是否是16位 如果不够补0 //text = tests(text); //16进制数据转换成byte byte[] encryptedData = Convert.FromBase64String(encryptedDataStr); // strToToHexByte(text); RijndaelManaged rijndaelCipher = new RijndaelManaged(); rijndaelCipher.Key = Convert.FromBase64String(key); // Encoding.UTF8.GetBytes(AesKey); rijndaelCipher.IV = Convert.FromBase64String(iv); // Encoding.UTF8.GetBytes(AesIV); rijndaelCipher.Mode = CipherMode.CBC; rijndaelCipher.Padding = PaddingMode.PKCS7; ICryptoTransform transform = rijndaelCipher.CreateDecryptor(); byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length); string result = Encoding.Default.GetString(plainText); //int index = result.LastIndexOf('>'); //result = result.Remove(index + 1); // 转换实体类 if (!string.IsNullOrEmpty(result)) { model = JObject.Parse(result).ToObject <WxPhoneModel>(); } return(model); }
/// <summary> /// 解密小程序的encryptedData /// </summary> /// <param name="encryptedData">加密的信息</param> /// <param name="sessionKey">key</param> /// <param name="iv">加密算法的初始向量</param> public static WxPhoneModel DescodeWxSHA1(string encryptedData, string sessionKey, string iv) { WxPhoneModel model = null; string res = AESDecrypt(encryptedData, sessionKey, iv); if (!string.IsNullOrEmpty(res)) { model = JObject.Parse(res).ToObject <WxPhoneModel>(); } return(model); }
/// <summary> /// 解密小程序的encryptedData /// </summary> /// <param name="encryptedData">加密的信息</param> /// <param name="sessionKey">key</param> /// <param name="iv">加密算法的初始向量</param> public static WxPhoneModel DescodeWxSHA1(string encryptedData, string sessionKey, string iv) { WxPhoneModel model = null; var res = AESDecrypt(encryptedData, sessionKey, iv);// {"phoneNumber":"152XXXX9583","purePhoneNumber":"1525XXXX3","countryCode":"86","watermark":{"timestamp":1525829586,"appid":"wx38XXXXXXXX43"}} if (!string.IsNullOrEmpty(res)) { model = JObject.Parse(res).ToObject <WxPhoneModel>(); } return(model); }