C# 小程序 getPhoneNumber(e),后台解析手机号码

     

       小程序中  能获取用户手机号信息,但是需要解密才能得到真实的手机号码。

       C# 小程序 getPhoneNumber(e),后台解析手机号码_第1张图片

       public ActionResult pay(string jscode,string encryptedData, string iv)
        {
            bool bosucceed = true;
            try
            {
                string _posdata = "appid=" + appid + "&secret=" + secret + "&js_code=" + jscode + "&grant_type=authorization_code";
                string _url = "https://api.weixin.qq.com/sns/jscode2session";//获取openid
                string _data = request_url(_url, _posdata);
                if (_data.Contains("\"openid\""))
                {

                    string _ip = Request.ServerVariables.Get("Remote_Addr").ToString().Trim();
                    dynamic _modal = Newtonsoft.Json.Linq.JToken.Parse(_data) as dynamic;
                    string _openid = _modal.openid;
                    string _session_key = _modal.session_key;
                    if(!String.IsNullOrEmpty(encryptedData) && !string.IsNullOrEmpty(IV))
                    {
                        //解析手机号码
                        string _telPhone = getPhoneNumber(encryptedData, IV, _session_key);
                    }

            }

       } 

      catch (Exception ex)
            {
                return this.Json(new { succeed = false, data = ex.Message }, JsonRequestBehavior.AllowGet);
            }

  }

      #region 请求api
        ///


        /// 请求api
        ///

        ///
        ///
        ///
        private string request_url(string _url, string post_data)
        {
            string result = "";      string url = _url;// "https://api.weixin.qq.com/sns/jscode2session";

            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "application/json";
            //request.Headers=""
            request.Method = "POST";

            byte[] buffer = encoding.GetBytes(post_data.Trim());
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                result = reader.ReadToEnd();
            }
            return result;
        }
        #endregion

       //https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.htm

        ///


        /// AES解密:从小程序中 getPhoneNumber 返回值中,解析手机号码
        ///

        /// 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
        /// 加密算法的初始向量
        ///
        /// 手机号码
        private string getPhoneNumber(string encryptedData, string IV, string Session_key)
        {
            try
            {

                byte[] encryData = Convert.FromBase64String(encryptedData);  // strToToHexByte(text);
                RijndaelManaged rijndaelCipher = new RijndaelManaged();
                rijndaelCipher.Key = Convert.FromBase64String(Session_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(encryData, 0, encryData.Length);
                string result = Encoding.Default.GetString(plainText);
                //动态解析result 成对象
                dynamic model = Newtonsoft.Json.Linq.JToken.Parse(result) as dynamic;
                return model.phoneNumber;

            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                return "";

            }
        }

 

 

 

 

你可能感兴趣的:(C# 小程序 getPhoneNumber(e),后台解析手机号码)