小程式開發技巧(三)– 雲開發時效數據刷新和存儲 (access_token等)

小程式雲開發時效數據刷新和存儲 (access_token等)

1.問題描述

小程式中經常有需要進行OCR識別,或者使用外部api例如百度AI識別等介面,請求調用這些介面需要令牌,即一些具有時效性的數據。本文以小程式雲開發使用百度API介面為例,介紹access_token定時刷新和請求機制。

下面是百度調用身份證識別的一段需求,需要傳的參數需要有access_token。

請求示例

HTTP 方法:POST

請求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard

URL參數:

參數
access_token 通過API Key和Secret Key獲取的access_token,參考「Access Token獲取

access_token 是具有時效性的數據,每次請求一次介面就進行一次請求刷新,顯然是對電腦資源的極大浪費,且影響效率。

2.問題解決方案

2.1.雲資料庫配置

新建一個雲資料庫名為setconfig。作為配置型資訊存儲資料庫,類似access_token的數據都可以向其中存儲。

對access_token配置下列欄位:

  1. _openid (你的openid* 必填)
  2. config_name (配置名,填access_token)
  3. value (access_token的值,默認為null)

id會自動生成,配置完效果如下(這個value是已經更新後的值)

2.2 定時雲函數配置

閱讀access_token獲取的文檔,可知,我們需要請求一個地址來獲取access_token的值。

獲取Access_Token

請求URL數據格式

向授權服務地址https://aip.baidubce.com/oauth/2.0/token發送請求(推薦使用POST),並在URL中帶上以下參數:

  • grant_type: 必須參數,固定為client_credentials
  • client_id: 必須參數,應用的API Key
  • client_secret: 必須參數,應用的Secret Key

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&

實現

我們需要在雲函數中模擬請求,並根據返回結果刷新雲資料庫中的access_token值。

想要運行通過該程式,需要開發者自己去百度創建帳號並創建應用。

雲函數index.js

// 雲函數入口文件 index.js  const cloud = require('wx-server-sdk')    cloud.init({    env: cloud.DYNAMIC_CURRENT_ENV  })  const db = cloud.database()  var request = require('request')  // 定時器  exports.main = async(event, context) => {    const appkey = '填寫你的百度AppKey';    const appsecret = '填寫你的百度AppSecret';    var url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + appkey + '&client_secret=' + appsecret;    return new Promise((resolve, reject) => {      request({        url: url,        method: "POST",        json: true,        headers: {          "content-type": "application/json",        },      }, function(error, response, body) {          if (!error && response.statusCode == 200) {          console.log('通行證為' + body.access_token)          resolve(body.access_token)            //記得修改.doc('xxx') 中的內容          db.collection('setconfig').doc('aaaf5a56-1dd9-4e50-974b-34688fa47b20').update({            data: {              value: body.access_token            }            }).then(res => {            console.log('調用完成')            console.log(res)          })        }      })    })  }

docid是setconfig生成的,每個人不同注意修改

還有一種更新寫法,不過更推薦使用上面的方法,效率更高,且穩定。

db.collection('setconfig').where({      config_name:'access_token'  }).update({   data: {        value: body.access_token      }  })

雲函數config.json(定時觸發器功能實現)

{    // triggers 欄位是觸發器數組,目前僅支援一個觸發器,即數組只能填寫一個,不可添加多個    "triggers": [      {        // name: 觸發器的名字,規則見下方說明        "name": "myTrigger",        // type: 觸發器類型,目前僅支援 timer (即 定時觸發器)        "type": "timer",        // config: 觸發器配置,在定時觸發器下,config 格式為 cron 表達式,        //現在為每天凌晨兩點觸發        "config": "0 0 2 * * * *"      }    ]  }

雲函數整體結構為:

然後上傳並部署(雲端安裝依賴)。

2.3 小程式端獲取Access_token

在小程式進入相應介面的時候,請求雲資料庫,獲取access_token

onLoad: function (options) {      //頁面初始化      var that = this;      db.collection('setconfig').where({        config_name:'access_token'      }).get({        success(res){          that.setData({            access_token:res.data[0].value          })          //console.log(res.data[0])        },        fail(res){          wx.showToast({            title: '請求失敗,無法通過掃描填充數據',          })        }      })    },

3. 參考資料

[1]百度AI鑒權認證機制

[2]微信小程式雲開發資料庫update函數更新不了數據的問題

[3]小程式雲開發定時觸發器

小程式開發相關問題歡迎聯繫QQ 1025584691