微信小程序解密得到unoinid和手机号 (开放数据的校验和解密 获取手机号)
实际测试 两种方法都可以:
第一种方法:
- public static string DecodeUserInfo(string encryptedData, string iv, string code)
- {
- var url = "https://api.weixin.qq.com/sns/jscode2session?appid=微信AppID&secret=开发秘钥&js_code=" + code + "&grant_type=authorization_code";
- var sessionkey = Utils.HttpGet(url);
- var wxinfo = Newtonsoft.Json.JsonConvert.DeserializeObject<WxInfoRequest>(sessionkey);
- var session_key = wxinfo.session_key;
- byte[] iv2 = Convert.FromBase64String(iv);
- if (string.IsNullOrEmpty(encryptedData)) return "";
- Byte[] toEncryptArray = Convert.FromBase64String(encryptedData);
- System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
- {
- Key = Convert.FromBase64String(session_key),
- IV = iv2,
- Mode = System.Security.Cryptography.CipherMode.CBC,
- Padding = System.Security.Cryptography.PaddingMode.PKCS7
- };
- System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
- Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length);
- return Encoding.UTF8.GetString(resultArray);
- }
第二中方法:
- 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;
- }
- }
- }
注意:1.session_key 是通过wx.login 然后得到code 然后去后台调取相应的接口获得的
2.如果你的小程序没有绑定微信开放平台,encryptedData 解密的数据中不包含unionid参数
3.微信开放平台和微信公众平台不是一回事 需要单独注册的
4.解密encryptedData 之前 最好先进行数据签名校验 防止数据被篡改
(如果不进行校验 解密的数据是被篡改的数据 会导致得到的数据不准确 上述例子中没做校验
校验主要用的是sha1加密 在另一篇博文(https://www.cnblogs.com/huangshuqiang/p/6254023.html)中已经给出了sha1加密的写法)
参考:https://blog.csdn.net/willianyy/article/details/79670750
http://www.cnblogs.com/Sea1ee/p/9627021.html
微信小程序解密得到unoinid和手机号 (开放数据的校验和解密 获取手机号)的更多相关文章
- 微信小程序开发:学习笔记[9]——本地数据缓存
微信小程序开发:学习笔记[9]——本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...
- 微信小程序,请求php后台返回json数据多出隐藏字符问题
这几天在做一个微信小程序注册登录页面的时候碰到一个问题,就是使用wx.request api的时候success中返回的JSON数据前面会多出空白字符,后面网上查了一下是说php bom头问题(详细介 ...
- 微信小程序,天气预报(百度地图开放平台API)
小程序看似一种全新的东西,但好在基本上就是曾经HTML,CSS,JS的一个微变版本. 语法和之前一样.只是一些用法和名字(标签)发生了一些变化. 小程序主要就四种扩展名的文件:js,json,wxml ...
- 微信小程序:页面跳转时传递数据到另一个页面
一.功能描述 页面跳转时,同时把当前页面的数据传递给跳转的目标页面,并在跳转后的目标页面进行展示 二.功能实现 1. 代码实现 test1页面 // pages/test1/test1.js Page ...
- 微信小程序中使用ECharts 异步加载数据 实现图表
<!--pages/bar/index.wxml--> <view class="container"> <ec-canvas id="my ...
- 微信小程序初探(一、简单的数据请求)
微信小程序出来有一段时间了,之前没看好小程序(觉得小程序体验不咋好,内心对新事物有抵触心里,请原谅我的肤浅[捂脸][捂脸]),不过后来偶然之间玩过小程序的游戏(跳一跳.球球大作战.猜画小歌 等),顿悟 ...
- 微信小程序-展示后台传来的json格式数据
昨天粗粗的写了下后台数据传到微信小程序显示,用来熟悉这个过程,适合刚入门学习案例: 需了解的技术:javaSE,C3p0,jdbcTemplate,fastjson,html,javaScript,c ...
- 怎么掌握微信小程序的取值、传值、数据存储
小程序界面设定如下 父级页面:A界面 子级页面:B界面 异级页面:C界面 一.本页面取值(A界面→A界面) a.例如:input输入文字获取到value(键盘输入时触发) wxml: <inpu ...
- 微信小程序 路由跳转 异步请求 存储数据,微信登录接口
1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...
随机推荐
- Android Studio 设置不同分辨率的图标Icon
右键你的项目 -->"NEW"-->"Image Asset" 'Asset Type' 勾选”Image“才可以选择”Path“,其他选项可以自己 ...
- python语法_模块
方便调用的分组函数文件,一个py模块就是一个模块,模块分三类 python标准库 第三方模块 应程序自定义模块 模块的掉用: 可以把多个功能(函数)包含在一个模块文件里,调用时直接使用import 就 ...
- Ubuntu 16.04下sublime text3安装
安装方法 在确保Ubuntu更新了国内镜像源的前提下,使用ppa安装: sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt- ...
- 用appuploader生成发布证书和描述性文件
本帖最后由 长发飘 于 2017-4-13 12:34 编辑 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发 ...
- MS-UAP发布的UWP的个人隐私策略
我们十分重视您的隐私.本隐私声明解释了我们从您那里收集的个人数据内容以及我们将如何使用这些数据. 我们不收集任何与个人信息相关的数据,只收集与本UWP运行相关的数据,如: 产品使用数据:如每个页面的使 ...
- 【阿里聚安全·安全周刊】女主换脸人工合成小电影|伊朗间谍APP苹果安卓皆中招
本周的七个关键词: 人工智能 丨 HTTP链接=不安全链接 丨 滑动验证码 丨 伊朗间谍APP 丨 加密挖矿 丨 Android应用测试速查表 丨 黑客销售签名证书 -1- [人工智能]女主换 ...
- 深入理解Spring Redis的使用 (六)、用Spring Aop 实现注解Dao层的自动Spring Redis缓存
摘要: 主要针对Dao层的一些数据库查询的操作,数据实时性不强,直接加入缓存.当缓存中有的时候,就使用缓存中的数据.这样的方法,最终仅仅使用一个注解实现.对于之前的hibernate二级缓存使用,比较 ...
- [Swift]LeetCode886. 可能的二分法 | Possible Bipartition
Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of ...
- 调用链Cat介绍
1. 调用链Cat 1.1. 调用链演进 1.2. 开源产品比较 1.3. 监控场景 1.4. cat的增值作用 1.5. cat典型报表 1.5.1. 应用报错大盘 1.5.2. 业务大盘 1.5. ...
- Java8 LocalDateTime获取时间戳(毫秒/秒)、LocalDateTime与String互转、Date与LocalDateTime互转
本文目前提供:LocalDateTime获取时间戳(毫秒/秒).LocalDateTime与String互转.Date与LocalDateTime互转 文中都使用的时区都是东8区,也就是北京时间.这是 ...