关于小程序微信授权登录提示41003
文章简介
之前做项目的时候遇到微信授权登录偶现的41003问题,也是排查了好久才找到原因,在这边做下记录,也做下分享。
原因一(iv和encryptedData转码问题)
因为微信小程序提供的特定授权按钮 button open-type=“getPhoneNumber”,获得的iv和encryptedData,会含有 "+ ?"特殊符号,所以前端这边传输的时候需要使用encodeURIComponent 函数进行 urlencode,后端接收urldecode,
例如:
// An highlighted block
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: code
}
试了一下全部转码了,结果没啥卵用,还是没有解决 偶现的41003问题,重新排查,排查终于排查到了第二个原因。
原因二(wx.login()获取code顺序问题)
本来的的代码是这样,例:
// An highlighted block
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信一键登录,领取名片</button>
// An highlighted block
getPhoneNumber: function(e) {
uni.login({
success: function(loginRes) {
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: loginRes.code
}
wx.request({
data: param,
success:function() {
})
}
})
}
经过尝试发现wx.login()里code的获取是不能放在 button* *open-type="getPhoneNumber"的回调函数里面的,code应该是需要提前获取了,例:
// An highlighted block
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">微信一键登录,领取名片</button>
// An highlighted block
// 每次已进入页面就请求code,存放本地,过了有效期五分钟,重新请求code
onShow() {
wxlogin()
// 微信登录code有效期 五分钟
this.globalTimer = setInterval(() => {
wxlogin()
}, 299990)
}
// 请求code方法
wxlogin = function() {
uni.login({
success: function(loginRes) {
uni.setStorageSync('code', loginRes.code);
}
})
}
// *button** ==*open-type="getPhoneNumber"回调
getPhoneNumber: function(e) {
let param = {
encryptedData: encodeURIComponent(e.detail.encryptedData),
iv: encodeURIComponent(e.detail.iv),
code: uni.getStorageSync('code');
}
wx.request({
data: param,
success:function() {
})
}
// 离开页面 清除定时器
onHide() {
if (this.globalTimer) {
clearInterval(this.globalTimer)
}
},
改成这种提前获取code然后再传入getPhoneNumber的回调函数使用仪器传给后端发现 偶现的==41003== 问题就解决了。
结尾
分享了我的项目经历,希望对大家有帮助。如果觉得有用可以赏杯咖啡