小程序中常常有須要進行OCR識別,或者使用外部api例如百度AI識別等接口,請求調用這些接口須要令牌,即一些具備時效性的數據。本文以小程序雲開發使用百度API接口爲例,介紹access_token定時刷新和請求機制。html
下面是百度調用身份證識別的一段需求,須要傳的參數須要有access_token。數據庫
請求示例json
HTTP 方法:POST
小程序
請求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
微信小程序
URL參數:api
參數 | 值 |
---|---|
access_token | 經過API Key和Secret Key獲取的access_token,參考「Access Token獲取」 |
access_token 是具備時效性的數據,每次請求一次接口就進行一次請求刷新,顯然是對計算機資源的極大浪費,且影響效率。數組
2.1.雲數據庫配置微信
新建一個雲數據庫名爲setconfig。做爲配置型信息存儲數據庫,相似access_token的數據均可以向其中存儲。app
對access_token配置下列字段:async
id會自動生成,配置完效果以下(這個value是已經更新後的值)
2.2 定時雲函數配置
閱讀access_token獲取的文檔,可知,咱們須要請求一個地址來獲取access_token的值。
請求URL數據格式
向受權服務地址https://aip.baidubce.com/oauth/2.0/token
發送請求(推薦使用POST),並在URL中帶上如下參數:
client_credentials
;API Key
;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: '請求失敗,沒法經過掃描填充數據', }) } }) },
[2]微信小程序雲開發數據庫update函數更新不了數據的問題
小程序開發相關問題歡迎聯繫QQ 1025584691