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

    GetUsersHelper 帮助类

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

C#微信小程序服务端获取用户解密信息的更多相关文章

  1. java实现微信小程序服务端(登录)

    微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...

  2. [小程序]微信小程序登陆并获取用户信息

    1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid ...

  3. 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  4. 逍遥云天 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  5. Node.js Koa2开发微信小程序服务端

    1.promise.async.await const Koa = require('koa') const app = new Koa() // 应用程序对象 有很多中间件 // 发送HTTP KO ...

  6. 【微信小程序】如何获取用户绑定手机号

    用户调用wx.login()方法,获取登录用户凭证code wx.login({ success: function(res) { console.log('loginCode', res.code) ...

  7. 微信小程序案例:获取微信访问用户的openid

    在微信开发项目中,获取openid是项目常遇的问题,本文通过主要讲解实现在微信小程序中如何获取用户的openid,案例实现非常简单 具体实现方法是通过登录接口获取登录凭证,然后通过request请求微 ...

  8. [技术博客] 微信小程序的formid获取

    微信小程序的formid获取 formId的触发 微信小程序可以通过收集用户的formid,获取formid给用户主动推送微信消息.获取formid有两个途径,一个是触发一次表单提交,或者触发一次支付 ...

  9. 微信小程序之动态获取元素宽高

    我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...

随机推荐

  1. 程序bug导致了天大的损失,要枪毙程序猿吗?[ZZ]

    来自猫扑:程序bug导致了天大的损失,要枪毙程序猿吗? 0 引言 年会上Review 源代码算什么? 法庭上 Review code 才带劲..... 2015年9月3日,随着东京最高法院驳回瑞穗证券 ...

  2. php根据修改时间删除指定目录下文件

    //$dir-文件地址,$files-存储返回数组,$type-查找文件类型组 public function read_dir($dir,&$files,$type) { if(!is_di ...

  3. Regular Expression

    It's a very elegant summary of regular expression from The AWK Programming Language. 1. The regular ...

  4. AJPFX讲解外汇保证金交易的货币符号和外汇的报价方式

    AJPFX:外汇保证金交易的货币符号 认识货币名字是必须的入门基础,通过货币符号,首先要知道买卖哪个货币,下面是一些货币的符号.买卖外汇就是这些任意其中某两种货币的比值,也就是汇率.根据汇率比的升高或 ...

  5. 使用sqlmap对进行php+mysql注入实战

    作者:陈小兵一般来讲一旦网站存在sql注入漏洞,通过sql注入漏洞轻者可以获取数据,严重的将获取webshell以及服务器权限,但在实际漏洞利用和测试过程中,也可能因为服务器配置等情况导致无法获取权限 ...

  6. 为ElasticSearch添加HTTP基本认证

    ES的HTTP连接没有提供任何的权限控制措施,一旦部署在公共网络就容易有数据泄露的风险,尤其是加上类似elasticsearch-head这样友好的前端界面,简直让你的数据瞬间裸奔在黑客的眼皮底下.项 ...

  7. 机器学习基石笔记:16 Three Learning Principles

    三个理论上界: 三个线性模型: 三个关键工具: 三条学习规则: 1.奥卡姆剃刀定律 先从简单模型开始, 训练后出现欠拟合, 再尝试复杂点模型. 2.采样误差 训练.验证.测试数据尽量同分布. 3.数据 ...

  8. [LeetCode] 两数相加

    给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -& ...

  9. WebDriver高级应用实例(5)

    5.1对象库(UI Map) 目的:能够使用配置文件存储被测试页面上的元素的定位方式和定位表达式,做到定位数据和程序的分离.方便不具备编码能力的测试人员进行修改和配置. 被测网页的网址: http:/ ...

  10. POJ 2546

    #include<iostream> #include<numeric> #include<iomanip> #include<algorithm> # ...