微信小程序用户数据解密
概述
详细
一、准备工作
1、由于用到了 Redis 缓存,需要安装 Redis(安装略过)
2、后台开发环境Idea 15,java开发环境(安装略过),由于是 Maven 构建的项目,在 Eclipse 下也可以运行
3、下载安装微信Web开发者工具
4、本实例通过客户端登录请求后台,进行微信用户信息解密
二、程序实现
1、原理

2、程序包括后台和客户端,后台使用 Idea 15 进行开发实现,客户端通过微信 web 开发者工具开发实现
后台截图:

客户端截图:

3、思路
a、在web开发者工具上扫描二维码登录成功后
b、发送获取 3rd_session 请求,获取 3rd_session 数据
c、然后调用解密地址请求,对用户信息进行解密
4、涉及到的关键代码
a、客户端获取code
onLoad: function (options) {
// 页面初始化 options为页面跳转所带来的参数
let that = this
wx.login({
success: function (res) {
// success
let code = res.code
that.setData({ code: code })
wx.getUserInfo({
success: function (res) {
// success
that.setData({ userInfo: res.userInfo })
that.setData({ iv: res.iv })
that.setData({ encryptedData: res.encryptedData })
that.get3rdSession()
}
})
}
})
}
b、 客户端发送 code 到服务端,获取 3rd_session
get3rdSession:function(){
let that = this
wx.request({
url: 'https://localhost:8443/get3rdSession',
data: {
code: this.data.code
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
// header: {}, // 设置请求的 header
success: function (res) {
// success
var sessionId = res.data.session;
that.setData({ sessionId: sessionId })
wx.setStorageSync('sessionId', sessionId)
that.decodeUserInfo()
}
})
}
c、服务端发送 appid、appsecret、code 到微信服务器换取 session_key 和 openid
public void get3rdSession() { //获取名为userInfo的Redis Cache对象
Cache userInfoCache = Redis.use("userInfo");
String sessionId = "";
JSONObject json = new JSONObject();
String code = getPara("code");
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=wx7560b8008e2c445d&secret=f1af3312b7038513fd17dd9cbc3b357c&js_code=" + code + "&grant_type=authorization_code"; //执行命令生成3rd_session
String session = ExecLinuxCMDUtil.instance.exec("cat /dev/urandom |od -x | tr -d ' '| head -n 1").toString();
json.put("session", session); //创建默认的httpClient实例
CloseableHttpClient httpClient = getHttpClient(); try { //用get方法发送http请求
HttpGet get = new HttpGet(url);
System.out.println("执行get请求:...." + get.getURI());
CloseableHttpResponse httpResponse = null; //发送get请求
httpResponse = httpClient.execute(get); try { //response实体
HttpEntity entity = httpResponse.getEntity(); if (null != entity) {
String result = EntityUtils.toString(entity);
System.out.println(result);
JSONObject resultJson = JSONObject.fromObject(result);
String session_key = resultJson.getString("session_key");
String openid = resultJson.getString("openid"); //session存储
userInfoCache.set(session,session_key+","+openid);
}
} finally {
httpResponse.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally { try {
closeHttpClient(httpClient);
} catch (IOException e) {
e.printStackTrace();
}
}
renderJson(json);
}private CloseableHttpClient getHttpClient() { return HttpClients.createDefault();
}private void closeHttpClient(CloseableHttpClient client) throws IOException { if (client != null) {
client.close();
}
}
d、客户端发送请求解密用户数据
decodeUserInfo:function(){
let that = this
wx.request({
url: 'https://localhost:8443/decodeUserInfo',
data: {
encryptedData: that.data.encryptedData,
iv: that.data.iv,
session: wx.getStorageSync('sessionId')
},
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
// header: {}, // 设置请求的 header
success: function (res) {
// success
console.log(res)
}
})
}
5、配置文件
a、由于微信小程序使用的是https请求,所以需要生成ssl请求,即 keystore,生成自己的 keystore 后替换 pom.xml 文件里
<keystore> /Users/LJaer/Workspaces/tomcat.keystore</keystore>
b、由于使用了 Redis 缓存,需要对 Redis 地址进行修改,AppConfig 类中,替换 redis 服务地址
RedisPlugin userInfoRedis = new RedisPlugin("userInfo","192.168.99.100");
三、运行效果
1、服务端启动,使用命令 jetty:run 进行服务端的启动

2、客户端启动,点击编译即可运行

3、用户数据解密截图

四、其他补充
官网文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html?t=20161222#wxloginobject
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
微信小程序用户数据解密的更多相关文章
- 微信小程序开放数据解密 AES-128-CBC 解密(C#版本)
最近在开发小程序,需要跟微信服务端交互,微信敏感数据都有加密返回,需要在服务端接收进行解密后再返回给客户端小程序,今天就通过C# 进行数据的解密,官方下载下来是Node.C++.php等,就是没有C# ...
- 微信小程序用户信息解密失败导致的内存泄漏问题。
微信小程序获取用户解密的Session_key 然后对 encryptedData进行解密 偶尔报错 时间长了之后会报内存溢出: java.lang.OutOfMemoryError: GC over ...
- 微信小程序登录数据解密以及状态维持
学习过小程序的朋友应该知道,在小程序中是不支持cookie的,借助小程序中的缓存我们也可以存储一些信息,但是对于一些比较重要的信息,我们需要通过登录状态维持来保存,同时,为了安全起见,用户的敏感信息, ...
- [转]微信小程序登录数据解密以及状态维持
本文转自:http://www.cnblogs.com/cheesebar/p/6689326.html 学习过小程序的朋友应该知道,在小程序中是不支持cookie的,借助小程序中的缓存我们也可以存储 ...
- 微信小程序之数据缓存
关于缓存,举个示例,假定我不是通过微信授权登录的方式,小程序又是如何识别我登录后的身份呢???效果图: 这个功能我是通过缓存实现的. 关键核心代码如下: wx.setStorage({ key: 'u ...
- 微信小程序请求数据
微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...
- 微信小程序-用户拒绝授权使用 wx.openSetting({}) 重新调起授权用户信息
场景模拟:用户进入微信小程序-程序调出授权 选择拒绝之后,需要用到用户授权才能正常使用的页面,就无法正常使用了. 解决方法:在用户选择拒绝之后,弹窗提示用户 拒绝授权之后无法使用,让用户重新授权(微信 ...
- 微信小程序 --- 缓存数据
保存数据 / 读取数据 / 删除数据 / 数据异步操作 每一个微信小程序都可以有自己的本地缓存,可以通过wx.setStorage( wx.setStorageSync) ,wx.getS ...
- 微信小程序 API 数据缓存
微信小程序 数据缓存 (类似于 cookie) wx.setStorage() 将数据存储在本地缓存中制定的 key 中.会覆盖掉原来该 key 对应的内容,数据存储生命周期跟小程序本身一致,即除用户 ...
随机推荐
- Android记录20-获取缓存大小和清除缓存功能
Android开发记录20-获取缓存大小和清除缓存功能 转载请注明:IT_xiao小巫 博客地址:http://blog.csdn.net/wwj_748 前言 本篇博客要给大家分享的如何获取应用缓存 ...
- Android项目实战之(1)-- 开发一个"快速冲浪"的程序
概述:这个小程序,你讲学习到基本控件(Button,Listview,Gridview,TextView等)的使用技巧,AssetManager类的使用,XML数据的解析方式,BaseAdapter, ...
- 【linux】linux查看文件大小,磁盘大小
查看指定目录下 文件或目录大小超过多少的 查看 /backup/tomcat7/ 目录下 超过500M大小的文件 并展示 文件详情 find /backup/tomcat7/ -type f -si ...
- ACM-DP之最大连续子序列——hdu1231
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- spring service事务传播
spring定义的事务行为有以下几种: REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行. ...
- Struts2 无后缀action请求
如果将Struts2的filter-mapping配置成 <filter-mapping> <filter-name>struts2</filter-name> & ...
- python urlopen SSL: CERTIFICATE_VERIFY_FAILED
1.使用ssl创建未经验证的上下文,在urlopen中传入上下文参数 import sslimport urllib2 context = ssl._create_unverified_context ...
- Latex:表格制作全攻略
给出一个制作复杂表格的例子,制作表格主要用到multicolumn,multirow和cline,其中,要使用multirow,必须usepackage{multirow} 如果要制作出如下图所示的表 ...
- 学习笔记:状态压缩DP
我们知道,用DP解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态.但是有这样的一些题 目,它们具有DP问题的特性,但是状态中所包含的信息过多,如果要用数组来保存状态的话需要 ...
- Javascript中的Array(数组) 、{}(映射) 与JSON解析
做网页总会使用javascript,使用javascript总会使用JSON.最近用到一下,就写写. 下面是总结: 1.将javascript中的Array和{}转化为json字符串可以使用json2 ...