接手的老代码中,授权用户信息和授权手机号之前每次都会调用wx.login 导致新用户第一次授权用户信息一定报错
之后后端打印日志发现报错pad block corrupted
,经过看网上的解决办法后发现是因为session_key
不正确导致的
解决思路:
1.在授权之前调用可以理解为一进页面或者一进入小程序就调用wx.login
2.通过wx.checkSession
判断当前session_key
是否过期,如果过期重新调用wx.login
以获取最新的session_key
,如果没有过期正常走授权逻辑即可
代码:
<template>
<view class="page">
// 具体代码根据需求来 仅展示
<button open-type="getUserInfo" @getuserinfo="wxGetUserInfo"
withCredentials="true">使用微信绑定手机号一键登录</button>
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">手机号授权</button>
</view>
</template>
data() {
return{
jsCode: null
}
},
onLoad() {
// 刚进入页面就获取code
this.getCode()
},
methods: {
async getCode(){
await uni.login({
provider: 'weixin',
success: ({code}) => {
this.jsCode = code
}
})
},
// 用户手机号授权加密数据
getPhoneNumber(res) {
this.getInfo(res)
},
// 微信 用户信息授权 加密数据
wxGetUserInfo(res) {
this.getInfo(res)
},
// 获取用户信息
getInfo(res){
// 判断session_key是否过期
wx.checkSession({
success: ()=> {
//session_key 未过期,并且在本生命周期一直有效
// 获取session_key存入本地
// 通过session_key拿到openid unionId
if(uni.getStorageSync('session_key')){
// 本地有session_key
// 解密数据
this.miniprogramMiniAuth({
encryptedData: res.detail.encryptedData,
iv: res.detail.iv,
unionid: uni.getStorageSync('unionId'),
openId: uni.getStorageSync('openId'),
sessionKey: uni.getStorageSync('session_key')
},res.detail)
}else{
// 本地没有session_key 重新获取
this.getSessionKey(res.detail)
}
},
fail: async ()=> {
// session_key 已经失效,需要重新获取code
await this.getCode()
this.getSessionKey(res.detail)
}
})
},
// 获取session_key
getSessionKey(detail){
// 通过后端接口 传入code获取unionId、openId、session_key存入本地
this.$request.post(API.miniprogramSessionKey, {
data:{jsCode: this.jsCode}
}).then(keyRes => {
if(keyRes.code == 0){
uni.setStorageSync('unionId', keyRes.data.unionid)
uni.setStorageSync('openId', keyRes.data.openId)
uni.setStorageSync('session_key', keyRes.data.sessionKey)
// 通过sessionKey获取信息
this.miniprogramMiniAuth({
encryptedData: detail.encryptedData,
iv: detail.iv,
unionid: keyRes.data.unionid,
openId: keyRes.data.openId,
sessionKey: keyRes.data.sessionKey
}, detail)
}else{
uni.showToast({
title:keyRes.message,
icon: 'none'
})
}
})
},
// 通过session_key获取用户信息
miniprogramMiniAuth(data, detail){
// 后端接口 解密用户数据
this.$request.post(API.miniprogramMiniAuth, {
data
}).then(authRes => {
if(authRes.code == 0){
uni.showToast({
title: '获取信息成功',
icon: "none"
})
}else{
uni.showToast({
title:authRes.message,
icon: 'none'
})
}
})
},
}