概述
詳細
一、准備工作
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
