微信小程序 使用云函数 获取accessToken

最近想利用小程序云开发来做一个博客小程序,由于个人的小程序不能使用发布功能,所以我打算对接自己公众号的文章,想链接公众号,

首先我们得获取到公众号的 access_token;

我们先看下微信开发文档中的介绍:

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

使用小程序云函数获取:

let appid = 'wxf04c3a8e240298a0'; //微信公众号开发者id
  let secret = '985b8049cd1a6ec0136946d45b015d1e'; //微信公众号开发者secret_key
  let token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&' + 'secret=' + secret;

我们需要提供两个参数:`appid` 和 `secret` ,然后想token_url 提交请求 就能获取到:

43_F0gEPO4KCPBnd2xuDlKxF9Q5q3LL1BP0eiWshOQEaBMwq1CdxAEXvCByiMXxLGzK4CDsTZKm11Lj5mXdRpdRZsxcxrS1MS5d5Jf3wvlvezfctkMdmS41OGx7f0cMOpWF0T1q5EDwp7OKJzzsXLBhAFAGUK

代码如下:

// 云函数入// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database() //初始化数据库

// 云函数入口函数
exports.main = async (event, context) => {
  let token = await getCachedWechatAccessToken()
  return token;
}


// 获取公众号access_token
async function getWechatAccessToken() {
  let appid = 'wxf04c3a8e240298a0'; //微信公众号开发者id
  let secret = '985b8049cd1a6ec0136946d45b015d1e'; //微信公众号开发者secret_key
  let token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&' + 'secret=' + 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);;
}

然后我们把获取到的token 值 存入云数据库中,在云数据库中 创建一个集合 `wxtoken`

// 云函数入// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database() //初始化数据库

// 云函数入口函数
exports.main = async (event, context) => {
  let token = await getCachedWechatAccessToken()
  return token;
}


// 获取公众号access_token
async function getWechatAccessToken() {
  let appid = 'wxf04c3a8e240298a0'; //微信公众号开发者id
  let secret = '985b8049cd1a6ec0136946d45b015d1e'; //微信公众号开发者secret_key
  let token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&' + 'secret=' + 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);;
}

// 获取保存在数据库的公众号access_token
async function getCachedWechatAccessToken() {
  let wxtoken = 'wxtoken'; //数据库集合名称
  let gapTime = 300000; // 5 分钟
  let result = await db.collection(wxtoken).get();
  //判断数据库中是否存有 AccessToken
  //数据库中没有数据  获取
  if(!result.data.length){
    let accessToken = await getWechatAccessToken();
    await db.collection(wxtoken).add({
      data: {
        accessToken: accessToken.access_token,
        expiresIn: accessToken.expires_in * 1000,
        createTime: Date.now()
      }
    });
    return  accessToken.access_token
  } 

}

由于token值是有时间限制的,所以后续我们需要判断数据库中的token值是否有效,无效则我们重新发送请求获取token值。

// 云函数入// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database() //初始化数据库
const _ = db.command
// 云函数入口函数
exports.main = async (event, context) => {
  let token = await getCachedWechatAccessToken()
  return token;
}


// 获取公众号access_token
async function getWechatAccessToken() {
  let appid = 'wxf04c3a8e240298a0'; //微信公众号开发者id
  let secret = '985b8049cd1a6ec0136946d45b015d1e'; //微信公众号开发者secret_key
  let token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + appid + '&' + 'secret=' + 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);;
}

// 获取保存在数据库的公众号access_token
async function getCachedWechatAccessToken() {
  let wxtoken = 'wxtoken'; //数据库集合名称
  let result = await db.collection(wxtoken).get();
  //判断数据库中是否存有 AccessToken
  //数据库中没有数据  获取
  if (!result.data.length) {
    let accessToken = await getWechatAccessToken();
    await db.collection(wxtoken).add({
      data: {
        accessToken: accessToken.access_token,
        expiresIn: accessToken.expires_in * 1000,
        createTime: Date.now()
      }
    });
    return accessToken.access_token
  } else {
    let data = result.data[0];
    let {
      _id,
      accessToken,
      expiresIn,
      createTime
    } = data;
    // 判断access_token是否有效
    const nowTime = new Date().getTime()
    if ((nowTime - createTime) / 1000 / 60 / 60 >= 2) {
      //无效重新获取,存入数据库中
      let Token = await getWechatAccessToken();
      let act = Token.access_token;
      let ein = Token.expires_in * 1000;
       db.collection(wxtoken).doc(_id).set({
        data:{
        accessToken: act,
        expiresIn: ein,
        createTime: Date.now()
        }
      });
      return Token
    } else {
      //查询的数据有效,直接返回数据
      return data.accessToken
    }
  }
}

 

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都不懂的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值