C#微信小程序服務端獲取用戶解密信息


using AIOWeb.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace AIOWeb
{
    /// <summary>
    /// wxapi 的摘要說明
    /// </summary>
    public class wxapi : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";

            string code = "";
            string iv = "";
            string encryptedData = "";
            try
            {
                code = HttpContext.Current.Request.QueryString["code"].ToString();
                iv = HttpContext.Current.Request.QueryString["iv"].ToString();
                encryptedData = HttpContext.Current.Request.QueryString["encryptedData"].ToString();
            }
            catch (Exception ex)
            {
                context.Response.Write(ex.ToString());
            }

            string Appid = "wxdb2641f85b04f1b3";
            string Secret = "8591d8cd7197b9197e17b3275329a1e7";
            string grant_type = "authorization_code";

            //向微信服務端 使用登錄憑證 code 獲取 session_key 和 openid 
            string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + Appid + "&secret=" + Secret + "&js_code=" + code + "&grant_type=" + grant_type;
            string type = "utf-8";

            AIOWeb.Models.GetUsersHelper GetUsersHelper = new AIOWeb.Models.GetUsersHelper();
            string j = GetUsersHelper.GetUrltoHtml(url, type);//獲取微信服務器返回字符串

            //將字符串轉換爲json格式
            JObject jo = (JObject)JsonConvert.DeserializeObject(j);

            result res = new result();
            try
            {
                //微信服務器驗證成功
                res.openid = jo["openid"].ToString();
                res.session_key = jo["session_key"].ToString();
            }
            catch (Exception)
            {
                //微信服務器驗證失敗
                res.errcode = jo["errcode"].ToString();
                res.errmsg = jo["errmsg"].ToString();
            }
            if (!string.IsNullOrEmpty(res.openid))
            {
                //用戶數據解密
                GetUsersHelper.AesIV = iv;
                GetUsersHelper.AesKey = res.session_key;

                string result = GetUsersHelper.AESDecrypt(encryptedData);


                //存儲用戶數據
                JObject _usrInfo = (JObject)JsonConvert.DeserializeObject(result);

                userInfo userInfo = new userInfo();
                userInfo.openId = _usrInfo["openId"].ToString();

                try //部分驗證返回值中沒有unionId
                {
                    userInfo.unionId = _usrInfo["unionId"].ToString();
                }
                catch (Exception)
                {
                    userInfo.unionId = "unionId";
                }
                
                userInfo.nickName = _usrInfo["nickName"].ToString();
                userInfo.gender = _usrInfo["gender"].ToString();
                userInfo.city = _usrInfo["city"].ToString();
                userInfo.province = _usrInfo["province"].ToString();
                userInfo.country = _usrInfo["country"].ToString();
                userInfo.avatarUrl = _usrInfo["avatarUrl"].ToString();

                object watermark = _usrInfo["watermark"].ToString();
                object appid = _usrInfo["watermark"]["appid"].ToString();
                object timestamp = _usrInfo["watermark"]["timestamp"].ToString();


                #region


                //創建連接池對象(與數據庫服務器進行連接)
                SqlConnection conn = new SqlConnection("server=127.0.0.1;database=Test;uid=sa;pwd=1");
                //打開連接池
                conn.Open();
                //創建命令對象
                string Qrystr = "SELECT * FROM WeChatUsers WHERE openId='" + userInfo.openId + "'";
                SqlCommand cmdQry = new SqlCommand(Qrystr, conn);
                object  obj = cmdQry.ExecuteScalar();
                if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                {
                    string str = "INSERT INTO WeChatUsers ([UnionId] ,[OpenId],[NickName],[Gender],[City],[Province],[Country],[AvatarUrl],[Appid],[Timestamp],[Memo],[counts])VALUES('" + userInfo.unionId + "','" + userInfo.openId + "','" + userInfo.nickName + "','" + userInfo.gender + "','" + userInfo.city + "','" + userInfo.province + "','" + userInfo.country + "','" + userInfo.avatarUrl + "','" + appid.ToString() + "','" + timestamp.ToString() + "','來自微信小程序','1')";

                    SqlCommand cmdUp = new SqlCommand(str, conn);
                    // 執行操作
                    try
                    {
                        int row = cmdUp.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        context.Response.Write(ex.ToString());
                    }
                }
                else
                {
                    //多次訪問,記錄訪問次數counts   更新unionId是預防最初沒有,後期關聯後卻仍未記錄
                    string str = "UPDATE dbo.WeChatUsers SET counts = counts+1,UnionId = '" + userInfo.unionId + "' WHERE OpenId='" + userInfo.openId + "'";
                    SqlCommand cmdUp = new SqlCommand(str, conn);
                    int row = cmdUp.ExecuteNonQuery();
                }
               
                //關閉連接池
                conn.Close();
                #endregion

                //返回解密後的用戶數據
                context.Response.Write(result);
            }
            else
            {
                context.Response.Write(j);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}




GetUsersHelper 幫助類

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace AIOWeb.Models
{
    public class GetUsersHelper
    {

        /// <summary>
        /// 獲取鏈接返回數據
        /// </summary>
        /// <param name="Url">鏈接</param>
        /// <param name="type">請求類型</param>
        /// <returns></returns>
        public  string GetUrltoHtml(string Url, string type)
        {
            try
            {
                System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);
                // Get the response instance.
                System.Net.WebResponse wResp = wReq.GetResponse();
                System.IO.Stream respStream = wResp.GetResponseStream();
                // Dim reader As StreamReader = New StreamReader(respStream)
                using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (System.Exception ex)
            {
                return ex.Message;
            }
        }
        #region 微信小程序用戶數據解密

        public static string AesKey;
        public static string AesIV;

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="inputdata">輸入的數據encryptedData</param>
        /// <param name="AesKey">key</param>
        /// <param name="AesIV">向量128</param>
        /// <returns name="result">解密後的字符串</returns>
        public string AESDecrypt(string inputdata)
        {
            try
            {
                AesIV = AesIV.Replace(" ", "+");
                AesKey = AesKey.Replace(" ", "+");
                inputdata = inputdata.Replace(" ", "+");
                byte[] encryptedData = Convert.FromBase64String(inputdata);

                RijndaelManaged rijndaelCipher = new RijndaelManaged();
                rijndaelCipher.Key = Convert.FromBase64String(AesKey); // Encoding.UTF8.GetBytes(AesKey);
                rijndaelCipher.IV = Convert.FromBase64String(AesIV);// Encoding.UTF8.GetBytes(AesIV);
                rijndaelCipher.Mode = CipherMode.CBC;
                rijndaelCipher.Padding = PaddingMode.PKCS7;
                ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
                byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
                string result = Encoding.UTF8.GetString(plainText);

                return result;
            }
            catch (Exception)
            {
                return null;

            }
        }
        #endregion
    }
}

===============================================後補:實體類========================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AIOWeb.Models
{
    public class wechat
    {
    }
    #region 實體類
    /// <summary>
    /// 微信用戶類
    /// </summary>
    public class userInfo
    {
        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 data watermark { get; set; }
    }
    /// <summary>
    /// 微信用戶數據水印
    /// </summary>
    public class data
    {
        public string appid { get; set; }
        public string timestamp { get; set; }
    }
    /// <summary>
    /// 微信小程序驗證返回結果
    /// </summary>
    public class result
    {
        public string openid { get; set; }
        public string session_key { get; set; }
        public string errcode { get; set; }
        public string errmsg { get; set; }
    }
    #endregion
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章