基于微信小程序云函数的方式获取微信公众号access_token

由于微信小程序不支持微信公众号获取access_token的域名配置,无法在小程序端通过wx.request()的方式来获取access_token,以下是获取微信公众号access_token的域名,经过几番折腾,终于实现了基于云开发中云函数的功能实现了access_token的获取,并存入云数据库中。

https://api.weixin.qq.com

首先在云数据库中新建集合名称"access_token",并新建字段_id、accessToken、createTime、expiresIn用来存储access_token值及有效时间。

基于微信小程序云函数的方式获取微信公众号access_token_第1张图片

在云函数中新建类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();

}

小程序已经上线啦,欢迎添加体验!!!(老何的博客)

基于微信小程序云函数的方式获取微信公众号access_token_第2张图片

微信公众号:

基于微信小程序云函数的方式获取微信公众号access_token_第3张图片

你可能感兴趣的:(基于微信小程序云函数的方式获取微信公众号access_token)