小程序能夠獲取到unionid的前提
1.小程序必須綁定在微信開放平台上,不綁定是沒有的(PS:綁定開放平台需要開發者資質認證,認證收費的奧)
2.需要微信用戶授權小程序
具體的代碼實現(我在index.js的onLoad中實現的)
encryptedData的解密:模仿 官網給的例子中的 Node 的demo,使用 CryptoJS實現純 js 下解密用戶信(網上大部分都是用的java服務器解密的,但是我在調的時候,到了解密的那一句時,一直報錯。我們現在用的是直接在微信代碼里解密)
借鑒的 https://www.cnblogs.com/cai-rd/p/6816849.html
1.加入解密需要的文件,將 CryptoJS 的包放入 小程序的 utils 中(點擊下載)(RdWXBizDataCrypt.js不在其中需要自己寫,下面有附的代碼,直接復制即可)
RdWXBizDataCrypt.js
/**
* Created by rd on 2017/5/4.
*/
// 引入CryptoJSvar
Crypto = require('/cryptojs.js').Crypto;
var app = getApp();
function RdWXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()進行 base64解碼
var encryptedData = Crypto.util.base64ToBytes(encryptedData)
var key = Crypto.util.base64ToBytes(this.sessionKey);
var iv = Crypto.util.base64ToBytes(iv);
// 對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充
var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
try {
// 解密
var bytes = Crypto.AES.decrypt(encryptedData, key, {
asBpytes: true,
iv: iv,
mode: mode
});
var decryptResult = JSON.parse(bytes);
} catch (err) {
console.log(err)
}
if (decryptResult.watermark.appid !== this.appId) {
console.log(err)
}
return decryptResult
}
module.exports = RdWXBizDataCrypt
2.我在index.js中調用解密的
index.js:
//index.js
//這是關鍵 引入RdWXBizDataCrypt.js 這個JS文件是用來解密用的,下面會說到
//這個地方一定要注意了,路徑一定要寫正確,不要用系統提示的會報錯,../../才是根路徑
var WXBizDataCrypt = require('../../utils/cryptojs/RdWXBizDataCrypt.js');
//獲取應用實例
var app = getApp()
var appId = "你的小程序id";
var secret = '你的小程序secret ';
Page({
data: {
motto: 'Hello World',
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo'),
openId:'',//用戶唯一標識
date:"1999-12-22",
unionId:'',
encryptedData:'' },
//事件處理函數
bindViewTap: function() {
wx.navigateTo({
url: '../logs/logs'
})
},
onLoad: function () {
var that =this;
wx.login({
success: res => {
//發起網絡請求
wx.request({
//這是我自己的java服務器的接口,將login()獲得的code發送的服務器換取session_key
url: 'https://abc.anzhonghui.xyz/WxtestServlet/UserController?method=getUnionId',
data: {
js_code: res.code,
},
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'GET',
success: function (res) {
console.log(res.data.session_key)
//拿到session_key實例化WXBizDataCrypt()這個函數在下面解密用
var pc = new WXBizDataCrypt(appId, res.data.session_key)
wx.getUserInfo({
success: function (res) {
//拿到getUserInfo()取得的res.encryptedData, res.iv,調用decryptData()解密
var data = pc.decryptData(res.encryptedData, res.iv)
// data.unionId就是咱們要的東西了
app.globalData.unionid = data.unionId
console.log('解密后 unionid: ', app.globalData.unionid)
},
fail: function (res) {
console.log(res)
}
})
},
fail: function (res) { },
complete: function (res) { }
});
}
})
}
3.當寫到這里時在index中的解密方法(decryptData())能用了,現在可以運行一下了
在這再補充一下關於java服務器的事:
其實java做的事很簡單,微信小程序有些接口不能用,比如https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code,這個接口現在就不能在小程序用了,但是他又是必須的,微信官方就讓咱們用自己的服務器去用這個接口。
具體步驟 :
1.小程序請求自己的java服務器接口
2.java服務器收到請求,開始請求https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 這個接口
3.java服務器將請求到的數據返回給微信小程序
4.完事
對就這么簡單,java就做了一個中間過度的作用,這樣就起到了安全作用,具體為什么安全我也不知道,官方說安全我也這樣說了
獲取unionid時走的坑
先看一下官方的說法
GUANFANG
官方說的很好,在滿足unionid的條件下接口https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 返回unionid,可是自始至終我也沒搞明白這個條件是啥,我一直以為微信開放品台沒有給我分配unionid,但是當我用解密后才發現原來我有unionid,只是這個接口沒返回。 所以,通過這個接口獲得unionid的小伙伴千萬別再這個上面死磕了,趕緊試試解密吧。我死磕兩天,都絕望了。
有知道什么時候https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&
grant_type=authorization_code
這個接口才返回unionid的小伙伴,麻煩評論一下謝謝。
我寫了一個獲取unionid的小demo,注釋都寫了,按照這個demo就能獲取到,前提是我上面說的幾個條件都具備。
CSDN着實是讓人惡心,為了錢錢錢,想盡了法子壓榨,剝削。又把積分改成了二十五,我上傳到了百度網盤,免費分享給大家,大家一定要保持程序員開元的優良傳統。
復制這段內容后打開百度網盤手機App,操作更方便哦 鏈接:https://pan.baidu.com/s/1UPGZ1DH1JzwfOkzgcOwqZA 提取碼:h14y
原文鏈接:https://blog.csdn.net/a493001894/article/details/80323403
