欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

小程序開發(fā)實現(xiàn)access_token統(tǒng)一管理

 更新時間:2021年07月13日 09:38:48   作者:Kindear  
本文主要介紹了小程序開發(fā)實現(xiàn)access_token統(tǒng)一管理,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

TOKEN 定時刷新器

一、背景

對于使用過公眾平臺的API功能的開發(fā)者來說,access_token絕對不會陌生,它就像一個打開家門的鑰匙,只要拿著它,就能使用公眾平臺絕大部分的API功能。因此,對于開發(fā)者而言,access_token的使用方式就變得尤其的重要。在日常API接口的運營中,經(jīng)常遇到各種的疑問:為什么我的access_token突然非法了?為什么剛剛拿到的access_token,用了10min就過期了?對于這些疑問,我們提供出access_token的設(shè)計方案,便于開發(fā)者對access_token使用方式上的理解。

對于access_token的獲取,可以參考公眾平臺的官方文檔:auth.getAccessToken、獲取Access token

二、access_token的內(nèi)部設(shè)計

2.1 access_token的時效性

眾所周知,access_token是通過appid和appsecret來生成的。內(nèi)部設(shè)計的步驟如下:

(1)開發(fā)者通過https請求方式: GET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,傳入appid及apppsecret的參數(shù)

(2)公眾平臺后臺會校驗appid和哈希(appsecret)是否與存儲匹配,若匹配,結(jié)合當(dāng)前時間戳,生成新的access_token。

(3)生成新的access_token的同時,會對老的access_token的過期時間戳更新為當(dāng)前時間戳。

(4)返回新的access_token給開發(fā)者。

這里以圖示的方式說明一下,新舊token交替過程:

從上圖需要注意的幾點:

(1)公眾平臺存儲層只會存儲新老兩個access_token,意味著假設(shè)開發(fā)者重復(fù)調(diào)用3次接口,則會導(dǎo)致最早的access_token立刻失效。

(2)雖然請求新的access_token后,老的access_token過期時間會更新為當(dāng)前時間,但也不會立刻失效,原理請參考 【2.2 access_token 的逐漸失效性】

(3)出于信息安全考慮,公眾平臺并不會明文存儲appsecret,僅存儲appid以及appsecret的哈希值。因此開發(fā)者要妥善保管appsecret。當(dāng)appsecret疑似泄露時,需要及時登錄mp.weixin.qq.com重置appsecret。

2.2 access_token 的逐漸失效性

從【access_token的時效性】了解到,當(dāng)開發(fā)者請求獲取新的access_token時,老的access_token過期時間會被更新為當(dāng)前時間,但此時不會立刻失效,因為公眾平臺會提供【5分鐘的新老access_token交替緩沖時間】,因此也稱為access_token

的逐漸失效性。

實現(xiàn)的原理是:

  • 由于老的access_token過期時間戳已被刷新,所以在API接口請求期間,帶上的access_token解開后,過期時間戳?xí)由?分鐘,然后和當(dāng)前設(shè)備時間進行比對,若超過當(dāng)前設(shè)備時間,判斷為失效。
  • 公眾平臺的設(shè)備會保持時鐘同步,但設(shè)備之間仍然可能會存在1-2分鐘的時間差異,所以【5分鐘】并非絕對的時間值。當(dāng)開發(fā)者獲取到新的access_token后應(yīng)該盡快切換到新的access_token。

從上圖需要注意的幾點:

(1)由于存在設(shè)備時間同步的差異,可能會導(dǎo)致開發(fā)者遇到拿著老的access_token請求API接口,部分請求成功,部分請求失敗的情況,建議開發(fā)者獲取到新的access_token后盡快使用。

(2)通過理解兩個圖示,對開發(fā)者來說,access_token是相當(dāng)關(guān)鍵且不能亂調(diào)的接口,建議開發(fā)者統(tǒng)一管理access_token,以免造成多次請求導(dǎo)致access_token失效。

三、access_token的統(tǒng)一管理

access_token的更新交給定時觸發(fā)器完成所有用到access_token的接口調(diào)用,不傳入access_token,交由后端從數(shù)據(jù)庫中讀取

下面以小程序云函數(shù)端統(tǒng)一管理access_token代碼為例展示

index.js 請求并更新access_token

如果在其他端,需要傳入APPID

const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const timeutil = require('./timeutil');
// 需要修改的配置項
const APPSECRET =  ''
const axios = require('axios');
const db = cloud.database();
// 定時刷新獲取配置信息
const CONFIG = 'cloud-token';
// 獲取TOKEN
const URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}'
function getAccessToken(APPID,APPSECRET){
  let url = URL;
  url = url.replace('{APPID}',APPID)
  url = url.replace('{APPSECRET}',APPSECRET)
  return new Promise(function(resolve,reject){
    axios.get(url).then(function (response) {
      console.log(response);
      resolve(response)
    })
    .catch(function (error) {
      console.log(error);
      reject(error)
    });
  })
}
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  // 自動獲取當(dāng)前應(yīng)用APPID
  var APPID = wxContext.APPID;
  return new Promise(function(resolve,reject){
    getAccessToken(APPID,APPSECRET).then(async res=>{
      console.log(res)
      let access_token = res.data.access_token;
      let ans =  await db.collection(CONFIG).doc('access_token').set({
        data:{
          value:access_token,
          _updateTime:timeutil.TimeCode()
        }
      })
      resolve(ans)
    })
  }) 
}

