小程序雲開發時效數據刷新和存儲 (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配置下列字段:
- _openid (你的openid* 必填)
- config_name (配置名,填access_token)
- 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": [
{
"name": "myTrigger",
"type": "timer",
"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. 參考資料
[2]微信小程序雲開發數據庫update函數更新不了數據的問題
小程序開發相關問題歡迎聯系QQ 1025584691
