在小程序中通过 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"] + "";

最新文章

  1. page object
  2. ilspy导致c# dll代码被窃取
  3. Hibernate总结3
  4. c语言字符集
  5. mysql乱码以及Data too long for column全解(最完整实用版)
  6. php判断字符串是不是xml格式并解析
  7. CI框架篇之控制器篇--设置路由(1)
  8. SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。
  9. Nodejs随笔(一):Hello World!
  10. 使用SSM框架 搭建属于自己的APP二维码合成、解析、下载
  11. swift UITapGestureRecognizer获取点击事件点击的位置point
  12. Scrapy爬虫遇到 ‘Forbidden by robots.txt’的问题
  13. 【论文速读】Shitala Prasad_ECCV2018】Using Object Information for Spotting Text
  14. Introducation of Servlet filter(servlet过滤器介绍 )
  15. layer弹层基本参数初尝试
  16. Linux mmc framework2:基本组件之block
  17. Java多线程习题 ===重点 ,错题积累
  18. 【 js 基础 】【读书笔记】Javascript “继承”
  19. 第八章&#160;高级搜索树 (a3)伸展树:算法实现
  20. halcon发布

热门文章

  1. bzoj 4543: [POI2014]Hotel加强版
  2. flask在centos下搭建web服务【uwsgi,nginx】
  3. Java ConcurrentHashMap的小测试
  4. Java集合篇六:Map中key值不可重复的测试
  5. 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作
  6. Eclipse org.eclipse.compare plug-in
  7. ant用法
  8. 面试题之----一次完整的HTTP请求过程
  9. linux中启动网卡报错:Bringing up interface eth1: Error: Connection activation failed
  10. dedecms 模板文件不存在 无法解析文档!问题定位方法!