网络知识 娱乐 微信小程序:wx.login和getPhonenumber获取手机号解密失败问题

微信小程序:wx.login和getPhonenumber获取手机号解密失败问题

原来的登录处理流程:

通过按钮点击触发,在处理函数内调用wx.login()

发现每次登录,第一次都会解密失败,第二次就成功了。

<button open-type="getPhoneNumber" 
	bindgetphonenumber="getPhonenumber">登录</button>
async getPhonenumber(e){
   wx.login()
}

此时,是先点击的获取用户信息,再进行登录。
逻辑是不对的,因为获取手机号之后才进行的登录

第一次获取手机号,微信使用的是当前session_key对手机号信息进行加密,而我们的session_key还是空的,或者用户之前登录过,那么session_key就是上一次登录的状态。解密失败。

第二次获取手机号,我们通过上次登录,获取了最新的session_key,服务端也存了同样的一份session_key, 微信加密和我们服务器解密使用的是同一份数据。解密成功。

解决办法

知道了登录的问题所在,当用户授权之前,应该使得服务端session_key当前session_key保持一致。

// 该方法应该在进入页面的时候,或者getPhonenumber之前调用
login(){
   // 如果有session_id,可以检查一下是否过期
	wx.checkSession()
	// 过期就登录
	wx.login()
	// 将session状态同步至服务器
	// 登录成功后本地可以保存一份session_id
}

async getPhonenumber(e){
  // 获取手机号逻辑
}

解决方法二:

微信基础库 2.21.2 开始 提供了新的获取手机号接口,通过动态令牌code就能换取用户手机号信息,能避免使用session_key不一致的问题。

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html