.NET微信小程序用户数据的签名验证和解密代码
微信小程序时下大热,抱着学习的心态了解了一下,目前没有搜到完整的.NET用户数据签名验证和解密代码,于是就写了一点。
简单使用方法:
1、客户端调用wx.getUserInfo方法,服务端创建WeChatLoginInfo类的实例接收客户端发来的数据;
2、服务端新建WeChatAppDecrypt类的实例,初始化此类时需传入appId与AppSecret用于验证;
3、调用WeChatAppDecrypt类中的Decrypt方法,传入步骤1中获取的WechatLoginInfo实例;
4、得到WechatUserInfo类的实例,其中就是解密好的数据。
话不多说,注释比较详尽,感兴趣的朋友可以参考。
usingSystem;
usingSystem.Net;
usingSystem.Net.Http;
usingSystem.Net.Http.Headers;
usingNewtonsoft.Json;
usingSystem.Security.Cryptography;
usingSystem.Text;
namespaceBroadSky.WeChatAppDecrypt
{
///
///处理微信小程序用户数据的签名验证和解密
///
publicclassWeChatAppDecrypt
{
privatestringappId;
privatestringappSecret;
///
///构造函数
///
///应用程序的AppId
///应用程序的AppSecret
publicWeChatAppDecrypt(stringappId,stringappSecret)
{
this.appId=appId;
this.appSecret=appSecret;
return;
}
///
///获取OpenId和SessionKey的Json数据包
///
///客户端发来的code
///Json数据包
privatestringGetOpenIdAndSessionKeyString(stringcode)
{
stringtemp="https://api.weixin.qq.com/sns/jscode2session?"+
"appid="+appId
+"&secret="+appSecret
+"&js_code="+code
+"&grant_type=authorization_code";
returnGetResponse(temp);
}
///
///反序列化包含OpenId和SessionKey的Json数据包
///
///Json数据包
///包含OpenId和SessionKey的类
publicOpenIdAndSessionKeyDecodeOpenIdAndSessionKey(WechatLoginInfologinInfo)
{
OpenIdAndSessionKeyoiask=JsonConvert.DeserializeObject(GetOpenIdAndSessionKeyString(loginInfo.code));
if(!String.IsNullOrEmpty(oiask.errcode))
returnnull;
returnoiask;
}
///
///根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效
///
///公开的用户资料
///公开资料携带的签名信息
///从服务端获取的SessionKey
///True:资料有效,False:资料无效
publicboolVaildateUserInfo(stringrawData,stringsignature,stringsessionKey)
{
//创建SHA1签名类
SHA1sha1=newSHA1CryptoServiceProvider();
//编码用于SHA1验证的源数据
byte[]source=Encoding.UTF8.GetBytes(rawData+sessionKey);
//生成签名
byte[]target=sha1.ComputeHash(source);
//转化为string类型,注意此处转化后是中间带短横杠的大写字母,需要剔除横杠转小写字母
stringresult=BitConverter.ToString(target).Replace("-","").ToLower();
//比对,输出验证结果
returnsignature==result;
}
///
///根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效
///
///登陆信息
///从服务端获取的SessionKey
///True:资料有效,False:资料无效
publicboolVaildateUserInfo(WechatLoginInfologinInfo,stringsessionKey)
{
returnVaildateUserInfo(loginInfo.rawData,loginInfo.signature,sessionKey);
}
///
///根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效
///
///登陆信息
///包含OpenId和SessionKey的类
///True:资料有效,False:资料无效
publicboolVaildateUserInfo(WechatLoginInfologinInfo,OpenIdAndSessionKeyidAndKey)
{
returnVaildateUserInfo(loginInfo,idAndKey.session_key);
}
///
///根据微信小程序平台提供的解密算法解密数据
///
///加密数据
///初始向量
///从服务端获取的SessionKey
///
publicWechatUserInfoDecrypt(stringencryptedData,stringiv,stringsessionKey)
{
WechatUserInfouserInfo;
//创建解密器生成工具实例
AesCryptoServiceProvideraes=newAesCryptoServiceProvider();
//设置解密器参数
aes.Mode=CipherMode.CBC;
aes.BlockSize=128;
aes.Padding=PaddingMode.PKCS7;
//格式化待处理字符串
byte[]byte_encryptedData=Convert.FromBase64String(encryptedData);
byte[]byte_iv=Convert.FromBase64String(iv);
byte[]byte_sessionKey=Convert.FromBase64String(sessionKey);
aes.IV=byte_iv;
aes.Key=byte_sessionKey;
//根据设置好的数据生成解密器实例
ICryptoTransformtransform=aes.CreateDecryptor();
//解密
byte[]final=transform.TransformFinalBlock(byte_encryptedData,0,byte_encryptedData.Length);
//生成结果
stringresult=Encoding.UTF8.GetString(final);
//反序列化结果,生成用户信息实例
userInfo=JsonConvert.DeserializeObject(result);
returnuserInfo;
}
///
///根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法
///
///登陆信息
///用户信息
publicWechatUserInfoDecrypt(WechatLoginInfologinInfo)
{
if(loginInfo==null)
returnnull;
if(String.IsNullOrEmpty(loginInfo.code))
returnnull;
OpenIdAndSessionKeyoiask=DecodeOpenIdAndSessionKey(loginInfo);
if(oiask==null)
returnnull;
if(!VaildateUserInfo(loginInfo,oiask))
returnnull;
WechatUserInfouserInfo=Decrypt(loginInfo.encryptedData,loginInfo.iv,oiask.session_key);
returnuserInfo;
}
///
///GET请求
///
///
///
privatestringGetResponse(stringurl)
{
if(url.StartsWith("https"))
System.Net.ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls;
HttpClienthttpClient=newHttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(
newMediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessageresponse=httpClient.GetAsync(url).Result;
if(response.IsSuccessStatusCode)
{
stringresult=response.Content.ReadAsStringAsync().Result;
returnresult;
}
returnnull;
}
}
///
///微信小程序登录信息结构
///
publicclassWechatLoginInfo
{
publicstringcode{get;set;}
publicstringencryptedData{get;set;}
publicstringiv{get;set;}
publicstringrawData{get;set;}
publicstringsignature{get;set;}
}
///
///微信小程序用户信息结构
///
publicclassWechatUserInfo
{
publicstringopenId{get;set;}
publicstringnickName{get;set;}
publicstringgender{get;set;}
publicstringcity{get;set;}
publicstringprovince{get;set;}
publicstringcountry{get;set;}
publicstringavatarUrl{get;set;}
publicstringunionId{get;set;}
publicWatermarkwatermark{get;set;}
publicclassWatermark
{
publicstringappid{get;set;}
publicstringtimestamp{get;set;}
}
}
///
///微信小程序从服务端获取的OpenId和SessionKey信息结构
///
publicclassOpenIdAndSessionKey
{
publicstringopenid{get;set;}
publicstringsession_key{get;set;}
publicstringerrcode{get;set;}
publicstringerrmsg{get;set;}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。