.NET 小程序 wx.getUserInfo(OBJECT) 解密 encryptedData 来获取UnionId
2024-08-30 18:09:54
在小程序中通过 wx.getUserInfo 获取用户信息,而UnionId 只有关主了公众号才会返回,不关注公众号想获取UnionId则需要我们从返回的 encryptedData 中解码从而获取UnionId。
解密方法查了一下,这边选择的 GitHub地址
帮助类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace YouNameSpace
{
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
/// <summary>
/// 签名及加密帮助类
/// </summary>
public static class EncryptHelper
{ #region 私有方法 private static byte[] AES_Decrypt(String Input, byte[] Iv, byte[] Key)
{
RijndaelManaged aes = new RijndaelManaged();
#if NET45 #else
//SymmetricAlgorithm aes = Aes.Create();
#endif
aes.KeySize = ;//原始:256
aes.BlockSize = ;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.Key = Key;
aes.IV = Iv;
var decrypt = aes.CreateDecryptor(aes.Key, aes.IV);
byte[] xBuff = null;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
{
byte[] xXml = Convert.FromBase64String(Input);
byte[] msg = new byte[xXml.Length + - xXml.Length % ];
Array.Copy(xXml, msg, xXml.Length);
cs.Write(xXml, , xXml.Length);
}
xBuff = decode2(ms.ToArray());
}
return xBuff;
} private static byte[] decode2(byte[] decrypted)
{
int pad = (int)decrypted[decrypted.Length - ];
if (pad < || pad > )
{
pad = ;
}
byte[] res = new byte[decrypted.Length - pad];
Array.Copy(decrypted, , res, , decrypted.Length - pad);
return res;
} #endregion /// <summary>
/// 解密所有消息的基础方法
/// </summary>
/// <param name = "sessionKey" > 储存在 SessionBag 中的当前用户 会话 SessionKey</param>
/// <param name = "encryptedData" > 接口返回数据中的 encryptedData 参数</param>
/// <param name = "iv" > 接口返回数据中的 iv 参数,对称解密算法初始向量</param>
// / <returns></returns>
public static string DecodeEncryptedData(string sessionKey, string encryptedData, string iv)
{
var aesCipher = Convert.FromBase64String(encryptedData);
var aesKey = Convert.FromBase64String(sessionKey);
var aesIV = Convert.FromBase64String(iv); var result = AES_Decrypt(encryptedData, aesIV, aesKey);
var resultStr = Encoding.UTF8.GetString(result);
return resultStr;
}
}
}
后台需要小程序传递三个参数给我们进行解密
String : sessionKey :加密的签名(注:这个参数需要动态的获取,每次返回的都不一样):接口地址 通过wx.login 获取 code然后再调用改接口返回的 会话密码
通过 wx.getUserInfo 接口返回下面需要的数据 接口地址
String : encryptedData: 完整用户信息的加密数据
String : iv:加密算法的初始向量 String
把这三给参数传给我们的后台进行解密
主要方法:
string result =EncryptHelper.DecodeEncryptedData(sessionKey, encryptedData, iv);
var dy = DynamicExtensions.JsonToDynamic<JObject>(result);
string nickName = dy["nickName"] + "";
string sex = dy["gender"] + "";
string city = dy["city"] + "";
string province = dy["province"] + "";
string country = dy["country"] + "";
string headUrl = dy["avatarUrl"] + "";
string unionId = dy["unionId"] + "";
最新文章
- page object
- ilspy导致c# dll代码被窃取
- Hibernate总结3
- c语言字符集
- mysql乱码以及Data too long for column全解(最完整实用版)
- php判断字符串是不是xml格式并解析
- CI框架篇之控制器篇--设置路由(1)
- SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。
- Nodejs随笔(一):Hello World!
- 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载
- swift UITapGestureRecognizer获取点击事件点击的位置point
- Scrapy爬虫遇到 ‘Forbidden by robots.txt’的问题
- 【论文速读】Shitala Prasad_ECCV2018】Using Object Information for Spotting Text
- Introducation of Servlet filter(servlet过滤器介绍 )
- layer弹层基本参数初尝试
- Linux mmc framework2:基本组件之block
- Java多线程习题 ===重点 ,错题积累
- 【 js 基础 】【读书笔记】Javascript “继承”
- 第八章&#160;高级搜索树 (a3)伸展树:算法实现
- halcon发布
热门文章
- bzoj 4543: [POI2014]Hotel加强版
- flask在centos下搭建web服务【uwsgi,nginx】
- Java ConcurrentHashMap的小测试
- Java集合篇六:Map中key值不可重复的测试
- 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作
- Eclipse org.eclipse.compare plug-in
- ant用法
- 面试题之----一次完整的HTTP请求过程
- linux中启动网卡报错:Bringing up interface eth1: Error: Connection activation failed
- dedecms 模板文件不存在 无法解析文档!问题定位方法!