實際測試 兩種方法都可以:
第一種方法:
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