微信小程序(抖音小程序):手机号码解析失败解决方案_微信小程序解析手机号-程序员宅基地

技术标签: 微信小程序  vue.js  小程序  开发语言  visual studio  

        在小程序开发中,可能需要用户授权获取用户信息,而用户信息涉及到手机号等敏感数据,一般的小程序开发平台,会将数据进行加密,然后通过对称加密算法进行加密解密。在获取手机号的过程中由于流程的理解错误可能会出现解密手机号失败的问题。本文介绍一种比较适用的解决办法,希望给遇到坑的同学一个参考。

1 问题描述

        本文以抖音小程序(微信小程序获取流程和接口一模一样)为例,最近在做一个抖音小程序的小项目,前端在获取用户手机号的时候,需要调用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将会获取失败,因此解密也会失败。

1.1 初始实现

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

 

2 解决办法

2.1 缓存sessionKey

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

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



 

 

2.2 存在问题

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

  • 会存在很多冗余数据:因为缓存是根据code进行缓存的,无法根据用户唯一id进行缓存,如果用户多次进行登录,将会存储多份,因此需要根据自己的业务时间进行设置缓存失效时间
  • 实现更加复杂:因为后端还涉及到redis服务 以及加密解密的过程

3 附上源码

3.1 用户信息controller

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

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

 

3.2 抖音接口SPI

TiktokUserInfoSPI 主要是对接口的封装

 TiktokUserInfoSPIAdapter 实现接口

 

3.3 加密解密

使用AES对称加密

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q2243088760/article/details/129934131

智能推荐

BeautifulSoup库的使用-程序员宅基地

文章浏览阅读328次。1.简介BeautifulSoup库也是一个HTML/XML的解析器,其使用起来很简单,但是其实解析网站用xpath和re已经足矣,这个库其实很少用到。因为其占用内存资源还是比xpath更高。'''BeautifulSoup库和lxml一样,BeautifulSoup也是一个HTML/XML的解析器,主要的功能也是解析和提取HTML/XML数据。LXML只会局..._src="//vm.gtimg.cn/tencentvideo/txp/js/plugins/uiwindowfullscreen.e86410.js?

华为云计算之FusionStorage基础原理和特性_fusionstorage的原理-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏2次。华为云计算之FusionStorage基础原理和特性_fusionstorage的原理

osg中使用OpenGL绘制_osg::graphicscontext::traits-程序员宅基地

文章浏览阅读2k次。在osg开发的时候,想要绘制一些图形,但是在osg中也没有找到合适的方法(估计是我太菜了),然后就想到用OpenGL的方法进行绘制,尝试了一些,记录一下可以行的通的。绘制一条动态变化的直线class CreateRay : public osg::Geometry{public: CreateRay(osg::ref_ptr<osg::GraphicsContext> ..._osg::graphicscontext::traits

6.1 Python 单分支结构 if语句_学习if单分支语句-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏8次。第6章 程序流程控制6.1 单分支结构 if语句6.1.1 顺序结构控制流指的是控制程序的执行流程。Python控制流有三种结构:顺序结构、分支结构、循环结构。【体验代码】# 定义2个变量a = 10b = 20 # 计算2个变量的和sum = a + b# 输出和print(sum)【终端输出】30分析上述代码的执行顺序:第一句、第二句代码执行赋值;第三句代码计算2个变量的和;第四句执行打印语句。像这样从上到下一行一行执行的流程,就是控制流的中的顺序结构。_学习if单分支语句

8连接路径_path("keys")-程序员宅基地

文章浏览阅读927次。文章目录8.1检查8.1.1初步检查8.5建立连接路径8.5.1 sort_inner_and_outer生成连接路径时所使用的算法—动态规划和遗传,动态规划推进到join_ search_one_ level遗传算法推进到merge clump,物理优化的部分从这两个函数开始就进入到了建立连接路径的阶段 连接路径指的是物理连接路径,也就是通过这种路径来实现逻辑连接操作建..._path("keys")

基于模板匹配的数字识别_基于模板匹配的数字电表数字识别-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏35次。基于模板匹配的数字识别,将标准的8*16像素的数字0123456789读取,二值化,对每个数字进行等分区域分割,统计每个区域内的黑色像素点的个数,即为特征初值。采用欧式距离的模板匹配法。z//基于模板匹配的数字识别#include#include#include#include #includeusing namespace std; int main()_基于模板匹配的数字电表数字识别

随便推点

通过SecureCRT在开发板与电脑端传输文件_64位核心使用crt串口线烧写上传文件格式为-程序员宅基地

文章浏览阅读1.7k次。电脑上传文件到开发板:rz 命令开发板下载文件电脑端:sz +文件名_64位核心使用crt串口线烧写上传文件格式为

利用pdf2swf将PDF转换成SWF-程序员宅基地

文章浏览阅读1.8w次,点赞5次,收藏7次。将PDF转换成SWF可以使用SWFTools工具中的pdf2swf(http://www.swftools.org/),CSDN快速免积分下载地址XXX一个简单的将PDF文档转成SWF的用法:C:\SWFTools\pdf2swf example.pdf -o example.swf -f -T 91、首先下载安装,一直默认下一步即可。2、java代码import java.io.Buffered_pdf2swf

推荐开源项目:Microsoft DICOM Server-程序员宅基地

文章浏览阅读373次,点赞5次,收藏6次。推荐开源项目:Microsoft DICOM Server项目地址:https://gitcode.com/microsoft/dicom-server项目简介Microsoft DICOM Server 是一个由微软开发并维护的开源项目,它提供了一种高效、安全且可扩展的方式来处理DICOM(Digital Imaging and Communications in Medicine)医疗影...

解决微信小程序 picker 模式日期,设置默认当前时间_"picker mode=\"date"-程序员宅基地

文章浏览阅读6.9k次,点赞3次,收藏11次。wxml文件<picker mode="date" value="{{currentDate}}" start="2021-01-01" end="2021-12-31" bindchange="bindDateChange"> <view class="picker"> 日期选择: {{currentDate}} </view></picker>js文件const util = require('../../utils/util')_"picker mode=\"date"

区块链概述-程序员宅基地

文章浏览阅读1.9k次,点赞36次,收藏29次。对区块链的简介

使用Gitlab 搭建私有镜像仓库(外置Nginx)_docker gitlab 使用外部nginx-程序员宅基地

文章浏览阅读1.2k次。为了让团队尽快使用Gitlab的CI进行工作,必须做好Gitlab的初始化工作,大家都知道拉取镜像由于某些原因,会比较慢,因此构建自己的私有镜像仓库就成为了关键的一步。当然私有镜像仓库的搭建有很多种方式,这里直接使用Gitlab提供的镜像仓库功能。一揽子解决方案比较香。gitlab真的越来越好用了,有了这个镜像仓,也没必要再使用三方的镜像仓库了。Devops 真好用!_docker gitlab 使用外部nginx

推荐文章

热门文章

相关标签