由于微信小程序不支持微信公眾號獲取access_token的域名配置歼培,無法在小程序端通過wx.request()的方式來獲取access_token叼屠,以下是獲取微信公眾號access_token的域名,經(jīng)過幾番折騰欢搜,終于實(shí)現(xiàn)了基于云開發(fā)中云函數(shù)的功能實(shí)現(xiàn)了access_token的獲取牛曹,并存入云數(shù)據(jù)庫中。
https://api.weixin.qq.com
首先在云數(shù)據(jù)庫中新建集合名稱"access_token",并新建字段_id瓢娜、accessToken挂洛、createTime、expiresIn用來存儲access_token值及有效時(shí)間眠砾。
在云函數(shù)中新建類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類中新建函數(shù)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);;
}
然后再新建函數(shù)getCacheToken()調(diào)用getAccessToken()獲得access_token并存入云數(shù)據(jù)庫中
async getCacheToken(){
let collection = 'access_token';//數(shù)據(jù)庫集合名稱
let gapTime = 300000; // 5 分鐘
cloud.init();
let db = cloud.database();
let result = await db.collection(collection).get();
if (result.code) {
return null;
}
// 數(shù)據(jù)庫沒有虏劲,獲取
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;
}
}
}
在云函數(shù)入口文件中聲明并傳入微信公眾號開發(fā)者id及secret_key即可荠藤,然后在小程序客戶端調(diào)用云函數(shù)即可獲取
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk');
const request = require('request');
const access_token = require('AccessToken');//引入AccessToken類
cloud.init()
let appid ='*************';//微信公眾號開發(fā)者id
let secret ='*******';//微信公眾號開發(fā)者secret_key
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
let atn = new access_token({
appid,
secret
});
return atn.getCacheToken();
}