小程序交流群:528215729,加入和小伙伴们一起探讨开发疑难、运营idea吧

admin

admin

发表于 2018-04-20 22:59:10

摘要:C#微信小程序服务端获取用户解密信息 (微信小程序开发 - 微信 小程序外包开发-微信小程序 开发教程-微信小程序开发者社区,尽在 www.mntuku.cn)



[csharp] view plain copy
  1. using AIOWeb.Models;  
  2. using Newtonsoft.Json;  
  3. using Newtonsoft.Json.Linq;  
  4. using System;  
  5. using System.Collections.Generic;  
  6. using System.Data;  
  7. using System.Data.SqlClient;  
  8. using System.Linq;  
  9. using System.Web;  
  10.   
  11. namespace AIOWeb  
  12. {  
  13.     ///   
  14.     /// wxapi 的摘要说明  
  15.     ///   
  16.     public class wxapi : IHttpHandler  
  17.     {  
  18.         public void ProcessRequest(HttpContext context)  
  19.         {  
  20.             context.Response.ContentType = "text/plain";  
  21.   
  22.             string code = "";  
  23.             string iv = "";  
  24.             string encryptedData = "";  
  25.             try  
  26.             {  
  27.                 code = HttpContext.Current.Request.QueryString["code"].ToString();  
  28.                 iv = HttpContext.Current.Request.QueryString["iv"].ToString();  
  29.                 encryptedData = HttpContext.Current.Request.QueryString["encryptedData"].ToString();  
  30.             }  
  31.             catch (Exception ex)  
  32.             {  
  33.                 context.Response.Write(ex.ToString());  
  34.             }  
  35.   
  36.             string Appid = "wxdb2641f85b04f1b3";  
  37.             string Secret = "8591d8cd7197b9197e17b3275329a1e7";  
  38.             string grant_type = "authorization_code";  
  39.   
  40.             //向微信服务端 使用登录凭证 code 获取 session_key 和 openid   
  41.             string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + Appid + "&secret=" + Secret + "&js_code=" + code + "&grant_type=" + grant_type;  
  42.             string type = "utf-8";  
  43.   
  44.             AIOWeb.Models.GetUsersHelper GetUsersHelper = new AIOWeb.Models.GetUsersHelper();  
  45.             string j = GetUsersHelper.GetUrltoHtml(url, type);//获取微信服务器返回字符串  
  46.   
  47.             //将字符串转换为json格式  
  48.             JObject jo = (JObject)JsonConvert.DeserializeObject(j);  
  49.   
  50.             result res = new result();  
  51.             try  
  52.             {  
  53.                 //微信服务器验证成功  
  54.                 res.openid = jo["openid"].ToString();  
  55.                 res.session_key = jo["session_key"].ToString();  
  56.             }  
  57.             catch (Exception)  
  58.             {  
  59.                 //微信服务器验证失败  
  60.                 res.errcode = jo["errcode"].ToString();  
  61.                 res.errmsg = jo["errmsg"].ToString();  
  62.             }  
  63.             if (!string.IsNullOrEmpty(res.openid))  
  64.             {  
  65.                 //用户数据解密  
  66.                 GetUsersHelper.AesIV = iv;  
  67.                 GetUsersHelper.AesKey = res.session_key;  
  68.   
  69.                 string result = GetUsersHelper.AESDecrypt(encryptedData);  
  70.   
  71.   
  72.                 //存储用户数据  
  73.                 JObject _usrInfo = (JObject)JsonConvert.DeserializeObject(result);  
  74.   
  75.                 userInfo userInfo = new userInfo();  
  76.                 userInfo.openId = _usrInfo["openId"].ToString();  
  77.   
  78.                 try //部分验证返回值中没有unionId  
  79.                 {  
  80.                     userInfo.unionId = _usrInfo["unionId"].ToString();  
  81.                 }  
  82.                 catch (Exception)  
  83.                 {  
  84.                     userInfo.unionId = "unionId";  
  85.                 }  
  86.                   
  87.                 userInfo.nickName = _usrInfo["nickName"].ToString();  
  88.                 userInfo.gender = _usrInfo["gender"].ToString();  
  89.                 userInfo.city = _usrInfo["city"].ToString();  
  90.                 userInfo.province = _usrInfo["province"].ToString();  
  91.                 userInfo.country = _usrInfo["country"].ToString();  
  92.                 userInfo.avatarUrl = _usrInfo["avatarUrl"].ToString();  
  93.   
  94.                 object watermark = _usrInfo["watermark"].ToString();  
  95.                 object appid = _usrInfo["watermark"]["appid"].ToString();  
  96.                 object timestamp = _usrInfo["watermark"]["timestamp"].ToString();  
  97.  
  98.  
  99.                 #region  
  100.   
  101.   
  102.                 //创建连接池对象(与数据库服务器进行连接)  
  103.                 SqlConnection conn = new SqlConnection("server=127.0.0.1;database=Test;uid=sa;pwd=1");  
  104.                 //打开连接池  
  105.                 conn.Open();  
  106.                 //创建命令对象  
  107.                 string Qrystr = "SELECT * FROM WeChatUsers WHERE openId=" + userInfo.openId + "";  
  108.                 SqlCommand cmdQry = new SqlCommand(Qrystr, conn);  
  109.                 object  obj = cmdQry.ExecuteScalar();  
  110.                 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))  
  111.                 {  
  112.                     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)";  
  113.   
  114.                     SqlCommand cmdUp = new SqlCommand(str, conn);  
  115.                     // 执行操作  
  116.                     try  
  117.                     {  
  118.                         int row = cmdUp.ExecuteNonQuery();  
  119.                     }  
  120.                     catch (Exception ex)  
  121.                     {  
  122.                         context.Response.Write(ex.ToString());  
  123.                     }  
  124.                 }  
  125.                 else  
  126.                 {  
  127.                     //多次访问,记录访问次数counts   更新unionId是预防最初没有,后期关联后却仍未记录  
  128.                     string str = "UPDATE dbo.WeChatUsers SET counts = counts+1,UnionId = " + userInfo.unionId + " WHERE OpenId=" + userInfo.openId + "";  
  129.                     SqlCommand cmdUp = new SqlCommand(str, conn);  
  130.                     int row = cmdUp.ExecuteNonQuery();  
  131.                 }  
  132.                  
  133.                 //关闭连接池  
  134.                 conn.Close();  
  135.                 #endregion  
  136.   
  137.                 //返回解密后的用户数据  
  138.                 context.Response.Write(result);  
  139.             }  
  140.             else  
  141.             {  
  142.                 context.Response.Write(j);  
  143.             }  
  144.         }  
  145.   
  146.         public bool IsReusable  
  147.         {  
  148.             get  
  149.             {  
  150.                 return false;  
  151.             }  
  152.         }  
  153.     }  
  154. }  




