C# 前台授权后 后台获取手机号信息
1.页面需要用到绑定的方法getPhoneNumber获取iv和encryptedData,
getPhoneNumber (e) { console.log(e.detail.iv) //加密算法的初始向量 console.log(e.detail.encryptedData) //包括敏感数据在内的完整用户信息的加密数据 }
2.使用wx.login获取code
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
wx.login({ success(res) { if (res.code) { app.globalData.code = res.code //res.code重点为了获取session_key } else { } } })
3.获取到code之后,传入自己的API接口中获取session_key
/// <summary> ///登录调用login接口获取openid和session_key /// </summary> /// <param name="code">前台通过调用login接口获取到的code</param> /// <param name="anonymous_code">前台通过调用login接口获取到的anonymous_code</param> /// <returns></returns> public string LoginGetopenid(string code, string anonymous_code)//未效验 { //按照规则填写参数 string appid = "***********"; string secret = "***************************"; string session_key = ""; //地址(这里对地址和参数进行了分开处理,url为地址,postString为参数) string url = "https://developer.toutiao.com/api/apps/jscode2session"; //这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是form里面每一个name都要加进来 string GETString = "appid=" + appid + "&secret=" + secret + "&code=" + code + "&anonymous_code=" + anonymous_code; //编码,尤其是汉字,事先要看下抓取网页的编码方式 byte[] GETData = Encoding.UTF8.GetBytes(GETString); //初始化WebClient类(提供将数据发送到url的资源,及从这样的资源接收数据) WebClient webClient = new WebClient(); ////采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可 //webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); string requestUrl = url + "?" + GETString; //得到解码的返回字符流 string responseData = Encoding.UTF8.GetString(webClient.DownloadData(requestUrl)); //解码后将数据转换为Json类型的object JObject returnJSON = (JObject)JsonConvert.DeserializeObject(responseData); //赋值如果未获取到openid则登录失败,否则成功 dynamic objJson = new ExpandoObject(); if (returnJSON["openid"] != null || returnJSON["openid"].ToString() != "") { int error = Convert.ToInt32(returnJSON["error"]); string openid = returnJSON["openid"].ToString(); session_key = returnJSON["session_key"].ToString(); string anonymous_openid = returnJSON["anonymous_openid"].ToString(); //查询账号是否是用户 Maticsoft.BLL.T_User userBLL = new Maticsoft.BLL.T_User(); DataTable dt = userBLL.SelectUserByopenid(openid); } return session_key; }
4.此时iv、encryptedData、session_key三个参数我们有了值使用Encrypt.DecryptAesForWeChart方法进行AES解密
private string getPhoneNumber(string encryptedData, string IV, string Session_key) { try { byte[] encryData = Convert.FromBase64String(encryptedData); RijndaelManaged rijndaelCipher = new RijndaelManaged(); rijndaelCipher.Key = Convert.FromBase64String(Session_key); rijndaelCipher.IV = Convert.FromBase64String(IV); rijndaelCipher.Mode = CipherMode.CBC; rijndaelCipher.Padding = PaddingMode.PKCS7; ICryptoTransform transform = rijndaelCipher.CreateDecryptor(); byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length); string result = Encoding.Default.GetString(plainText); dynamic model = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic; return model.phoneNumber; } catch (Exception ex) { return ""; } }
让我们一起来学习C#吧~~~