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

该代码实例展示了如何在C#中使用微信API获取用户登录凭证并解密用户信息,然后将解密后的数据存储到SQL数据库中。通过调用微信的sns/jscode2session接口,获取openid和session_key,接着解密encrypteddata字段获取用户详细信息,并根据用户访问次数更新数据库记录。
摘要由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

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值