微信小程序(抖音小程序):手机号码解析失败解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序(抖音小程序):手机号码解析失败解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 本文以抖音小程序(微信小程序获取流程和接口一模一样)为例,最近博主在做一个抖音小程序的小项目,前端在获取用户手机号的时候,需要调用 tt.login 接口进行登录,登录后返回一个code,这个code有3分钟的失效时间,根据这个code可以获取到sessionKey,这个sessionKey类似于对称加密的密钥,会对用户信息进行加密。在获取用户信息的时候,前端
需要将 <button> 组件 open-type 的值设置为 getPhoneNumber。用户点击后会弹出一个授权弹窗让用户确认(若该用户账户未绑定手机号码会执行一次绑定手机号码的流程;授权弹窗每次使用都会弹出)。 用户同意后,开发者可以通过 bindgetphonenumber 事件回调获取到一个加密数据,开发者可以把该数据传回到自己的服务端进行解密获取手机号。

获取到的加密数据需要使用sessionKey进行解密,因此在获取用户信息前,需要登录一次,获取到code,然后根据code获取到sessionKey,再根据sessionKey进行加密数据的解密,解析出手机号。

根据博主猜测,抖音在登录后会生成一个code,和一个对应的sessionKey,在会话期间(session未过期)的时候获取用户信息,会将用户信息使用sessionKey进行数据的加密,进行数据的解密也需要使用到sessionKey。code和sessionKey是对应的,但是它们的失效期是不一样的,code的失效期是3分钟,sessionKey的失效时间是不定的,只要用户活跃在页面上都不会失效。在获取到code的3分钟内调用 code-2-session 接口,会获取到sessionKey,如果3分钟后根据code获取sessionKey将会获取失败,因此解密也会失败。

因为无法判断用户什么时候开始获取用户信息,所以用户一进入页面,前端就会调用 tt.login 接口进行登录,然后放到localstorage缓存中,在用户点击按钮时,弹出授权框用户确认后获取到用户信息的加密数据,然后前端将缓存的code和加密数据一并传给后端。后端用code先去调用 code-2-session 接口获取到sessionKey,然后以sessionKey为密钥进行AES解密,获取到手机号返回给前台。整个流程看起来没什么问题,但是一旦用户在页面停留时间超过3分钟,然后再去获取用户信息会失败,主要是因为code已经失效,获取sessionKey会失败。

目前的问题就是过了code的有效期后,根据code获取sessionKey失败。那么在前端login获取到code后,先缓存到本地,然后立即调用后台接口去获取sessionKey然后缓存到redis里面,key为code,value为sessionKey。失效时间根据自己的业务设置(小程序页面用户不会停留太久,因此缓存失效时间设置为30分钟),用户退出小程序后,会重新login,然后也会存一份新的code和sessionKey的对应值。

用户在授权到用户信息后,前端直接将缓存的code和加密后的用户信息上传到服务到进行解密。服务端根据code从缓存中先获取到sessionKey,然后再用sessionKey进行解密,解析出手机号进行返回。

以上解决办法每次基本都可以获取手机号成功,但是也会存在一些问题

UserInfoController主要提供两个接口,一个是解密手机号和code2seesion操作

TiktokEncryptedParam 主要是前端传过来的code和加密后的数据

TiktokUserInfoSPI 主要是对接口的封装

TiktokUserInfoSPIAdapter 实现接口

使用AES对称加密

微信小程序手机号码解析失败解决方法

场景

在小程序开发中,获取用户信息、获取手机号是最常用到的功能。

但是有时可能会遇到“手机号解析失败”的问题,这个时候我们检查下代码是否是在获取手机号的回调中才调用的 wx.login 的方法。

官方文档说明如下:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html#%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B

解决方法

所有解决办法是提前调 wx.login,在获取手机号的回调方法中取检验登录状态,代码如下:

onLoad: function (options) {
    wx.login({
      success: res => {
        that.setData({
          code: res.code
        })
      }
    })//先登录在获取手机号
  },
  getPhoneNumber(e) {
    let encryptedData = e.detail.encryptedData
    let iv = e.detail.iv
    wx.checkSession({
      success() {
        //session_key 未过期,并且在本生命周期一直有效
      },
      fail() {
        // session_key 已经失效,需要重新执行登录流程
        wx.login({
          success: res => {
            code = res.code
            that.setData({
              code: code
            })
          }
        })
      },
      complete() {
        //将code,encryptedData,iv传给后台进行解密
      }
    })
  }

以上是关于微信小程序(抖音小程序):手机号码解析失败解决方案的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序模仿抖音,全屏播放且有流畅的动画

微信小程序手机号码解析失败解决方法

抖音小程序功能在哪里?

抖音小风车引流到微信

uniapp生成抖音小程序 问题记录

uniapp生成抖音小程序 问题记录