C#微信小程序服务端获取用户解密信息实例代码


Posted in Javascript onMarch 10, 2017

 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 
  } 
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jQuery获取文本节点之 text()/val()/html() 方法区别
Mar 01 Javascript
被遗忘的javascript的slice() 方法
Apr 20 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
Jul 27 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
vue滚动轴插件better-scroll使用详解
Oct 17 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
JS使用Dijkstra算法求解最短路径
Jan 17 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
Jan 30 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
vue 实现路由跳转时更改页面title
Nov 05 Javascript
vuejs中父子组件之间通信方法实例详解
Jan 17 Javascript
js实现产品缩略图效果
Mar 10 #Javascript
BootStrap注意事项小结(五)表单
Mar 10 #Javascript
微信小程序 弹框和模态框实现代码
Mar 10 #Javascript
BootStrap表单宽度设置方法
Mar 10 #Javascript
Angular.js基础学习之初始化
Mar 10 #Javascript
js实现返回顶部效果
Mar 10 #Javascript
Vue.directive自定义指令的使用详解
Mar 10 #Javascript
You might like
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
PDO::exec讲解
2019/01/28 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
windows下python和pip安装教程
2018/05/25 Python
使用Python处理BAM的方法
2018/09/28 Python
python制作抖音代码舞
2019/04/07 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
综合办公室主任职责
2013/12/16 职场文书
土木工程专业推荐信
2014/02/19 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
我的梦想演讲稿
2014/04/30 职场文书
大学新生军训方案
2014/05/03 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
主要领导对照检查材料
2014/08/26 职场文书
周一问候语大全
2015/11/10 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis