1.机制逻辑当数据库中accessToken未过期,从数据库中获取若数据库中accessToken已过期,则从微信服务器中获取,并更新数据库中的accessToken和有效时间2.数据库定义数据库中定义集合“wxConfig”,包含 “AccessToken” “accessTokenTime”两个内容3.判断数据库中accessToken是否过期const wxConfigCollection = db.collection('wxConfig')//获取数据库中accessToken的有效时间async function getAccessTokenTime() { let accessTokenTime = await wxConfigCollection.where({ name: "accessTokenTime" }).get(); accessTokenTime = accessTokenTime.data[0].value return accessTokenTime;}//数据库中accessToken是否过期async function isAccessTokenTimeTimeout() { let accessTokenTime =await getAccessTokenTime(); let d = new Date(); if (accessTokenTime d) { //说明access未过期 return false; } else { //说明access过期 return true; }}
4.重新获取Access Token//重新获取accessTokenasync function getNewAccessToken() { let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=AppSecret" let getResponse = await got(url) //get请求 let responseJson = JSON.parse(getResponse.body); return responseJson;}
上述的appid和AppSecret修改成自己的5.保存AccessTokenasync function saveAccessToken(accessToken) { await wxConfigCollection.where({ name: "AccessToken" }).update({ data:{ value: accessToken } })}//增加accessTokenTime从现在开始的有效时长async function addAccessTokenTime(timeDelay) { let accessTokenTime = await getAccessTokenTime(); timeDelay=parseInt(timeDelay)-10;//减少10秒已消除获取access Token时的误差 let nowTime=new Date(); nowTime.setSeconds(nowTime.getSeconds() + timeDelay) accessTokenTime = nowTime await saveAccessTokenTime(accessTokenTime); return accessTokenTime;}async function saveAccessTokenAndTime(newAccessToken) { let accessTokenContent = newAccessToken.access_token let accessTokenDelay = newAccessToken.expires_in await saveAccessToken(accessTokenContent); await addAccessTokenTime(accessTokenDelay);}
6.从数据库中获取AccessToken//获取数据库中accessTokenasync function getAccessTokenInDB() { let accessToken = await wxConfigCollection.where({ name: "AccessToken" }).get(); accessToken = accessToken.data[0].value return accessToken;}
7.main函数内容exports.main = async (event, context) = { const wxContext = cloud.getWXContext() if( await isAccessTokenTimeTimeout()){ let newAccessToken = await getNewAccessToken(); await saveAccessTokenAndTime(newAccessToken); return newAccessToken.access_token; }else{ return getAccessTokenInDB(); } }
8.代码全文/** * 自动获取accessToken * 当数据库中accessToken未过期,从数据库中获取 * 若数据库中accessToken已过期,则从微信服务器中获取,并更新数据库中的accessToken和有效时间 */// 云函数入口文件const cloud = require('wx-server-sdk')const got = require('got'); //引用 gotcloud.init()const db = cloud.database({ env:"self-stydy-spirit-tyb9d"})const wxConfigCollection = db.collection('wxConfig')// 云函数入口函数exports.main = async (event, context) = { const wxContext = cloud.getWXContext() if( await isAccessTokenTimeTimeout()){ let newAccessToken = await getNewAccessToken(); await saveAccessTokenAndTim开通钻石小程序电话:4006-838-530e(newAccessToken); return newAccessToken.access_token; }else{ return getAccessTokenInDB(); } }//获取数据库中accessToken的有效时间async function getAccessTokenTime() { let accessTokenTime = await wxConfigCollection.where({ name: "accessTokenTime" }).get(); accessTokenTime = accessTokenTime.data[0].value return accessTokenTime;}//数据库中accessToken是否过期async function isAccessTokenTimeTimeout() { let accessTokenTime =await getAccessTokenTime(); let d = new Date(); if (accessTokenTime d) { //说明access未过期 return false; } else { //说明access过期 return true; }}//获取数据库中accessTokenasync function getAccessTokenInDB() { let accessToken = await wxConfigCollection.开通热门兼职小程序电话:4006-838-530where({ name: "AccessToken" }).get(); accessToken = accessToken.data[0].value return accessToken;}//重新获取accessTokenasync function getNewAccessToken() { let url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=&secret=" let getResponse = await got(url) //get请求 let responseJson = JSON.parse(getResponse.body); return responseJson;}async function saveAccessTokenAndTime(newAccessToken) { let accessTokenContent = newAccessToken.access_token let accessTokenDelay = newAccessToken.expires_in await saveAccessToken(accessTokenContent); await addAccessTokenTime(accessTokenDelay);}async function saveAccessToken(accessToken) { await wxConfigCollection.where({ name: "AccessToken" }).update({ data:{ value: accessToken } })}//增加accessTokenTime从现在开始的有效时长async function addAccessTokenTime(timeDelay) { let accessTokenTime = await getAccessTokenTime(); timeDelay=parseInt(timeDelay)-10;//减少10秒已消除获取access Token时的误差 let nowTime=new Date(); nowTime.setSeconds(nowTime.getSeconds(开通熟食/半成品小程序电话:4006-838-530) + timeDelay) accessTokenTime = nowTime await saveAccessTokenTime(accessTokenTime); return accessTokenTime;}async function saveAccessTokenTime(accessTokenTime) { await wxConfigCollection.where({ name: "accessTokenTime" }).update({ data: { value: accessTokenTime } })}
最新评论