算是个系列内容吧,最终要实现的是将uniCloud作为后端完成“扫码关注公众号后完成网站登录”
将要涉及的内容可能包括:
0.准备工作:各种配置、基础搭建
1.接受、解析、组装xml消息
2.请求access_token并缓存(本节)
3.生成带参数二维码
4.引入、封装redis缓存方法
5.引入、配置、初始化unipush
6.解析不同情况下用户扫码时推送的事件并完成登录
系列内容全部基于uniCloud+vk-uniCloud(云函数路由)+uni-app
编辑器HbuilderX最新版
云空间为阿里云
公众号为认证服务号
本节的内容,其实之前有单独发过一篇,当时是为了使用jssdk,而且云空间必须有腾讯的(此处鄙视腾讯涨价割韭菜),但最近发现uniCloud官方推了新的请求方法,让阿里云空间也可以请求access_token了,下面一起看看:
一、服务号后台添加ip白名单(详见第0节)
二、封装pubFun方法
依旧是写在/cloudfunctions/router/util/pubFunction.js
文件中,
/**
* 请求access_token
* pubFun.getWxAccessToken();
*/
pubFun.getWxAccessToken = async () => {
let timestamp = new Date().getTime(); // uniCloud中尽量使用毫秒时间戳
// 判断数据库中是否有未过期的token
// 此时这张表未创建也不影响
let oldAccessToken = await vk.baseDao.selects({
dbName: "wx-mp-cache",
getOne: true,
getMain: true,
// 主表where条件
whereJson: {
name: 'accessToken'
},
sortArr: [{ name: 'expire_time', type: 'desc' }]
});
// 判断是否过期
if (vk.pubfn.isNotNull(oldAccessToken) && oldAccessToken.expire_time > timestamp) {
// 未过期直接返回
return { token: oldAccessToken.token, expire_time: oldAccessToken.expire_time };
}
// 重新获取access_token
// 这里就用到了固定出口的代理请求方法,就是第0节中添加到白名单的那些
let accessTokenRes = await uniCloud.httpProxyForEip.get('https://api.weixin.qq.com/cgi-bin/token', {
grant_type: 'client_credential',
appid: appid, // 换成你自己的
secret: appsecret // 换成你自己的
});
// 这里必须parse
accessTokenRes = JSON.parse(accessTokenRes);
// 把新的token缓存下来
let newExpireTime = parseInt(timestamp) + 7200000
await vk.baseDao.add({
dbName: "wx-mp-cache",
dataJson: {
name: 'accessToken',
token: accessTokenRes.body.access_token, // 注意看这里,代理请求的结果,数据是在body中……
expire_time:newExpireTime // 2小时过期
}
});
// 返回
return { token: accessTokenRes.body.access_token, expire_time: newExpireTime };
}
三、云函数中使用这个方法
这个内容放到下一节吧,生成带参数的二维码时,需要用到这个token