网页手机号抓取程序(小程序手机号如何授权——过程与细节(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;

}

  实际款式可随业务调整

  

  此属性也可用作参考。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线