国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET微信小程序用戶數據的簽名驗證和解密代碼

2024-07-10 12:48:35
字體:
來源:轉載
供稿:網友

微信小程序時下大熱,抱著學習的心態了解了一下,目前沒有搜到完整的.NET用戶數據簽名驗證和解密代碼,于是就寫了一點。

簡單使用方法:

1、客戶端調用wx.getUserInfo方法,服務端創建WeChatLoginInfo類的實例接收客戶端發來的數據;
2、服務端新建WeChatAppDecrypt類的實例,初始化此類時需傳入appId與AppSecret用于驗證;
3、調用WeChatAppDecrypt類中的Decrypt方法,傳入步驟1中獲取的WechatLoginInfo實例;
4、得到WechatUserInfo類的實例,其中就是解密好的數據。

話不多說,注釋比較詳盡,感興趣的朋友可以參考。

using System;using System.Net;using System.Net.Http;using System.Net.Http.Headers;using Newtonsoft.Json;using System.Security.Cryptography;using System.Text; namespace BroadSky.WeChatAppDecrypt{  /// <summary>  /// 處理微信小程序用戶數據的簽名驗證和解密  /// </summary>  public class WeChatAppDecrypt  {    private string appId;    private string appSecret;     /// <summary>    /// 構造函數    /// </summary>    /// <param name="appId">應用程序的AppId</param>    /// <param name="appSecret">應用程序的AppSecret</param>    public WeChatAppDecrypt(string appId, string appSecret)    {      this.appId = appId;      this.appSecret = appSecret;      return;    }     /// <summary>    /// 獲取OpenId和SessionKey的Json數據包    /// </summary>    /// <param name="code">客戶端發來的code</param>    /// <returns>Json數據包</returns>    private string GetOpenIdAndSessionKeyString(string code)    {      string temp = "https://api.weixin.qq.com/sns/jscode2session?" +         "appid=" + appId        + "&secret=" + appSecret        + "&js_code=" + code         + "&grant_type=authorization_code";       return GetResponse(temp);     }     /// <summary>    /// 反序列化包含OpenId和SessionKey的Json數據包    /// </summary>    /// <param name="code">Json數據包</param>    /// <returns>包含OpenId和SessionKey的類</returns>    public OpenIdAndSessionKey DecodeOpenIdAndSessionKey(WechatLoginInfo loginInfo)    {      OpenIdAndSessionKey oiask = JsonConvert.DeserializeObject<OpenIdAndSessionKey>(GetOpenIdAndSessionKeyString(loginInfo.code));      if (!String.IsNullOrEmpty(oiask.errcode))        return null;      return oiask;    }     /// <summary>    /// 根據微信小程序平臺提供的簽名驗證算法驗證用戶發來的數據是否有效    /// </summary>    /// <param name="rawData">公開的用戶資料</param>    /// <param name="signature">公開資料攜帶的簽名信息</param>    /// <param name="sessionKey">從服務端獲取的SessionKey</param>    /// <returns>True:資料有效,False:資料無效</returns>    public bool VaildateUserInfo(string rawData, string signature, string sessionKey)    {      //創建SHA1簽名類      SHA1 sha1 = new SHA1CryptoServiceProvider();      //編碼用于SHA1驗證的源數據      byte[] source = Encoding.UTF8.GetBytes(rawData + sessionKey);      //生成簽名      byte[] target = sha1.ComputeHash(source);      //轉化為string類型,注意此處轉化后是中間帶短橫杠的大寫字母,需要剔除橫杠轉小寫字母      string result = BitConverter.ToString(target).Replace("-","").ToLower();      //比對,輸出驗證結果      return signature == result;    }     /// <summary>    /// 根據微信小程序平臺提供的簽名驗證算法驗證用戶發來的數據是否有效    /// </summary>    /// <param name="loginInfo">登陸信息</param>    /// <param name="sessionKey">從服務端獲取的SessionKey</param>    /// <returns>True:資料有效,False:資料無效</returns>    public bool VaildateUserInfo(WechatLoginInfo loginInfo, string sessionKey)    {      return VaildateUserInfo(loginInfo.rawData, loginInfo.signature, sessionKey);    }     /// <summary>    /// 根據微信小程序平臺提供的簽名驗證算法驗證用戶發來的數據是否有效    /// </summary>    /// <param name="loginInfo">登陸信息</param>    /// <param name="idAndKey">包含OpenId和SessionKey的類</param>    /// <returns>True:資料有效,False:資料無效</returns>    public bool VaildateUserInfo(WechatLoginInfo loginInfo, OpenIdAndSessionKey idAndKey)    {      return VaildateUserInfo(loginInfo, idAndKey.session_key);    }     /// <summary>    /// 根據微信小程序平臺提供的解密算法解密數據    /// </summary>    /// <param name="encryptedData">加密數據</param>    /// <param name="iv">初始向量</param>    /// <param name="sessionKey">從服務端獲取的SessionKey</param>    /// <returns></returns>    public WechatUserInfo Decrypt(string encryptedData, string iv, string sessionKey)    {      WechatUserInfo userInfo;      //創建解密器生成工具實例      AesCryptoServiceProvider aes = new AesCryptoServiceProvider();      //設置解密器參數      aes.Mode = CipherMode.CBC;      aes.BlockSize = 128;      aes.Padding = PaddingMode.PKCS7;      //格式化待處理字符串      byte[] byte_encryptedData = Convert.FromBase64String(encryptedData);      byte[] byte_iv = Convert.FromBase64String(iv);      byte[] byte_sessionKey = Convert.FromBase64String(sessionKey);       aes.IV = byte_iv;      aes.Key = byte_sessionKey;      //根據設置好的數據生成解密器實例      ICryptoTransform transform = aes.CreateDecryptor();            //解密      byte [] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);       //生成結果      string result = Encoding.UTF8.GetString(final);       //反序列化結果,生成用戶信息實例      userInfo = JsonConvert.DeserializeObject<WechatUserInfo>(result);       return userInfo;     }     /// <summary>    /// 根據微信小程序平臺提供的解密算法解密數據,推薦直接使用此方法    /// </summary>    /// <param name="loginInfo">登陸信息</param>    /// <returns>用戶信息</returns>    public WechatUserInfo Decrypt(WechatLoginInfo loginInfo)    {      if (loginInfo == null)        return null;       if (String.IsNullOrEmpty(loginInfo.code))        return null;       OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo);       if (oiask == null)        return null;       if (!VaildateUserInfo(loginInfo, oiask))        return null;       WechatUserInfo userInfo = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key);       return userInfo;    }     /// <summary>    /// GET請求    /// </summary>    /// <param name="url"></param>    /// <returns></returns>    private string GetResponse(string url)    {      if (url.StartsWith("https"))        System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;       HttpClient httpClient = new HttpClient();      httpClient.DefaultRequestHeaders.Accept.Add(      new MediaTypeWithQualityHeaderValue("application/json"));      HttpResponseMessage response = httpClient.GetAsync(url).Result;       if (response.IsSuccessStatusCode)      {        string result = response.Content.ReadAsStringAsync().Result;        return result;      }      return null;    }       }  /// <summary>  /// 微信小程序登錄信息結構  /// </summary>  public class WechatLoginInfo  {    public string code { get; set; }    public string encryptedData { get; set; }    public string iv { get; set; }    public string rawData { get; set; }    public string signature { get; set; }  }  /// <summary>  /// 微信小程序用戶信息結構  /// </summary>  public class WechatUserInfo  {    public string openId { get; set; }    public string nickName { get; set; }    public string gender { get; set; }    public string city { get; set; }    public string province { get; set; }    public string country { get; set; }    public string avatarUrl { get; set; }    public string unionId { get; set; }    public Watermark watermark { get; set; }     public class Watermark    {      public string appid { get; set; }      public string timestamp { get; set; }    }  }  /// <summary>  /// 微信小程序從服務端獲取的OpenId和SessionKey信息結構  /// </summary>  public class OpenIdAndSessionKey  {    public string openid { get; set; }    public string session_key { get; set; }    public string errcode { get; set; }    public string errmsg { get; set; }  }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乳源| 桐乡市| 北安市| 安平县| 炉霍县| 交城县| 溧水县| 梅州市| 新绛县| 东明县| 德昌县| 屯昌县| 芦山县| 若尔盖县| 鄯善县| 陇西县| 岐山县| 洱源县| 兰西县| 石阡县| 鄢陵县| 读书| 民县| 临夏市| 宁城县| 铁岭市| 赤壁市| 双牌县| 尖扎县| 聂拉木县| 荃湾区| 中西区| 泸溪县| 富锦市| 榆树市| 台山市| 大方县| 自贡市| 台中县| 岐山县| 广元市|