GetUsersHelper 帮助类

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.IO;  
  4. using System.Linq;  
  5. using System.Security.Cryptography;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9. namespace AIOWeb.Models  
  10. {  
  11.     public class GetUsersHelper  
  12.     {  
  13.   
  14.         ///   
  15.         /// 获取链接返回数据  
  16.         ///   
  17.         /// 链接  
  18.         /// 请求类型  
  19.         ///   
  20.         public  string GetUrltoHtml(string Url, string type)  
  21.         {  
  22.             try  
  23.             {  
  24.                 System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);  
  25.                 // Get the response instance.  
  26.                 System.Net.WebResponse wResp = wReq.GetResponse();  
  27.                 System.IO.Stream respStream = wResp.GetResponseStream();  
  28.                 // Dim reader As StreamReader = New StreamReader(respStream)  
  29.                 using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))  
  30.                 {  
  31.                     return reader.ReadToEnd();  
  32.                 }  
  33.             }  
  34.             catch (System.Exception ex)  
  35.             {  
  36.                 return ex.Message;  
  37.             }  
  38.         }  
  39.         #region 微信小程序用户数据解密  
  40.   
  41.         public static string AesKey;  
  42.         public static string AesIV;  
  43.   
  44.         ///   
  45.         /// AES解密  
  46.         ///   
  47.         /// 输入的数据encryptedData  
  48.         /// key  
  49.         /// 向量128  
  50.         /// 解密后的字符串  
  51.         public string AESDecrypt(string inputdata)  
  52.         {  
  53.             try  
  54.             {  
  55.                 AesIV = AesIV.Replace(" ""+");  
  56.                 AesKey = AesKey.Replace(" ""+");  
  57.                 inputdata = inputdata.Replace(" ""+");  
  58.                 byte[] encryptedData = Convert.FromBase64String(inputdata);  
  59.   
  60.                 RijndaelManaged rijndaelCipher = new RijndaelManaged();  
  61.                 rijndaelCipher.Key = Convert.FromBase64String(AesKey); // Encoding.UTF8.GetBytes(AesKey);  
  62.                 rijndaelCipher.IV = Convert.FromBase64String(AesIV);// Encoding.UTF8.GetBytes(AesIV);  
  63.                 rijndaelCipher.Mode = CipherMode.CBC;  
  64.                 rijndaelCipher.Padding = PaddingMode.PKCS7;  
  65.                 ICryptoTransform transform = rijndaelCipher.CreateDecryptor();  
  66.                 byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);  
  67.                 string result = Encoding.UTF8.GetString(plainText);  
  68.   
  69.                 return result;  
  70.             }  
  71.             catch (Exception)  
  72.             {  
  73.                 return null;  
  74.   
  75.             }  
  76.         }  
  77.         #endregion  
  78.     }  
  79. }  

