c# 微信小程序添加卡券签名_C#.NET 微信小程序用户数据的签名验证和解密

本文档介绍了如何使用C#进行微信小程序的用户数据签名验证和解密,包括获取OpenId和SessionKey,以及利用微信小程序提供的算法验证用户数据的有效性和解密用户信息。
摘要由CSDN通过智能技术生成

using System;

using System.Net;

using System.Net.Http;

using System.Net.Http.Headers;

using Newtonsoft.Json;

using System.Security.Cryptography;

using System.Text;

namespace BroadSky.WeChatAppDecrypt

{

///

/// 处理微信小程序用户数据的签名验证和解密

///

public class WeChatAppDecrypt

{

private string appId;

private string appSecret;

///

/// 构造函数

///

/// 应用程序的AppId

/// 应用程序的AppSecret

public WeChatAppDecrypt(string appId, string appSecret)

{

this.appId = appId;

this.appSecret = appSecret;

return;

}

///

/// 获取OpenId和SessionKey的Json数据包

///

/// 客户端发来的code

/// Json数据包

private string GetOpenIdAndSessionKeyString(string code)

{

string temp = "https://api.weixin.qq.com/sns/jscode2session?" +

"appid=" + appId

+ "&secret=" + appSecret

+ "&js_code=" + code

+ "&grant_type=authorization_code";

return GetResponse(temp);

}

///

/// 反序列化包含OpenId和SessionKey的Json数据包

///

/// Json数据包

/// 包含OpenId和SessionKey的类

public OpenIdAndSessionKey DecodeOpenIdAndSessionKey(WechatLoginInfo loginInfo)

{

OpenIdAndSessionKey oiask = JsonConvert.DeserializeObject(GetOpenIdAndSessionKeyString(loginInfo.code));

if (!String.IsNullOrEmpty(oiask.errcode))

return null;

return oiask;

}

///

/// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效

///

/// 公开的用户资料

/// 公开资料携带的签名信息

/// 从服务端获取的SessionKey

/// True:资料有效,False:资料无效

public bool VaildateUserInfo(string rawData, string signature, string sessionKey)

{

//创建SHA1签名类

SHA1 sha1 = new SHA1CryptoServiceProvider();

//编码用于SHA1验证的源数据

byte[] source = Encoding.UTF8.GetBytes(rawData + sessionKey);

//生成签名

byte[] target = sha1.ComputeHash(source);

//转化为string类型,注意此处转化后是中间带短横杠的大写字母,需要剔除横杠转小写字母

string result = BitConverter.ToString(target).Replace("-","").ToLower();

//比对,输出验证结果

return signature == result;

}

///

/// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效

///

/// 登陆信息

/// 从服务端获取的SessionKey

/// True:资料有效,False:资料无效

public bool VaildateUserInfo(WechatLoginInfo loginInfo, string sessionKey)

{

return VaildateUserInfo(loginInfo.rawData, loginInfo.signature, sessionKey);

}

///

/// 根据微信小程序平台提供的签名验证算法验证用户发来的数据是否有效

///

/// 登陆信息

/// 包含OpenId和SessionKey的类

/// True:资料有效,False:资料无效

public bool VaildateUserInfo(WechatLoginInfo loginInfo, OpenIdAndSessionKey idAndKey)

{

return VaildateUserInfo(loginInfo, idAndKey.session_key);

}

///

/// 根据微信小程序平台提供的解密算法解密数据

///

/// 加密数据

/// 初始向量

/// 从服务端获取的SessionKey

///

public WechatUserInfo Decrypt(string encryptedData, string iv, string sessionKey)

{

WechatUserInfo userInfo;

//创建解密器生成工具实例

AesCryptoServiceProvider aes = new AesCryptoServiceProvider();

//设置解密器参数

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;

//根据设置好的数据生成解密器实例

ICryptoTransform transform = aes.CreateDecryptor();

//解密

byte [] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);

//生成结果

string result = Encoding.UTF8.GetString(final);

//反序列化结果,生成用户信息实例

userInfo = JsonConvert.DeserializeObject(result);

return userInfo;

}

///

/// 根据微信小程序平台提供的解密算法解密数据,推荐直接使用此方法

///

/// 登陆信息

/// 用户信息

public WechatUserInfo Decrypt(WechatLoginInfo loginInfo)

{

if (loginInfo == null)

return null;

if (String.IsNullOrEmpty(loginInfo.code))

return null;

OpenIdAndSessionKey oiask = DecodeOpenIdAndSessionKey(loginInfo);

if (oiask == null)

return null;

if (!VaildateUserInfo(loginInfo, oiask))

return null;

WechatUserInfo userInfo = Decrypt(loginInfo.encryptedData, loginInfo.iv, oiask.session_key);

return userInfo;

}

///

/// GET请求

///

///

///

private string GetResponse(string url)

{

if (url.StartsWith("https"))

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

HttpClient httpClient = new HttpClient();

httpClient.DefaultRequestHeaders.Accept.Add(

new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.GetAsync(url).Result;

if (response.IsSuccessStatusCode)

{

string result = response.Content.ReadAsStringAsync().Result;

return result;

}

return null;

}

}

///

/// 微信小程序登录信息结构

///

public class WechatLoginInfo

{

public string code { get; set; }

public string encryptedData { get; set; }

public string iv { get; set; }

public string rawData { get; set; }

public string signature { get; set; }

}

///

/// 微信小程序用户信息结构

///

public class WechatUserInfo

{

public string openId { get; set; }

public string nickName { get; set; }

public string gender { get; set; }

public string city { get; set; }

public string province { get; set; }

public string country { get; set; }

public string avatarUrl { get; set; }

public string unionId { get; set; }

public Watermark watermark { get; set; }

public class Watermark

{

public string appid { get; set; }

public string timestamp { get; set; }

}

}

///

/// 微信小程序从服务端获取的OpenId和SessionKey信息结构

///

public class OpenIdAndSessionKey

{

public string openid { get; set; }

public string session_key { get; set; }

public string errcode { get; set; }

public string errmsg { get; set; }

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值