1. 程式人生 > 實用技巧 >C# 前臺授權後 後臺獲取手機號資訊

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