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
- }
- }
C#微信小程序服务端获取用户解密信息的更多相关文章
- java实现微信小程序服务端(登录)
微信小程序如今被广泛使用,微信小程序按照微信官网的定义来说就是: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 这就是微信小程序的魅力所在,有 ...
- [小程序]微信小程序登陆并获取用户信息
1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid ...
- 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密
后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...
- 逍遥云天 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密
后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...
- Node.js Koa2开发微信小程序服务端
1.promise.async.await const Koa = require('koa') const app = new Koa() // 应用程序对象 有很多中间件 // 发送HTTP KO ...
- 【微信小程序】如何获取用户绑定手机号
用户调用wx.login()方法,获取登录用户凭证code wx.login({ success: function(res) { console.log('loginCode', res.code) ...
- 微信小程序案例:获取微信访问用户的openid
在微信开发项目中,获取openid是项目常遇的问题,本文通过主要讲解实现在微信小程序中如何获取用户的openid,案例实现非常简单 具体实现方法是通过登录接口获取登录凭证,然后通过request请求微 ...
- [技术博客] 微信小程序的formid获取
微信小程序的formid获取 formId的触发 微信小程序可以通过收集用户的formid,获取formid给用户主动推送微信消息.获取formid有两个途径,一个是触发一次表单提交,或者触发一次支付 ...
- 微信小程序之动态获取元素宽高
我以前一直以为微信小程序不能动态获取view元素的宽高.但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了... 那么,这个api接口怎么用 ...
随机推荐
- Android-Java-面向对象的代码例子
需求一:用手机打电话,发短信,看视频,听音乐,用面向对象思想实现: package android.java.oop01; /** * 1.既然是面向/面对 --> 对象 就要把 (用手机打电话 ...
- 分形之列维(levy)曲线
莱维C形曲线(Lévy C curve)是个自我相似的分形,最先由保罗·皮埃尔·莱维在1938年的论文Plane or Space Curves and Surfaces Consisting of ...
- .net图表之ECharts随笔07-自定义系列(多边形)
搞了一天多,才勉强搞出了一个不紧凑的六边形统计图,是真的菜. 这里ECharts的用法与06说的同一种,直接使用带all的js 先上个效果图,用面积来表示人数的多少 1. 参数option的toolt ...
- Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法
引言 EF是相对与Dapper.NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制.跟踪机制,所以在使用时有些地方需要特别注意. 下面我将自己 ...
- 剑指offer编程题Java实现——面试题4替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; ...
- Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)
在我们的APP开发中,通常需要获取到设备的唯一标识.在Android6.0之前,有很多方法我们可以方便获取到硬件的唯一标识,但是在Android6.0之后,Android系统大幅限制了我们获取设备的硬 ...
- OSLab文件描述符
日期:2019/3/24 内容:Linux文件描述符. 一.基本概念 文件描述符(File Descriptor) 一个非负整数.应用程序利用文件描述符来访问文件.打开现存文件或新建文件时,内 ...
- Linux学习笔记-基本操作4
1. gdb调试2. makefile的编写3. 系统IO函数 1. gdb调试: 1. 启动gdb + 可执行文件 2. 查看代码: l== ...
- 在redis中使用lua脚本
在实际工作过程中,可以使用lua脚本来解决一些需要保证原子性的问题,而且lua脚本可以缓存在redis服务器上,势必会增加性能. 不过lua也会有很多限制,在使用的时候要注意. 在Redis中执行Lu ...
- Xamarin 绑定安卓第三方库恢复原始参数问题
大家都知道在绑定xamarin android 第三方库的时候 参数名是乱码的 变成了p1 p2 p3 之类的 这样在实际使用的时候非常不方便. 其实xamarin是提供了三种方式帮助大家恢复ja ...