微信小程序解密得到unoinid和手機號 (開放數據的校驗和解密 獲取手機號)


實際測試 兩種方法都可以:

第一種方法:

        public static string DecodeUserInfo(string encryptedData, string iv, string code)
        {
            var url = "https://api.weixin.qq.com/sns/jscode2session?appid=微信AppID&secret=開發秘鑰&js_code=" + code + "&grant_type=authorization_code";
            var sessionkey = Utils.HttpGet(url);
            var wxinfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WxInfoRequest>(sessionkey);
            var session_key = wxinfo.session_key;
 
            byte[] iv2 = Convert.FromBase64String(iv);
 
            if (string.IsNullOrEmpty(encryptedData)) return "";
            Byte[] toEncryptArray = Convert.FromBase64String(encryptedData);
 
            System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
            {
                Key = Convert.FromBase64String(session_key),
                IV = iv2,
                Mode = System.Security.Cryptography.CipherMode.CBC,
                Padding = System.Security.Cryptography.PaddingMode.PKCS7
            };
 
            System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
 
            return Encoding.UTF8.GetString(resultArray);
        }

第二中方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace YouNameSpace
{
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    /// <summary>
    /// 簽名及加密幫助類
    /// </summary>
    public static class EncryptHelper
    {

        #region 私有方法

        private static byte[] AES_Decrypt(String Input, byte[] Iv, byte[] Key)
        {
            RijndaelManaged aes = new RijndaelManaged();
#if NET45
            
#else
            //SymmetricAlgorithm aes = Aes.Create();
#endif
            aes.KeySize = 128;//原始:256
            aes.BlockSize = 128;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            aes.Key = Key;
            aes.IV = Iv;
            var decrypt = aes.CreateDecryptor(aes.Key, aes.IV);
            byte[] xBuff = null;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
                {
                    byte[] xXml = Convert.FromBase64String(Input);
                    byte[] msg = new byte[xXml.Length + 32 - xXml.Length % 32];
                    Array.Copy(xXml, msg, xXml.Length);
                    cs.Write(xXml, 0, xXml.Length);
                }
                xBuff = decode2(ms.ToArray());
            }
            return xBuff;
        }

        private static byte[] decode2(byte[] decrypted)
        {
            int pad = (int)decrypted[decrypted.Length - 1];
            if (pad < 1 || pad > 32)
            {
                pad = 0;
            }
            byte[] res = new byte[decrypted.Length - pad];
            Array.Copy(decrypted, 0, res, 0, decrypted.Length - pad);
            return res;
        }

        #endregion

        /// <summary>
        /// 解密所有消息的基礎方法
        /// </summary>
        /// <param name = "sessionKey" > 儲存在 SessionBag 中的當前用戶 會話 SessionKey</param>
        /// <param name = "encryptedData" > 接口返回數據中的 encryptedData 參數</param>
        /// <param name = "iv" > 接口返回數據中的 iv 參數,對稱解密算法初始向量</param>
        //    / <returns></returns>
        public static string DecodeEncryptedData(string sessionKey, string encryptedData, string iv)
        {
            var aesCipher = Convert.FromBase64String(encryptedData);
            var aesKey = Convert.FromBase64String(sessionKey);
            var aesIV = Convert.FromBase64String(iv);

            var result = AES_Decrypt(encryptedData, aesIV, aesKey);
            var resultStr = Encoding.UTF8.GetString(result);
            return resultStr;
        }
    }
}

 

 注意:1.session_key  是通過wx.login 然后得到code 然后去后台調取相應的接口獲得的

           2.如果你的小程序沒有綁定微信開放平台,encryptedData 解密的數據中不包含unionid參數

           3.微信開放平台和微信公眾平台不是一回事  需要單獨注冊的

          4.解密encryptedData 之前  最好先進行數據簽名校驗  防止數據被篡改

         (如果不進行校驗  解密的數據是被篡改的數據  會導致得到的數據不准確  上述例子中沒做校驗

           校驗主要用的是sha1加密  在另一篇博文(https://www.cnblogs.com/huangshuqiang/p/6254023.html)中已經給出了sha1加密的寫法)

參考:https://blog.csdn.net/willianyy/article/details/79670750

         http://www.cnblogs.com/Sea1ee/p/9627021.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM