前言:
????????因?yàn)轫?xiàng)目也需要在微信小程序平臺發(fā)布,而且后面登錄注冊邏輯的調(diào)整花了很多時間,做一個記錄防止再踩坑。
????????在注冊時,希望可以拿到用戶的手機(jī)號碼、姓名及身份證號信息,為校驗(yàn)是本人需要調(diào)用微信的人臉識別。
1、獲取手機(jī)號碼
????????可以通過微信”getPhoneNumber”來獲取,文檔路徑
2、獲取用戶姓名、身份證號碼
????????微信沒有接口提供這方面的內(nèi)容,項(xiàng)目的設(shè)計(jì)是用戶自己輸入。對于輸入的身份證號需要添加合法校驗(yàn),用戶輸錯身份證號是很常見的事情。
3、校驗(yàn)輸入的證件信息是本人的信息
????????校驗(yàn)的方式是通過微信小程序的人臉識別,對應(yīng)的api是”wx.startFacialRecognitionVerify”,在使用該api之前,需要檢查當(dāng)前設(shè)備是否支持人臉識別,檢查對應(yīng)的api是”wx.checkIsSupportFacialRecognition”,api文檔路徑。
????????“wx.checkIsSupportFacialRecognition”傳遞用戶姓名和身份證有兩種方式,使用傳遞”userIdKey”的方式會得到后臺api返回的用戶信息,最好不要使用傳”userIdKey”的方式校驗(yàn)輸入用戶信息,不然會出現(xiàn)校驗(yàn)的時候校驗(yàn)頁面顯示的是李四的名字,但輸入的用戶姓名是張三。
登錄邏輯:
????????使用”wx.login”獲取一個code,將這個code通過后端接口”verifyingUserStatus”傳給后端,后端再將用戶的狀態(tài)返回,用戶狀態(tài)為未登錄,跳轉(zhuǎn)獲取手機(jī)號碼頁面;用戶狀態(tài)為信息未綁定進(jìn)入輸入身份證信息頁面;正常狀態(tài)進(jìn)入小程序首頁。”wx.login”文檔路徑。
請求用戶狀態(tài)限制:
????????對于大部分接口都需要用戶是登錄狀態(tài),與后端協(xié)商好,某些請求的狀態(tài)碼statusCodes是用戶狀態(tài)有問題,在這些狀態(tài)碼下將跳轉(zhuǎn)到獲取手機(jī)號碼的頁面或用戶信息綁定頁面,因?yàn)閷ⅰ皏erifyingUserStatus”放在這個頁面的onLoad調(diào)用,屬于登錄過期的用戶,會先進(jìn)入獲取手機(jī)號碼的頁面,過一會兒就進(jìn)入小程序首頁,產(chǎn)品覺得這種體驗(yàn)不好,既然可以自動登錄,就不要讓用戶看到獲取手機(jī)號碼的頁面,不然用戶還會以為自己需要去綁定手機(jī)號碼。
????????后面將用戶狀態(tài)判斷抽離成一個方法checkUser,方法里面含有“verifyingUserStatus”請求的調(diào)用,當(dāng)請求狀態(tài)碼返回的是statusCodes時,調(diào)用這個方法判斷是否需要進(jìn)入獲取手機(jī)號碼頁面或用戶信息綁定。由于請求返回的狀態(tài)碼是統(tǒng)一處理,“verifyingUserStatus”也有返回statusCodes的情況,導(dǎo)致一直請求“verifyingUserStatus”這個接口。解決方式是將請求狀態(tài)碼的邏輯判斷排除“verifyingUserStatus”接口請求。
????????CheckUser方法里面有跳轉(zhuǎn)到獲取手機(jī)號頁面或綁定用戶信息界面,而在這兩個頁面我也會調(diào)用這個方法,由于我沒有做當(dāng)前頁判斷就導(dǎo)致了一直在跳轉(zhuǎn)這兩個頁面的情況。使用”getCurrentPages”可以獲取當(dāng)前頁面棧,其是一個數(shù)組,最后一個元素就是當(dāng)前頁面。通過判斷元素的route是否等于要跳轉(zhuǎn)的頁面路徑來控制頁面跳轉(zhuǎn)。getCurrentPages文檔路徑。
????????在人臉核驗(yàn)成功后,要進(jìn)入小程序的首頁。由于獲取手機(jī)號頁面和用戶信息綁定頁面都是在首頁的接口狀態(tài)碼為statusCodes后跳轉(zhuǎn)進(jìn)來的,就使用”wx.navigateBack“做頁面回退,使用” wx.navigateTo“跳轉(zhuǎn)的話,用戶滑動回退可能會再次進(jìn)入獲取手機(jī)號頁面和用戶信息綁定頁面。按道理說使用” wx.redirectTo”就比較合適了,但是由于首頁是tabbar頁面,而該api不需要跳轉(zhuǎn)到tabbar頁面。之前設(shè)置”wx.navigateBack“中的”delta”是一個具體的值,后面使用CheckUser后就不適用了,因?yàn)椴煌闆r進(jìn)入獲取手機(jī)號頁面和用戶信息綁定頁面到首頁的頁面棧長度不一樣,有的頁面就不能跳轉(zhuǎn)會首頁了。navigateBack文檔路徑,redirectTo文檔路徑,navigateTo文檔路徑。
????????對于這種情況,我先用”getCurrentPages”獲取頁面棧,遍歷頁面棧數(shù)組,判斷子元素的路徑是否是首頁,從而得到當(dāng)前頁到首頁的相隔數(shù),將”wx.navigateBack“中的”delta”的值設(shè)置為得到的相隔數(shù)。測試這個方法的時候發(fā)現(xiàn),由于首頁是tabbar頁面,當(dāng)是首頁的其他模塊(路徑與首頁不一致)時,使用”getCurrentPages”獲取頁面棧時,會有首頁的路徑不存入頁面棧的情況,就導(dǎo)致當(dāng)前頁與首頁的相隔數(shù)為0,頁面不會跳轉(zhuǎn)到首頁。后面將”wx.navigateBack“中的”delta”的值改為判斷相隔數(shù)是否為0,否”delta”的值為相隔數(shù),是”delta”的值為頁面棧數(shù)組的長度。
????????后來發(fā)現(xiàn)跳轉(zhuǎn)到為tabbar頁面的首頁不用那么麻煩,直接調(diào)用”wx.switchTab”就可以了。switchTab文檔路徑。