在小程序中,微信為指紋識(shí)別提供了兩個(gè)接口:
wx.checkIsSupportSoterAuthentication()
wx.startSoterAuthentication()
根據(jù)兩個(gè)接口的名字,我們可以知道:前者用于檢查當(dāng)前設(shè)備是否支持生物識(shí)別,后者則是實(shí)際調(diào)用指紋識(shí)別的接口。
那么,整個(gè)調(diào)用過(guò)程的邏輯就很簡(jiǎn)單了:先檢測(cè)當(dāng)前設(shè)備和微信版本是否支持指紋識(shí)別,如果支持,則調(diào)用指紋識(shí)別進(jìn)行鑒權(quán)。
1. 如何檢測(cè)是否可以調(diào)用指紋識(shí)別?
利用wx.checkIsSupportSoterAuthentication()接口和wx.canIUse()接口,我們可以檢測(cè)小程序在當(dāng)前設(shè)備上,是否可以使用指紋識(shí)別。
具體代碼如下:
if (wx.canIUse('checkIsSupportSoterAuthentication')) { // 檢測(cè)當(dāng)前微信版本是否支持調(diào)用指紋相關(guān)接口 wx.checkIsSupportSoterAuthentication({ success(res) { console.log(res) } }) }
我們從調(diào)試臺(tái)中,可以看到調(diào)用結(jié)果含有supportMode參數(shù),里面包裹一個(gè)數(shù)組。
[圖片上傳失敗...(image-957c4b-1513138198112)]
官方文檔的說(shuō)法是,如果數(shù)組中包含有 'fingerPrint',那么就代表當(dāng)前設(shè)備可以使用指紋識(shí)別功能
根據(jù)以上信息,我們來(lái)改寫一下代碼。
if (wx.canIUse('checkIsSupportSoterAuthentication')) { wx.checkIsSupportSoterAuthentication({ success(res) { if(res.supportMode[0] == 'fingerPrint'){ // 寫法不嚴(yán)謹(jǐn),正確寫法應(yīng)該是遍歷數(shù)組查找 // 在此具體調(diào)用指紋識(shí)別 }else{ console.log('當(dāng)前設(shè)備不支持指紋識(shí)別') } } }) }
需要注意的是,如果用戶的設(shè)備不支持指紋驗(yàn)證,你應(yīng)該為用戶提供替代驗(yàn)證方式。
2. 如何調(diào)用指紋識(shí)別?
確認(rèn)小程序可以使用指紋識(shí)別之后,我們就可以進(jìn)入正式的接口調(diào)用環(huán)節(jié)了。
示例的代碼如下:
wx.startSoterAuthentication({ requestAuthModes: ['fingerPrint'], challenge: '123456', authContent: '請(qǐng)用指紋解鎖', success(res) { // res 中包含授權(quán)數(shù)據(jù),需要進(jìn)一步驗(yàn)證正確性 }, fail(res){ console.log('用戶取消了指紋識(shí)別,或調(diào)用出現(xiàn)錯(cuò)誤') } })
在這個(gè)接口中,有這些參數(shù):
requestAuthModes:允許的生物鑒權(quán)方式,以數(shù)組的形式呈現(xiàn)。需要指紋識(shí)別,只需填入'finerPrint‘ 。
challenge:官方稱為「挑戰(zhàn)因子」,可以將請(qǐng)求特征碼(訂單號(hào)、請(qǐng)求編號(hào)等)放入,確認(rèn)用戶的是授權(quán)哪一個(gè)請(qǐng)求。
authContent:在指紋識(shí)別的對(duì)話框中,向用戶顯示的提示信息。
將兩個(gè)接口合并起來(lái)用,最終我們的代碼效果如下:
if (wx.canIUse('checkIsSupportSoterAuthentication')) { wx.checkIsSupportSoterAuthentication({ success(res) { if(res.supportMode[0] == 'fingerPrint'){ // 寫法不嚴(yán)謹(jǐn),正確寫法應(yīng)該是遍歷數(shù)組查找}else{ console.log('當(dāng)前設(shè)備不支持指紋識(shí)別') } } }) }
最后我們?cè)囍\(yùn)行一下。看到這樣的提示,說(shuō)明我們的調(diào)用成功了:
[圖片上傳失敗...(image-b22b71-1513138198112)]
如何鑒別指紋信息的真實(shí)性?
如果你的小程序沒有非常嚴(yán)格的安全要求(例如,數(shù)據(jù)存儲(chǔ)在本地的日記本小程序等),到這一步已經(jīng)可以結(jié)束了。
但如果你的小程序需要更強(qiáng)的安全性(例如金融交易類的小程序),你還要確認(rèn)指紋信息的真實(shí)性,以防有人以偽造數(shù)據(jù)的方式,破解指紋驗(yàn)證。
wx.startSoterAuthentication()接口中,微信會(huì)向小程序返回指紋識(shí)別數(shù)據(jù)。開發(fā)者需要根據(jù)這些數(shù)據(jù),進(jìn)行進(jìn)一步的驗(yàn)證。
1. 接口會(huì)返回什么信息?
調(diào)用接口所返回的數(shù)據(jù)示例如下:
[圖片上傳失敗...(image-19f43-1513138198112)]
小程序文檔中,已經(jīng)給這些參數(shù)的具體含義做出解釋。
[圖片上傳失敗...(image-bdc1d5-1513138198112)]
返回值里還有 resultJSON 這個(gè)參數(shù),它本身就是一個(gè)被轉(zhuǎn)換成字符串的 JSON 對(duì)象。開發(fā)者如果需要獲取里面的內(nèi)容,需要JSON.parse解析。
resultJSON具體參數(shù)如下:
[圖片上傳失敗...(image-869ec5-1513138198112)]
2. 如何鑒定這些信息?
微信官方已經(jīng)放出了鑒定指紋信息的流程圖,我們可以大致了解到具體的鑒定方法。
[圖片上傳失敗...(image-e93d91-1513138198112)]
這里我們需要提到的是「異步調(diào)用微信官方后臺(tái)驗(yàn)證接口」這一步驟。在文檔中,微信團(tuán)隊(duì)已經(jīng)提供一個(gè)供驗(yàn)證指紋信息的接口。
它的調(diào)用地址是http://api.weixin.qq.com/cgi-bin/soter/verify_signature?access_token=%access_token(嗯,它甚至沒有使用 HTTPS……),需要使用 POST 方式傳入具體參數(shù)。
對(duì)于具體參數(shù),文檔出只給出了這樣一行:
{"openid":"$openid", "json_string" : "$json", "json_signature" : "$sign" }
官方并沒有給出參數(shù)具體意義。據(jù)知曉程序(微信號(hào) zxcx0101)猜測(cè),這些參數(shù)具體含義應(yīng)該是:
但據(jù)知曉程序測(cè)試,如果直接調(diào)用,會(huì)出現(xiàn) 48001 的錯(cuò)誤,并提示 API 未授權(quán),目前不知道哪些小程序可以使用這個(gè)接口驗(yàn)證指紋信息。
有興趣的同學(xué)可以自行嘗試,并將結(jié)果告訴我們。
我們也希望微信官方可以繼續(xù)完善這個(gè)接口(和文檔),讓開發(fā)者更方便地利用指紋接口,開發(fā)出具有高安全性和體驗(yàn)良好的小程序。