小程序能夠獲取到unionid的前提
1.小程序必須綁定在微信開放平臺(tái)上剂跟,不綁定是沒有的(PS:綁定開放平臺(tái)需要開發(fā)者資質(zhì)認(rèn)證减途,認(rèn)證收費(fèi)的奧)
2.需要微信用戶授權(quán)小程序
具體的代碼實(shí)現(xiàn)(我在index.js的onLoad中實(shí)現(xiàn)的)
encryptedData的解密:模仿 官網(wǎng)給的例子中的 Node 的demo,使用?CryptoJS實(shí)現(xiàn)純 js 下解密用戶信(網(wǎng)上大部分都是用的java服務(wù)器解密的曹洽,但是我在調(diào)的時(shí)候鳍置,到了解密的那一句時(shí),一直報(bào)錯(cuò)送淆。我們現(xiàn)在用的是直接在微信代碼里解密)
借鑒的 https://www.cnblogs.com/cai-rd/p/6816849.html
1.加入解密需要的文件税产,將 CryptoJS 的包放入 小程序的 utils 中(點(diǎn)擊下載)(RdWXBizDataCrypt.js不在其中需要自己寫,下面有附的代碼偷崩,直接復(fù)制即可)
/**
* Created by rd on 2017/5/4.
*/
// 引入CryptoJSvar
Crypto =require('/cryptojs.js').Crypto;
varapp = getApp();
functionRdWXBizDataCrypt(appId, sessionKey){
this.appId = appId
this.sessionKey = sessionKey
}
RdWXBizDataCrypt.prototype.decryptData =function(encryptedData, iv){
// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()進(jìn)行 base64解碼?
varencryptedData = Crypto.util.base64ToBytes(encryptedData)
varkey = Crypto.util.base64ToBytes(this.sessionKey);
variv = Crypto.util.base64ToBytes(iv);
// 對稱解密使用的算法為 AES-128-CBC辟拷,數(shù)據(jù)采用PKCS#7填充?
varmode =newCrypto.mode.CBC(Crypto.pad.pkcs7);
try{
// 解密? ?
varbytes = Crypto.AES.decrypt(encryptedData, key, {
asBpytes:true,
iv: iv,
mode: mode
});? ?
vardecryptResult =JSON.parse(bytes);
}catch(err) {
console.log(err)
}?
if(decryptResult.watermark.appid !==this.appId) {
console.log(err)
}?
returndecryptResult
}
module.exports = RdWXBizDataCrypt
index.js:
//index.js
//這是關(guān)鍵 引入RdWXBizDataCrypt.js 這個(gè)JS文件是用來解密用的,下面會(huì)說到
//這個(gè)地方一定要注意了阐斜,路徑一定要寫正確衫冻,不要用系統(tǒng)提示的會(huì)報(bào)錯(cuò),../../才是根路徑
varWXBizDataCrypt =require('../../utils/cryptojs/RdWXBizDataCrypt.js');
//獲取應(yīng)用實(shí)例
varapp = getApp()
varappId ="你的小程序id";
varsecret ='你的小程序secret ';
Page({
data: {
motto:'Hello World',
userInfo: {},
hasUserInfo:false,
canIUse: wx.canIUse('button.open-type.getUserInfo'),
openId:'',//用戶唯一標(biāo)識(shí)? ?
date:"1999-12-22",
unionId:'',
encryptedData:''},
//事件處理函數(shù)?
bindViewTap:function(){
wx.navigateTo({? ? ?
url:'../logs/logs'
})?
},
onLoad:function(){
varthat =this;
wx.login({
success:res=>{
//發(fā)起網(wǎng)絡(luò)請求
? ? ? ? wx.request({
//這是我自己的java服務(wù)器的接口谒出,將login()獲得的code發(fā)送的服務(wù)器換取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實(shí)例化WXBizDataCrypt()這個(gè)函數(shù)在下面解密用
varpc =newWXBizDataCrypt(appId, res.data.session_key)
? ? ? ? ? ? wx.getUserInfo({
success:function(res){
//拿到getUserInfo()取得的res.encryptedData, res.iv隅俘,調(diào)用decryptData()解密
vardata = 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.當(dāng)寫到這里時(shí)在index中的解密方法(decryptData())能用了,現(xiàn)在可以運(yùn)行一下了
在這再補(bǔ)充一下關(guān)于java服務(wù)器的事:
其實(shí)java做的事很簡單笤喳,微信小程序有些接口不能用为居,比如https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code,這個(gè)接口現(xiàn)在就不能在小程序用了杀狡,但是他又是必須的蒙畴,微信官方就讓咱們用自己的服務(wù)器去用這個(gè)接口。
具體步驟 :
1.小程序請求自己的java服務(wù)器接口
2.java服務(wù)器收到請求捣卤,開始請求https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code? 這個(gè)接口
3.java服務(wù)器將請求到的數(shù)據(jù)返回給微信小程序
4.完事
對就這么簡單忍抽,java就做了一個(gè)中間過度的作用,這樣就起到了安全作用董朝,具體為什么安全我也不知道鸠项,官方說安全我也這樣說了
先看一下官方的說法
GUANFANG?
官方說的很好,在滿足unionid的條件下接口https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 返回unionid子姜,可是自始至終我也沒搞明白這個(gè)條件是啥祟绊,我一直以為微信開放品臺(tái)沒有給我分配unionid,但是當(dāng)我用解密后才發(fā)現(xiàn)原來我有unionid哥捕,只是這個(gè)接口沒返回牧抽。 所以,通過這個(gè)接口獲得unionid的小伙伴千萬別再這個(gè)上面死磕了扬舒,趕緊試試解密吧凫佛。我死磕兩天孕惜,都絕望了晨炕。
有知道什么時(shí)候https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&
這個(gè)接口才返回unionid的小伙伴,麻煩評論一下謝謝削罩。
我寫了一個(gè)獲取unionid的小demo费奸,注釋都寫了弥激,按照這個(gè)demo就能獲取到,前提是我上面說的幾個(gè)條件都具備货邓。
復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦 鏈接:https://pan.baidu.com/s/1UPGZ1DH1JzwfOkzgcOwqZA 提取碼:h14y