config.json 定時觸發(fā)器

每小時觸發(fā)一次

{
  "triggers": [
    {
      "name": "myTrigger",
      "type": "timer",
      "config": "0 0 * * * * *"
    }
  ]
}

timeutil.js 時間工具類

function TimeCode() {
  var date = new Date();
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
//獲取日期
function _formatTime(time) {
  var date = time.getFullYear() + '年' + time.getMonth() + '月' + time.getDate() + '日'
  var ftime = time.getHours() + '時' + time.getMinutes() + '分' + time.getSeconds() + '秒'
  return date + ftime;
}
function TimeCodeYmd(){
  var date = new Date();
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  return [year, month, day].map(formatNumber).join('-');
}
function formatNumber(n) {
  n = n.toString()
  return n[1] ? n : '0' + n
}
module.exports={
  TimeCode,
  TimeCodeYmd
}

其他云函數(shù)中使用到access_token的地方,通過查詢數(shù)據(jù)庫進行獲取,二者通過數(shù)據(jù)庫進行邏輯耦合。

access_token 查詢使用

const TOKEN = 'cloud-token';
//獲取access_token 
  try {
    let tres = await db.collection(TOKEN).doc('access_token').get();
    access_token = tres.data.value;
    console.log(access_token)
  } catch (error) {
    console.log('--無token記錄--')
    return {
      errCode:-1,
      errMsg:'數(shù)據(jù)庫中無TOKEN信息'
    }
  }

參考文檔

【1】公眾平臺/小程序服務(wù)端API的access_token的內(nèi)部設(shè)計 | 微信開放社區(qū) (qq.com)

【2】auth.getAccessToken | 微信開放文檔 (qq.com)

【3】微信小程序開發(fā)技巧總結(jié)(三)-- 云開發(fā)時效數(shù)據(jù)刷新和存儲 (access_token等) - Kindear - 博客園 (cnblogs.com)

到此這篇關(guān)于小程序開發(fā)實現(xiàn)access_token統(tǒng)一管理的文章就介紹到這了,更多相關(guān)小程序 access_token統(tǒng)一管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)動態(tài)驗證碼

    微信小程序?qū)崿F(xiàn)動態(tài)驗證碼

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)動態(tài)驗證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • js實現(xiàn)用戶離開頁面前提示是否離開此頁面的方法(包括瀏覽器按鈕事件)

    js實現(xiàn)用戶離開頁面前提示是否離開此頁面的方法(包括瀏覽器按鈕事件)

    這篇文章主要介紹了js實現(xiàn)用戶離開頁面前提示是否離開此頁面的方法,較為詳細(xì)的分析了javascript針對瀏覽器事件的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • ES6新特性之Symbol類型用法分析

    ES6新特性之Symbol類型用法分析

    這篇文章主要介紹了ES6新特性之Symbol類型用法,結(jié)合形式分析了Symbol類型的功能、使用方法及相關(guān)注意事項,需要的朋友可以參考下
    2017-03-03
  • JavaScript實現(xiàn)拖動滑塊拼圖驗證功能(html5、canvas)

    JavaScript實現(xiàn)拖動滑塊拼圖驗證功能(html5、canvas)

    這篇文章主要介紹了JavaScript實現(xiàn)拖動滑塊拼圖驗證(html5、canvas),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JS Generator函數(shù)yield表達(dá)式示例詳解

    JS Generator函數(shù)yield表達(dá)式示例詳解

    這篇文章主要為大家介紹了JS Generator函數(shù)yield表達(dá)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • ThingJS粒子特效一鍵實現(xiàn)雨雪效果

    ThingJS粒子特效一鍵實現(xiàn)雨雪效果

    在做3D項目時,我們經(jīng)常需要模擬下雨,下雪的天氣,有時也會模擬噴泉、著火等效果。這些效果需要使用名為粒子系統(tǒng)(particle)的技術(shù)來實現(xiàn)。使用ThingJS可以快速編寫粒子效果,本文就來看看如何實現(xiàn)
    2021-05-05
  • 一文學(xué)習(xí)JavaScript?使用誤區(qū)

    一文學(xué)習(xí)JavaScript?使用誤區(qū)

    在?JavaScript?程序中如果你在?if?條件語句中使用賦值運算符的等號?(=)?將會產(chǎn)生一個錯誤結(jié)果,?正確的方法是使用比較運算符的兩個等號?(==),這篇文章主要介紹了一文學(xué)習(xí)JavaScript?使用誤區(qū),需要的朋友可以參考下
    2023-02-02
  • js+Html實現(xiàn)表格可編輯操作

    js+Html實現(xiàn)表格可編輯操作

    這篇文章主要為大家詳細(xì)介紹了js+Html實現(xiàn)表格可編輯操作,能動態(tài)添加刪除行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 理解JavaScript中的適配器模式Adapter?Pattern

    理解JavaScript中的適配器模式Adapter?Pattern

    這篇文章主要介紹了理解JavaScript中的適配器模式,適配器模式即Adapter?Pattern,是作為兩個不兼容的接口之間的橋梁。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,下文更多相關(guān)介紹需要的小伙伴可以參考一下
    2022-04-04
  • JS實現(xiàn)字體背景跑馬燈

    JS實現(xiàn)字體背景跑馬燈

    這篇文章主要為大家詳細(xì)介紹了JS實現(xiàn)字體背景跑馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評論