首先你必须会用微信小程序的云函数功能:
1、创建一个名为token的云函数
2、在云开发的云函数管理中添加对应的token云函数
3、在开发工具中编辑云函数token
4、点击右键,安装并部署
大致是以上流程吧。
获取微信小程序 encryptedData 加密信息需要以下必须的常变量:
appid:可以通过 wxContext.APPID 获取;
secret:当初自己生成的密钥;
encryptedData:加密串,open-type授权时都可获得;
iv:同时还可以获得一个iv
js_code:用户登录时产生的code,用于生成sessionKey
sessionKey:自己生成;
标题创建云函数:
在微信开发者工具的cloudfuntions中,创建一个名为 token 的 云函数;
然后我们先在 token 目录下创建两个 Js 模块文件。
requestSync.js 的内容为:
const request = require("request");
const requestSync = async (url) =>
new Promise((resolve, reject) => {
request(url, (err, response, body) => {
if (err) {
reject(err);
} else {
resolve(body);
}
})
})
module.exports = requestSync
requestSync.js 用于从后端url中生成 sessionKey。
WXBizDataCrypt.js 的内容为(官方文件,未修改):
var crypto = require('crypto')
function WXBizDataCrypt(appId, sessionKey) {
this.appId = appId
this.sessionKey = sessionKey
}
WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
// base64 decode
var sessionKey = new Buffer(this.sessionKey, 'base64')
encryptedData = new Buffer(encryptedData, 'base64')
iv = new Buffer(iv, 'base64')
try {
// 解密
var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
// 设置自动 padding 为 true,删除填充补位
decipher.setAutoPadding(true)
var decoded = decipher.update(encryptedData, 'binary', 'utf8')
decoded += decipher.final('utf8')
decoded = JSON.parse(decoded)
} catch (err) {
throw new Error('Illegal Buffer')
}
if (decoded.watermark.appid !== this.appId) {
throw new Error('Illegal Buffer')
}
return decoded
}
module.exports = WXBizDataCrypt
然后我们编辑一下index.js的内容:
// 云函数入口文件
const cloud = require('wx-server-sdk')
const WXBizDataCrypt = require('./WXBizDataCrypt')
const requestSync = require('./requestSync')
cloud.init()
/*
该云函数需要传入的参数
{
data:{
js_code,
encryptedData,
iv
}
}
*/
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext();
const appid = wxContext.APPID;
const encryptedData = event.encryptedData;
const js_code = event.js_code;
const iv = event.iv;
const secret = 'eeeeeeeeeeeeeeee'
const url = {
url: 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + js_code+'&grant_type=authorization_code'
}
const req = await requestSync(url);
const session = JSON.parse(req);
const sessionKey = session.session_key;
const pc = new WXBizDataCrypt(appid, sessionKey);
const data = pc.decryptData(encryptedData, iv);
return {
data,
event,
wxtext: wxContext,
openid: wxContext.OPENID,
appid,
unionid: wxContext.UNIONID,
}
}
云函数创建好了,在token目录上点击右键,选择安装并部署,上传到云端。
使用云函数token获取解密信息
在使用的页面js文件中:
//我使用的是获取手机,原理一样。
if (e.detail.errMsg == "getPhoneNumber:ok") {
wx.login({
success: function (res) {
//获取code
console.log('code-->' + res.code)
wx.cloud.callFunction({
name: 'token',
data: {
js_code: res.code, //传入参数js_code
encryptedData: e.detail.encryptedData, //传入参数encryptedData
iv: e.detail.iv //传入参数iv
},
success: function (res) {
console.log(res); //查看云函数返回的内容。
},
fail: function (err) {
console.log('Err: ' + JSON.stringify(err))
}
})
},
fail:function (res){
wx.showToast({
icon: 'none',
title: '失败',
})
}
})
console.log(e.detail.errMsg)
console.log(e.detail.encryptedData)
console.log(e.detail.iv)
} else
{
wx.showToast({
icon: 'none',
title: '必须允许',
})
}
搞定。