您在看此文章之前有過(guò)其他程序的開(kāi)發(fā)經(jīng)驗(yàn),那一定會(huì)知道一般例如安卓或者蘋(píng)果的原生APP都提供了本地的存儲(chǔ)功能,甚至可以使用sqlite數(shù)據(jù)庫(kù)來(lái)做存儲(chǔ)。可是微信的小程序框架基 ...
如果您在看此文章之前有過(guò)其他程序的開(kāi)發(fā)經(jīng)驗(yàn),那一定會(huì)知道一般例如安卓或者蘋(píng)果的原生APP都提供了本地的存儲(chǔ)功能,甚至可以使用sqlite數(shù)據(jù)庫(kù)來(lái)做存儲(chǔ)。可是微信的小程序框架基于微信本身,其實(shí)際運(yùn)行環(huán)境只是在瀏覽器里面,所以不會(huì)提供那么豐富的數(shù)據(jù)存儲(chǔ)實(shí)力。但html5開(kāi)始已經(jīng)可以在瀏覽器里面存儲(chǔ)數(shù)據(jù),好在微信的小程序給這個(gè)功能封裝好了,這樣我們可以使用數(shù)據(jù)存儲(chǔ)。
每個(gè)微信小程序都可以有自己的本地緩存,可以通過(guò) wx.setStorage(wx.setStorageSync)、
wx.getStorage(wx.getStorageSync)、
wx.clearStorage(wx.clearStorageSync)
可以對(duì)本地緩存進(jìn)行設(shè)置、獲取和清理。本地緩存最大為10MB。
上面的set和get都有對(duì)應(yīng)的Sync方法,帶Sync的方法為同步方法、不帶Sync的方法為異步方法。
設(shè)置緩存都需要設(shè)置一個(gè)key和對(duì)應(yīng)的data值,我們?cè)凇段⑿舧eb開(kāi)發(fā)者工具》中的調(diào)試狀態(tài)下可以點(diǎn)擊調(diào)試窗口的Storage 欄來(lái)查看我們緩存在本地的數(shù)據(jù)。
緩存可以保存數(shù)組、數(shù)值、字符串、對(duì)象。
提供setStorage
和setStorageSync
兩個(gè)接口,并且在使用設(shè)置存儲(chǔ)方法時(shí),如果小程序的存儲(chǔ)值當(dāng)中已經(jīng)存在對(duì)應(yīng)的key的值,那么會(huì)使用新的值替換原來(lái)的值。
1
2
3
4
5
6
7
8
9
|
wx.setStorage({
key:"key",
data:"value",
success:function(res){console.log(res)},
fail:function(res){console.log(res)},
complete:function(res){console.log(res)},
})
//Object {errMsg: "setStorage:ok"}
//Object {errMsg: "setStorage:ok"}
|
因?yàn)樵摲椒橥浇涌冢灾苯釉O(shè)置key和data:
1
|
wx.setStorageSync('key', 'value')
|
上面兩個(gè)demo中我們都使用了字符串緩存,當(dāng)然我們也可以緩存一個(gè)對(duì)象,例如:
1
|
wx.setStorage({key:"ob",data:{name:'smallerpig',sex:1,age:18}})
|
異步接口,所以我們可以定義幾個(gè)回調(diào):
1
2
3
4
5
6
7
8
9
10
|
wx.getStorage(
{
key:'key',
success:function(res){
console.log(res)//Object {errMsg: "getStorage:ok", data: "value1"}
},
fail:function(res){console.log(res)},
complete:function(res){console.log(res)}
})
|
其中,我們可以看出來(lái),微信小程序的很多異步接口的回調(diào)都會(huì)給出三個(gè)回調(diào):success、fail、complete,在執(zhí)行成功的時(shí)候回執(zhí)行success、complete回調(diào);在執(zhí)行失敗之后會(huì)分別執(zhí)行fail、complete回調(diào)。
該接口為同步接口,所以只需傳遞對(duì)應(yīng)的key值就可以了。如下列代碼:
1
2
|
wx.getStorageSync('ob')
//Object {name: "smallerpig", sex: 1, age: 18}
|
使用wx.getStorageInfo
接口
例如下列代碼:
1
2
3
4
5
6
7
8
9
10
|
wx.getStorageInfo({
success: function(res) {
console.log(res.keys)
console.log(res.currentSize)
console.log(res.limitSize)
}
//["logs", "r3session", "key"]0: "logs"1: "r3session"2: "key"]
//1
//10240
})
|
也可以使用同步接口wx.getStorageInfoSync
。
在上一篇文章中,小豬介紹了如何解密通過(guò)wx.getUserInfo
接口獲取到的cryptedData數(shù)據(jù)。其中的session_key小豬是寫(xiě)在flask的緩存中,緩存的鍵是寫(xiě)死為:xcx_session_key
。在真實(shí)環(huán)境中我們不能夠這樣寫(xiě),因?yàn)檫@樣不同的用戶獲取到的session_key是相同的,所以我們需要給不同的用戶附上不同的緩存key。把flask的緩存key返回給微信小程序,小程序中可以固定一個(gè)key值,data值保持flask后臺(tái)給到的值。
說(shuō)的比較繞,這里需要讀者好好理解下。
在flask的代碼的使用code獲取session_key中,使用下列代碼:
1
2
3
4
5
6
7
8
9
|
@app.route('/user/getuserinfo', methods=['GET', 'POST'])
def getuserinfo():
code = request.data
url = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code' % (appid, secret, code)
r = requests.get(url)
j = json.loads(r.text)
r3session_key = binascii.hexlify(os.urandom(64))
cache.set(r3session_key, j['session_key'])
return r3session_key
|
接下來(lái),在wx.request
的回調(diào)中把flask中返回的r3session_key保存起來(lái):
1
2
3
4
5
6
7
8
|
wx.request({
url: 'https://***.smallerpig.com/user/getuserinfo',
data: r.code,
method: 'POST',
success: function(res){
wx.setStorageSync('r3session', res.data)
}
})
|
再接下來(lái),在調(diào)用wx.getUserInfo時(shí)將返回的數(shù)據(jù)加上從微信小程序本地緩存中取到的r3session
丟給flask來(lái)處理,flask根據(jù)來(lái)的r3session
從本地服務(wù)器的flask緩存中取到微信的值解密cryptedData。這才是一個(gè)完整的過(guò)程。
小程序的getUserInfo代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
//將本地存儲(chǔ)中的r3session值也同樣傳遞到我的服務(wù)器,在服務(wù)器中找出微信給到我們的session_key
var r3session = wx.getStorageSync('r3session')
res.r3session = r3session
wx.request({
url: 'https://***.smallerpig.com/user/getuserunionid',
data: res,
success: function(res){
// success
console.log(res)
},
})
}
})
|
對(duì)應(yīng)的flask代碼:
1
2
3
4
5
6
7
8
9
|
@app.route('/user/getuserunionid', methods=['GET', 'POST'])
def getuserid():
r = json.loads(request.data)
encryptedData = r['encryptedData']
iv = r['iv']
xcx_session_key = r['r3session']
session_key = cache.get(xcx_session_key) # 從緩存中取出對(duì)應(yīng)r3session對(duì)應(yīng)的session_key
pc = WXBizDataCrypt(appid, session_key)
return pc.decrypt(encryptedData, iv)
|
參考官方文檔地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/data.html
經(jīng)過(guò)幾篇文章的介紹,如果您是按照小豬的代碼一步一步做的話你應(yīng)該已經(jīng)了解小程序開(kāi)發(fā)的大致過(guò)程,接下來(lái)的重點(diǎn)無(wú)非就是熟悉小程序提供給大家的接口,然后根據(jù)這些接口來(lái)完善我們的業(yè)務(wù)邏輯。
接下來(lái)的幾篇文章小豬將向大家介紹一個(gè)實(shí)際的功能:在小程序中添加備忘錄,在適時(shí)的時(shí)候小程序?qū)⑻嵝延脩簟?/p>