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

该博客介绍了如何使用C#实现微信小程序的用户数据解密过程,包括从微信服务端获取session_key和openid,解密encryptedData获取用户信息,并将这些信息存储到数据库中。涉及的主要技术包括HTTP请求、JSON解析、AES解密以及SQL数据库操作。
摘要由CSDN通过智能技术生成

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

{

///

/// wxapi 的摘要说明

///

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

{

///

/// 获取链接返回数据

///

/// 链接

/// 请求类型

///

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;

///

/// AES解密

///

/// 输入的数据encryptedData

/// key

/// 向量128

/// 解密后的字符串

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值