微信小程序云开发个人博客项目实战(4)-- 云函数获取微信公众号
2019-12-12 本文已影响0人
IT姑凉
微信小程序云开发个人博客项目实战目录
一、准备工作及引入 Vant Weapp 小程序 UI 组件库
二、专题的增删改查
三、文章的增删改查
四、云函数获取微信公众号access_token
五、云函数同步公众号文章到小程序
前提:确认公众号的接口权限(这篇文章仅为下篇文章做准备)
一、配置白名单
小程序端获取公众号access_token需要添加IP白名单:公众号后台-开发-基本配置
172.81.207.12
172.81.212.74
172.81.235.12
172.81.236.99
172.81.245.51
212.64.65.131
212.64.84.22
212.64.85.139
212.64.85.35
212.64.87.134
212.64.57.239
212.64.68.233
212.64.84.102
212.64.84.30
212.64.84.54
212.64.85.82
212.64.89.109
212.64.89.115
212.64.89.17
212.64.89.18
小程序云开发云函数ip会变,暂时根据提示的ip往上加吧~(是不是很无奈)
网上有一些解决办法仅供参考:
https://developers.weixin.qq.com/community/develop/doc/000a46a6bf44e80743e9cd8a55b400?_at=1590570259144
腾讯云固定公网出口 IP
二、小程序云函数获取公众号access_token
接口调用请求说明
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
1、云开发控制台,新建集合wx-access-token
,用于保存获取到的微信公众号的access_token
2、开发者工具 > 云函数目录 > 右键选择 “新建Node.js” 云函数 getAccessToken
,如下图:
3、云函数 getAccessToken
下新建 AccessToken.js
const cloud = require('wx-server-sdk')
const request = require('request')
class AccessToken {
constructor({
appid,
secret
}) {
this.appid = appid
this.secret = secret
}
// 获取公众号access_token
async getWechatAccessToken() {
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);;
}
// 获取保存在数据库的公众号access_token
async getCachedWechatAccessToken() {
cloud.init();
let db = cloud.database();
let _this=this;
let collection = 'wx-access-token'; //数据库集合名称
let gapTime = 300000; // 5 分钟
let result = await db.collection(collection).get();
if (result.code) {
return null;
}
// 数据库没有,获取token添加到数据库
if (!result.data.length) {
let accessTokenBody = await _this.getWechatAccessToken();
let act = accessTokenBody.access_token;
let ein = accessTokenBody.expires_in * 1000;
await db.collection(collection).add({
data: {
accessToken: act,
expiresIn: ein,
createTime: Date.now()
}
});
return act;
} else {
// 数据库中存在token
let data = result.data[0];
let {
_id,
accessToken,
expiresIn,
createTime
} = data;
// 判断access_token是否有效
if (Date.now() < createTime + expiresIn - gapTime) {
return accessToken;
}
// 失效,重新获取,更新token数据
else {
let accessTokenBody = await _this.getWechatAccessToken();
let act = accessTokenBody.access_token;
let ein = accessTokenBody.expires_in * 1000;
await db.collection(collection).doc(_id).update({
data:{
accessToken: act,
expiresIn: ein,
createTime: Date.now()
}
});
return accessTokenBody.access_token;
}
}
}
}
module.exports = AccessToken
4、修改云函数入口文件index.js
// 云函数入口文件
const cloud = require('wx-server-sdk');
const request = require('request');
const access_token = require('AccessToken');
cloud.init()
let appid = '***********************';//微信公众号开发者id
let secret = '***********************';//微信公众号开发者secret_key
// 云函数入口函数
exports.main = async (event, context) => {
let at = new access_token({
appid,
secret
});
return at.getCachedWechatAccessToken();
}
5、创建并部署云函数
6、页面调用,编译调试
//可以在onLoad方法中 调试
onLoad: function (options) {
wx.cloud.callFunction({
// 云函数名称
name: 'getAccessToken',
success: function (res) {
console.log("微信公众号AccessToken:")
console.log(res.result)
},
fail: console.error
})
},
获取微信公众号AccessToken结果: