基于微信小程序云函数的方式获取微信公众号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张图片

 更多精彩内容,敬请关注我的微信公众号:

你可能感兴趣的:(微信小程序)