微信小程序> 微信小程序获取AccesToken机制

微信小程序获取AccesToken机制

浏览量:857 时间: 来源:黑鸦log

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.保存AccessToken

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() + 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 saveAccessTokenAndTime(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.where({    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() + timeDelay)  accessTokenTime = nowTime  await saveAccessTokenTime(accessTokenTime);  return accessTokenTime;}async function saveAccessTokenTime(accessTokenTime) {  await wxConfigCollection.where({    name: "accessTokenTime"  }).update({    data: {      value: accessTokenTime    }  })}

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