网页手机号抓取程序(小程序手机号如何授权——过程与细节(sessionKey过期))
优采云 发布时间: 2021-11-01 09:06网页手机号抓取程序(小程序手机号如何授权——过程与细节(sessionKey过期))
如何授权小程序手机号-流程及详情(sessionKey过期,wx.checkSession())
一切都来自官方文件。
官方文档中按钮组件提供了获取手机号码的方法;--小程序打开文档
输入具体说明看:官方代码示例
获取手机号
getPhoneNumber:function(e){
var that = this;
if(wx.getStorageSync("session_key")){//先判断缓存中是否有session_key,
wx.checkSession({//检测session_key是否过期
success: function() {
console.log("未过期")
if(e.detail.errMsg=='getPhoneNumber:ok'){
console.log(e)
that.$http('xxxx解密手机号接口',{//将手机号授权返回的参数,传给后端,进行手机号解密
sessionKey:wx.getStorageSync('session_key'),
encryptedData:e.detail.encryptedData,
iv:e.detail.iv,
}).then(res=>{
if(res.code==20000){
console.log(res.data)//成功拿到用户手机号
}else{
}
})
}else{
}
},
fail: function () {//session_key过期,则需要微信登录接口wx.login(),来重新获取session_key
console.log("过期")
wx.login({
success(res) {
console.log('wxlogin',res);
if (res.code) {
// 服务器端接口--获取sessionKey
that.$http('xxx获取session_key接口',{//,那code换取session_key,和并存入缓存
code:res.code,
}).then(res=>{
if(res.code==20000){
wx.setStorageSync('session_key', res.data.session_key);
if(e.detail.errMsg=='getPhoneNumber:ok'){
console.log(e)
that.$http('xxxx解密手机号接口',{//将手机号授权返回的参数,传给后端,进行手机号解密
sessionKey:wx.getStorageSync('session_key'),
encryptedData:e.detail.encryptedData,
iv:e.detail.iv,
}).then(res=>{
if(res.code==20000){
console.log(res.data)//成功拿到手机号
}else{
}
})
}else{
}
}
})
} else {
console.log('失败!' + res.errMsg)
}
},
fail(res){
console.log('error',res);
}
})
}
})
}else{//如果缓存中没有session_key,直接按步骤,登录,拿session_key,进而获取手机号
wx.login({
success(res) {
console.log('wxlogin',res);
if (res.code) {
// 服务器端接口--获取sessionKey
that.$http('xxx获取session_key接口',{
code:res.code,
}).then(res=>{
if(res.code==20000){
wx.setStorageSync('session_key', res.data.session_key);
if(e.detail.errMsg=='getPhoneNumber:ok'){
console.log(e)
that.$http('xxxx解密手机号接口',{
sessionKey:wx.getStorageSync('session_key'),
encryptedData:e.detail.encryptedData,
iv:e.detail.iv,
}).then(res=>{
if(res.code==20000){
console.log(res.data)//成功拿到手机号
}else{
}
})
}else{
}
}
})
} else {
console.log('失败!' + res.errMsg)
}
},
fail(res){
console.log('error',res);
}
})
}
},
总结:正常按照官方文档看没什么大问题,但是要特别注意sessionKey是否过期。如果过期,就会发生解密失败。这也是有些同志在实际项目中遇到的原因。有时解密失败。
重点来了:关于wx.checkSession,微信社区报了一个bug,说调用wx.checkSession已经成功,然后实际调用手机号解密失败。. . . .
这种不更新可能意味着你在其他地方调用wx.login()中紧跟的接口后端处理时会更新sessionKey,但是你本地的sessionKey没有更新,可以查看,因为不能只用wx.login(),里面肯定有接口请求,看看;3、只看下图:
有的小伙伴可能认为我会在回调中调用wx.login()来获取最新的sessionKey,他们不怕过期吗?为什么!此时sessionKey是最新的,但是电话号码回调的加密内容先被触发,比你新生成的sessionKey要早。也就是说,加密后的 sessionKey 是当时还没有过期的旧 sessionKey。然后你会用最新的sessionKey再次解密,解密必然会失败。当然,如果像我上面代码中的那样,第一次调用的时候在回调中拿到sessionkey也是可以的)
补充:关于按钮样式问题,因为授权必须由按钮触发,但是不能使用直接复制的按钮样式,需要自己修改;
.login_btn{
width: 100rpx;
height: 44rpx;
padding: 0;
background-color: transparent;
border-radius: 22rpx;
border-color: #ffffff;
line-height: 40rpx;
font-size: 26rpx;
outline: none;
color: #ffffff;
margin: 0;
margin-bottom: 12rpx;
}
实际款式可随业务调整
此属性也可用作参考。