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 "";
            }
        }

 

posted on 2021-01-08 10:35  透明的鱼!  阅读(693)  评论(0编辑  收藏  举报

导航