最近想利用小程序云开发来做一个博客小程序,由于个人的小程序不能使用发布功能,所以我打算对接自己公众号的文章,想链接公众号,
首先我们得获取到公众号的 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
}
}
}