===============================================后补:实体类========================================
[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. namespace AIOWeb.Models  
  7. {  
  8.     public class wechat  
  9.     {  
  10.     }  
  11.     #region 实体类  
  12.     ///   
  13.     /// 微信用户类  
  14.     ///   
  15.     public class userInfo  
  16.     {  
  17.         public string openId { getset; }  
  18.         public string nickName { getset; }  
  19.         public string gender { getset; }  
  20.         public string city { getset; }  
  21.         public string province { getset; }  
  22.         public string country { getset; }  
  23.         public string avatarUrl { getset; }  
  24.         public string unionId { getset; }  
  25.         public data watermark { getset; }  
  26.     }  
  27.     ///   
  28.     /// 微信用户数据水印  
  29.     ///   
  30.     public class data  
  31.     {  
  32.         public string appid { getset; }  
  33.         public string timestamp { getset; }  
  34.     }  
  35.     ///   
  36.     /// 微信小程序验证返回结果  
  37.     ///   
  38.     public class result  
  39.     {  
  40.         public string openid { getset; }  
  41.         public string session_key { getset; }  
  42.         public string errcode { getset; }  
  43.         public string errmsg { getset; }  
  44.     }  
  45.     #endregion  
  46. }  
[csharp] view plain copy
  1. using AIOWeb.Models;  
  2. using Newtonsoft.Json;  
  3. using Newtonsoft.Json.Linq;  
  4. using System;  
  5. using System.Collections.Generic;  
  6. using System.Data;  
  7. using System.Data.SqlClient;  
  8. using System.Linq;  
  9. using System.Web;  
  10.   
  11. namespace AIOWeb  
  12. {  
  13.     ///   
  14.     /// wxapi 的摘要说明  
  15.     ///   
  16.     public class wxapi : IHttpHandler  
  17.     {  
  18.         public void ProcessRequest(HttpContext context)  
  19.         {  
  20.             context.Response.ContentType = "text/plain";  
  21.   
  22.             string code = "";  
  23.             string iv = "";  
  24.             string encryptedData = "";  
  25.             try  
  26.             {  
  27.                 code = HttpContext.Current.Request.QueryString["code"].ToString();  
  28.                 iv = HttpContext.Current.Request.QueryString["iv"].ToString();  
  29.                 encryptedData = HttpContext.Current.Request.QueryString["encryptedData"].ToString();  
  30.             }  
  31.             catch (Exception ex)  
  32.             {  
  33.                 context.Response.Write(ex.ToString());  
  34.             }  
  35.   
  36.             string Appid = "wxdb2641f85b04f1b3";  
  37.             string Secret = "8591d8cd7197b9197e17b3275329a1e7";  
  38.             string grant_type = "authorization_code";  
  39.   
  40.             //向微信服务端 使用登录凭证 code 获取 session_key 和 openid   
  41.             string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + Appid + "&secret=" + Secret + "&js_code=" + code + "&grant_type=" + grant_type;  
  42.             string type = "utf-8";  
  43.   
  44.             AIOWeb.Models.GetUsersHelper GetUsersHelper = new AIOWeb.Models.GetUsersHelper();  
  45.             string j = GetUsersHelper.GetUrltoHtml(url, type);//获取微信服务器返回字符串  
  46.   
  47.             //将字符串转换为json格式  
  48.             JObject jo = (JObject)JsonConvert.DeserializeObject(j);  
  49.   
  50.             result res = new result();  
  51.             try  
  52.             {  
  53.                 //微信服务器验证成功  
  54.                 res.openid = jo["openid"].ToString();  
  55.                 res.session_key = jo["session_key"].ToString();  
  56.             }  
  57.             catch (Exception)  
  58.             {  
  59.                 //微信服务器验证失败  
  60.                 res.errcode = jo["errcode"].ToString();  
  61.                 res.errmsg = jo["errmsg"].ToString();  
  62.             }  
  63.             if (!string.IsNullOrEmpty(res.openid))  
  64.             {  
  65.                 //用户数据解密  
  66.                 GetUsersHelper.AesIV = iv;  
  67.                 GetUsersHelper.AesKey = res.session_key;  
  68.   
  69.                 string result = GetUsersHelper.AESDecrypt(encryptedData);  
  70.   
  71.   
  72.                 //存储用户数据  
  73.                 JObject _usrInfo = (JObject)JsonConvert.DeserializeObject(result);  
  74.   
  75.                 userInfo userInfo = new userInfo();  
  76.                 userInfo.openId = _usrInfo["openId"].ToString();  
  77.   
  78.                 try //部分验证返回值中没有unionId  
  79.                 {  
  80.                     userInfo.unionId = _usrInfo["unionId"].ToString();  
  81.                 }  
  82.                 catch (Exception)  
  83.                 {  
  84.                     userInfo.unionId = "unionId";  
  85.                 }  
  86.                   
  87.                 userInfo.nickName = _usrInfo["nickName"].ToString();  
  88.                 userInfo.gender = _usrInfo["gender"].ToString();  
  89.                 userInfo.city = _usrInfo["city"].ToString();  
  90.                 userInfo.province = _usrInfo["province"].ToString();  
  91.                 userInfo.country = _usrInfo["country"].ToString();  
  92.                 userInfo.avatarUrl = _usrInfo["avatarUrl"].ToString();  
  93.   
  94.                 object watermark = _usrInfo["watermark"].ToString();  
  95.                 object appid = _usrInfo["watermark"]["appid"].ToString();  
  96.                 object timestamp = _usrInfo["watermark"]["timestamp"].ToString();  
  97.  
  98.  
  99.                 #region  
  100.   
  101.   
  102.                 //创建连接池对象(与数据库服务器进行连接)  
  103.                 SqlConnection conn = new SqlConnection("server=127.0.0.1;database=Test;uid=sa;pwd=1");  
  104.                 //打开连接池  
  105.                 conn.Open();  
  106.                 //创建命令对象  
  107.                 string Qrystr = "SELECT * FROM WeChatUsers WHERE openId=" + userInfo.openId + "";  
  108.                 SqlCommand cmdQry = new SqlCommand(Qrystr, conn);  
  109.                 object  obj = cmdQry.ExecuteScalar();  
  110.                 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))  
  111.                 {  
  112.                     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)";  
  113.   
  114.                     SqlCommand cmdUp = new SqlCommand(str, conn);  
  115.                     // 执行操作  
  116.                     try  
  117.                     {  
  118.                         int row = cmdUp.ExecuteNonQuery();  
  119.                     }  
  120.                     catch (Exception ex)  
  121.                     {  
  122.                         context.Response.Write(ex.ToString());  
  123.                     }  
  124.                 }  
  125.                 else  
  126.                 {  
  127.                     //多次访问,记录访问次数counts   更新unionId是预防最初没有,后期关联后却仍未记录  
  128.                     string str = "UPDATE dbo.WeChatUsers SET counts = counts+1,UnionId = " + userInfo.unionId + " WHERE OpenId=" + userInfo.openId + "";  
  129.                     SqlCommand cmdUp = new SqlCommand(str, conn);  
  130.                     int row = cmdUp.ExecuteNonQuery();  
  131.                 }  
  132.                  
  133.                 //关闭连接池  
  134.                 conn.Close();  
  135.                 #endregion  
  136.   
  137.                 //返回解密后的用户数据  
  138.                 context.Response.Write(result);  
  139.             }  
  140.             else  
  141.             {  
  142.                 context.Response.Write(j);  
  143.             }  
  144.         }  
  145.   
  146.         public bool IsReusable  
  147.         {  
  148.             get  
  149.             {  
  150.                 return false;  
  151.             }  
  152.         }  
  153.     }  
  154. }  




