⼩程序授权登录及解密unionId出错的⽅法
注:没有在开放平台做开发者资质认证的就不要浪费时间了,没认证⽆法获取unionId,认证费⽤300元/年,授权登录流程
第⼀步:wx.login获取⽤户临时登录凭证code
第⼆步:wx.getUserInfo获取加密过的数据encryptedData和解密参数iv
第三步:把步骤⼀、⼆中的code、encryptedData、iv传到开发者⾃⼰服务端
第三步:服务端获取到code、encryptedData、iv之后⽤get⽅法请求如下接⼝
appid:⼩程序appid
secret:⼩程序密钥
js_code:第⼀步获取的临时登录凭证code
grant_type:'authorization_code'
接⼝会返回 openid, session_key,注意:⽤户已经授权过的平台还会返回unionId,如果你只是需要unionId,则到此为⽌官⽅⽂档说法如图:
没有授权过则⽤encryptedData、session_key、iv、appid、secret进⾏解密,官⽅多语⾔解密⽰例下载链接:
包含c++ php python nodephp实例代码解密
第四步:仿照⽰例解密后获得unionId,想做什么就做什么了~
以下是授权登录前端代码:
authLogin () {
wx.login({
success: loginRes => {
let code = de // 获取⽤户临时code
success: function (res) {
let encryptedData = ptedData // 获取加密数据
let iv = res.iv // 解密参数
// 发送解密必要数据到服务端
url: 'localhost',
methods: 'POST',
data: {
code: code,
encryptedData: encryptedData,
iv: iv
},
succeess: res => {
// 服务端⾸先调⽤接⼝获取session_key
// ⽤户已经授权过的平台会直接返回unionId
// 没有授权过则⽤session_key进⾏解密
// 解密成功后服务端根据逻辑返回⾃定义信息
}
})
}
})
}
})
}
以上步骤可⾏,但是调整了⽤户授权⽅式
新的授权需⽤button组件调⽤getUserInfo,所以在这之前⽆法调⽤wx.login,但是如果先调⽤获取⽤户信息再调⽤wx.login的话,解密过程会出错,猜测code对应的session_key和之前getUserInfo获取的encryptedData不匹配
解决办法:
在页⾯的onLoad⽣命周期⾥调⽤wx.login,获取的code存⼊data以备需要的时候使⽤,但是code失效时间为5分钟,如果⽤户停留页⾯时间过长后点击授权登录,此时的code已经过期了,所以,获取code的函数应该每4分钟左右调⽤⼀次
wxml按钮授权:
<button open-type='getUserInfo' bindgetuserinfo="authLogin">登录</button>
js:
// 获取code
onLoad: function (options) {
},
getCodeTimer () {
wx.login({
success: res => {
de = de
setTimeout(() => {
}, 4 * 60 * 1000)
}
})
},
// 授权登录
authLogin(event) {
if (Msg == 'getUserInfo:ok') {
wx.showLoading()
let reqData = {
code: de,
encryptedData: ptedData,
iv: event.detail.iv
}
url: 'localhost:8080',
methods: 'POST',
data: reqData,
success: (res) => {
console.log(res)
// 请求完成
}
})
} else {
console.log('⽤户拒绝授权')
}
}
授权逻辑修改后实测没有出过错
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。