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

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

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

(0)

相关推荐

  • C#开发微信公众号接口开发

    具体实现方式不多说了,请看下文 一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础

  • C#微信公众平台开发之高级群发接口

    涉及access_token的获取请参考<C#微信公众平台开发之access_token的获取存储与更新> 一.为了实现高级群发功能,需要解决的问题 1.通过微信接口上传图文消息素材时,Json中的图片不是url而是media_id,如何通过微信接口上传图片并获取图片的media_id? 2.图片存储在什么地方,如何获取? 二.实现步骤,以根据OpenID列表群发图文消息为例 1.准备数据 我把数据存储在数据库中,ImgUrl字段是图片在服务器上的相对路径(这里的服务器是自己的服务器,不是微信

  • C#.net 微信公众账号接口开发

    微信越来越火,微信公众平台成为开发成新宠,本文用C#.net开发微信公众信号接口. 微信接口地址代码: weixin _wx = new weixin(); string postStr = ""; if (Request.HttpMethod.ToLower() == "post") { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Leng

  • C#微信开发之获取接口调用凭据

    获取接口调用凭据 ①接口说明 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2h(7200s),需定时刷新,重复获取将导致上次获取的access_token失效. 公众平台的API调用所需的access_token的使用及生成方式说明: 1.为了保密appsecrect,第三方需要一个access_token获取和刷新的中控

  • c#封装百度web服务geocoding api 、百度坐标转换示例

    1.创建基础参数类 复制代码 代码如下: public static class BaiduConstParams    {        public const string PlaceApIv2Search = "http://api.map.baidu.com/place/v2/search";        public const string PlaceApIv2Detail = "http://api.map.baidu.com/place/v2/detail

  • C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂.如送积分啊,写用户日志啊,分配用户组啊.等等--一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完

  • C#微信公众平台开发之access_token的获取存储与更新

    一.什么是access_token? access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效.由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务. 二.要解决的问题 1.如何获取access_token. 2.由于acces

  • C#实现解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市的方法

    本文实例讲述了C#实现解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市的方法,分享给大家供大家参考.具体实现方法如下: 一.百度天气 接口地址:http://api.map.baidu.com/telematics/v3/weather?location=上海&output=json&ak=hXWAgbsCC9UTkBO5V5Qg1WZ9,其中ak是密钥,自行去申请即可,便于大家测试,楼主就公布并了自己的Key,这样可以直接获取到数据. 获取到的数据是这样的: 复制代码 代码如

  • C#实现百度网站收录和排名查询功能思路及实例

    一.前言 偶然一次在vs2012默认的项目文件夹里发现了以前自己做的一个关于SEO的类库,主要是用来查询某个网址的收录次数还有网站的排行数,后来重构了下,今天拿出来写篇文章,说说自己是如何思考的并完成的. 二.问题描述 首先需要考虑的是能够支持哪些搜索引擎的查询,首先是百度,然后是必应.搜狗.搜搜.360.本来想支持Google但是一想不对,根本不好访问的,所以暂时不算在内.而我们实际要做的就是根据一个网址能够检索出这个网址的在各个搜索引擎的收录次数以及在不同关键词下的网址排行,这里出入的只有网

  • C#实现微信结合百度api获取当前用户地理位置的方法

    本文实例讲述了C#实现微信结合百度api获取当前用户地理位置的方法.分享给大家供大家参考,具体如下: 操作步骤: 1. 先根据微信提供的接口文档获取到经纬度 参考文档地址:http://mp.weixin.qq.com/wiki/8/1b86529d05db9f960e48c3c7ca5be288.html 2. 由于直接使用微信获取到的经纬度,来使用百度地图api获取地址存在500~1000米的偏差,有时候定位不是很准确,所以需要转换成百度的坐标 参考文档地址:http://developer

  • C#实现百度ping推送功能的方法

    网站优化必做的事情之一,百度ping,主动推送给百度 文章添加时调用百度推送方法 //保存 protected void btnSubmit_Click(object sender, EventArgs e) { if (action == DTEnums.ActionEnum.Edit.ToString()) //修改 { ChkAdminLevel("channel_" + this.channel_name + "_list", DTEnums.ActionE

  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示: <script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script> <script language="javascript" type="text/javascript" src="js/area.j

随机推荐