GetUsersHelper 帮助类

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.IO;  
  4. using System.Linq;  
  5. using System.Security.Cryptography;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9. namespace AIOWeb.Models  
  10. {  
  11.     public class GetUsersHelper  
  12.     {  
  13.   
  14.         ///   
  15.         /// 获取链接返回数据  
  16.         ///   
  17.         /// 链接  
  18.         /// 请求类型  
  19.         ///   
  20.         public  string GetUrltoHtml(string Url, string type)  
  21.         {  
  22.             try  
  23.             {  
  24.                 System.Net.WebRequest wReq = System.Net.WebRequest.Create(Url);  
  25.                 // Get the response instance.  
  26.                 System.Net.WebResponse wResp = wReq.GetResponse();  
  27.                 System.IO.Stream respStream = wResp.GetResponseStream();  
  28.                 // Dim reader As StreamReader = New StreamReader(respStream)  
  29.                 using (System.IO.StreamReader reader = new System.IO.StreamReader(respStream, Encoding.GetEncoding(type)))  
  30.                 {  
  31.                     return reader.ReadToEnd();  
  32.                 }  
  33.             }  
  34.             catch (System.Exception ex)  
  35.             {  
  36.                 return ex.Message;  
  37.             }  
  38.         }  
  39.         #region 微信小程序用户数据解密  
  40.   
  41.         public static string AesKey;  
  42.         public static string AesIV;  
  43.   
  44.         ///   
  45.         /// AES解密  
  46.         ///   
  47.         /// 输入的数据encryptedData  
  48.         /// key  
  49.         /// 向量128  
  50.         /// 解密后的字符串  
  51.         public string AESDecrypt(string inputdata)  
  52.         {  
  53.             try  
  54.             {  
  55.                 AesIV = AesIV.Replace(" ""+");  
  56.                 AesKey = AesKey.Replace(" ""+");  
  57.                 inputdata = inputdata.Replace(" ""+");  
  58.                 byte[] encryptedData = Convert.FromBase64String(inputdata);  
  59.   
  60.                 RijndaelManaged rijndaelCipher = new RijndaelManaged();  
  61.                 rijndaelCipher.Key = Convert.FromBase64String(AesKey); // Encoding.UTF8.GetBytes(AesKey);  
  62.                 rijndaelCipher.IV = Convert.FromBase64String(AesIV);// Encoding.UTF8.GetBytes(AesIV);  
  63.                 rijndaelCipher.Mode = CipherMode.CBC;  
  64.                 rijndaelCipher.Padding = PaddingMode.PKCS7;  
  65.                 ICryptoTransform transform = rijndaelCipher.CreateDecryptor();  
  66.                 byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);  
  67.                 string result = Encoding.UTF8.GetString(plainText);  
  68.   
  69.                 return result;  
  70.             }  
  71.             catch (Exception)  
  72.             {  
  73.                 return null;  
  74.   
  75.             }  
  76.         }  
  77.         #endregion  
  78.     }  
  79. }  

===============================================后补:实体类========================================
[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. namespace AIOWeb.Models  
  7. {  
  8.     public class wechat  
  9.     {  
  10.     }  
  11.     #region 实体类  
  12.     ///   
  13.     /// 微信用户类  
  14.     ///   
  15.     public class userInfo  
  16.     {  
  17.         public string openId { getset; }  
  18.         public string nickName { getset; }  
  19.         public string gender { getset; }  
  20.         public string city { getset; }  
  21.         public string province { getset; }  
  22.         public string country { getset; }  
  23.         public string avatarUrl { getset; }  
  24.         public string unionId { getset; }  
  25.         public data watermark { getset; }  
  26.     }  
  27.     ///   
  28.     /// 微信用户数据水印  
  29.     ///   
  30.     public class data  
  31.     {  
  32.         public string appid { getset; }  
  33.         public string timestamp { getset; }  
  34.     }  
  35.     ///   
  36.     /// 微信小程序验证返回结果  
  37.     ///   
  38.     public class result  
  39.     {  
  40.         public string openid { getset; }  
  41.         public string session_key { getset; }  
  42.         public string errcode { getset; }  
  43.         public string errmsg { getset; }  
  44.     }  
  45.     #endregion  
  46. }  
923阅读 | 0评论
你的回应