在小程序中通過 wx.getUserInfo 獲取用戶信息,而UnionId 只有關主了公眾號才會返回,不關注公眾號想獲取UnionId則需要我們從返回的 encryptedData 中解碼從而獲取UnionId。
解密方法查了一下,這邊選擇的 GitHub地址
幫助類:

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; } } }
后台需要小程序傳遞三個參數給我們進行解密
String : sessionKey :加密的簽名(注:這個參數需要動態的獲取,每次返回的都不一樣):接口地址 通過wx.login 獲取 code然后再調用改接口返回的 會話密碼
通過 wx.getUserInfo 接口返回下面需要的數據 接口地址
String : encryptedData: 完整用戶信息的加密數據
String : iv:加密算法的初始向量 String
把這三給參數傳給我們的后台進行解密
主要方法:

string result =EncryptHelper.DecodeEncryptedData(sessionKey, encryptedData, iv); var dy = DynamicExtensions.JsonToDynamic<JObject>(result); string nickName = dy["nickName"] + ""; string sex = dy["gender"] + ""; string city = dy["city"] + ""; string province = dy["province"] + ""; string country = dy["country"] + ""; string headUrl = dy["avatarUrl"] + ""; string unionId = dy["unionId"] + "";