問題產生原因:是由微信官方對接口進行升級引起的。
在之前我們在小程序獲取用戶信息是如下方式:
<van-button bind:getuserinfo="getUserInfo" open-type="getUserInfo" plain round block size="small" type="primary" > 點擊這里登錄 </van-button>
注:bind:getuserinfo="getUserInfo" 中的getUserInfo是個響應事件,當然事件名可以隨便取的,不一定非是 getUserInfo 這個名字
open-type="getUserInfo" 則是微信小程序的一個開放能力,在按鈕上設置此屬性則會觸發 getuserinfo 事件。
下面則是事件的響應函數
async getUserInfo(e) { // 微信授權 let that = this let userInfo = e.detail.userInfo if (userInfo) { let login = () => { return new Promise(resolve => { wx.login({ success(res) { resolve(res) }, fail() { resolve() } }) }) } let getUserInfo = () => { return new Promise(resolve => { wx.getUserInfo({ success(res) { resolve(res) }, fail() { resolve() } }) }) } let res = await login() let res2 = await getUserInfo() showLoading('加載中') if (res && res.code && res2) { let { encryptedData, iv, rawData, signature } = res2 await that.userLoginFunc( res.code, encryptedData, iv, rawData, signature ) hideLoading() } } }
根據官方文檔
調整后,開發者如需獲取用戶身份標識符只需要調用wx.login接口即可。開發者若需要在界面中展示用戶的頭像昵稱信息,可以通過<open-data>組件進行渲染,該組件無需用戶確認,可以在界面中直接展示。在部分場景(如社交類小程序)中,開發者需要在獲取用戶的頭像昵稱信息,可調用wx.getUserProfile接口,開發者每次通過該接口均需用戶確認,請開發者妥善處理調用接口的時機,避免過度彈出彈窗騷擾用戶。
解決過程分析:
主要就是變化幾點,無需再用 open-type="getUserInfo" 了,wx.getUserInfo接口也不用了,改為調用 wx.getUserProfile接口 ,觸發的方式要改為事件:
<van-button bind:click="getUserProfile" plain round block size="{{ fullPage?'large':'small' }}" type="primary" > 點擊這里登錄 </van-button>
async getUserProfile(e){ let that = this let getuserinfo = new Promise((resolve, reject) => { wx.getUserProfile({ desc: '用於完善會員資料', success(res) { resolve(res) }, fail() { resolve() } }) }) let login = new Promise((resolve, reject) => { wx.login( { success(res) { resolve(res) }, fail() { resolve() } }) } ) //console.log("params=" + params ) let flag = true Promise.all([login, getuserinfo]).then(res=>{ console.log('所有操作完成---',res) let code = "" //let params = { encryptedData:'', iv:'', rawData:'', signature:'' } if(res[0] && res[0].code ) { code = res[0].code }else{ falg = false } if(res[1]){ console.log( "-----oooo----------") //console.log("signature:" + params.signature) }else{ falg = false } showLoading('加載中') //console.log("") if (flag) { let { encryptedData, iv, rawData, signature } = res[1] //調用后端接口 that.userLoginFunc( code, encryptedData, iv, rawData, signature ) hideLoading() } }).catch((error) => { console.log(error) }) }
上面的代碼在一次請求中以promise方式調了兩個微信口 wx.getUserProfile 和 wx.login ,
但這在小程序中是不允許的,所以需要以Promise.all的方式去調用 ,Promise.all可以接受一個promise數組作為參數,
當所有的子Promise都完成,該Promise完成,返回值是全部值的數組。如果有任何一個失敗,該Promise失敗。