由于微信小程序不支持微信公众号获取access_token的域名配置,无法在小程序端通过wx.request()的方式来获取access_token,以下是获取微信公众号access_token的域名,经过几番折腾,终于实现了基于云开发中云函数的功能实现了access_token的获取,并存入云数据库中。
https://api.weixin.qq.com
首先在云数据库中新建集合名称"access_token",并新建字段_id、accessToken、createTime、expiresIn用来存储access_token值及有效时间。
在云函数中新建类AccessToken
const cloud = require('wx-server-sdk')
const request = require('request')
class AccessToken{
constructor({ appid, secret}){
this.appid=appid
this.secret=secret
}
}
module.exports=AccessToken
在AccessToken类中新建函数getAccessToken()用来获取access_token
// 获取 access_token
async getAccessToken() {
let token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='+this.appid+'&'+'secret='+this.secret;
const rp = options =>
new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) {
reject(error);
}
resolve(response);
});
});
const result = await rp({
url:token_url,
method:'GET'
});
return (typeof result.body === 'object') ? result.body : JSON.parse(result.body);;
}
然后再新建函数getCacheToken()调用getAccessToken()获得access_token并存入云数据库中
async getCacheToken(){
let collection = 'access_token';//数据库集合名称
let gapTime = 300000; // 5 分钟
cloud.init();
let db = cloud.database();
let result = await db.collection(collection).get();
if (result.code) {
return null;
}
// 数据库没有,获取
if (!result.data.length) {
let accessTokenBody = await this.getAccessToken();
let act = accessTokenBody.access_token;
let ein = accessTokenBody.expires_in * 1000;
await db.collection(collection).add({
data: {
_id: 1,
accessToken: act,
expiresIn: ein,
createTime: Date.now()}
});
return act;
}
else {
let data = result.data[0];
let {
_id,
accessToken,
expiresIn,
createTime
} = data;
// 判断access_token是否有效
if (Date.now() < createTime + expiresIn - gapTime) {
return accessToken;
}
// 失效,重新获取
else {
let accessTokenBody = await this.getAccessToken();
let act = accessTokenBody.access_token;
let ein = accessTokenBody.expires_in * 1000;
await db.collection(collection).doc(_id).set({
_id: 1,
accessToken: act,
expiresIn: ein,
createTime: Date.now()
});
return accessTokenBody.access_token;
}
}
}
在云函数入口文件中声明并传入微信公众号开发者id及secret_key即可,然后在小程序客户端调用云函数即可获取
// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');
const access_token = require('AccessToken');//引入AccessToken类
cloud.init()
let appid ='*************';//微信公众号开发者id
let secret ='*******';//微信公众号开发者secret_key
// 云函数入口函数
exports.main = async (event, context) => {
let atn = new access_token({
appid,
secret
});
return atn.getCacheToken();
}
小程序已经上线啦,欢迎添加体验!!!(老何的博客)
微信公众号: