本文以抖音小程序(微信小程序获取流程和接口一模一样)为例,最近博主在做一个抖音小程序的小项目,前端在获取用户手机号的时候,需要调用 ttlogin 接口进行登录,登录后返回一个code,这个code有3分钟的失效时间,根据这个code可以获取到sessionKey,这个sessionKey类似于对称加密的密钥,会对用户信息进行加密。在获取用户信息的时候,前端
需要将 <button> 组件 open-type 的值设置为 getPhoneNumber。用户点击后会d出一个授权d窗让用户确认(若该用户账户未绑定手机号码会执行一次绑定手机号码的流程;授权d窗每次使用都会d出)。 用户同意后,开发者可以通过 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将会获取失败,因此解密也会失败。
因为无法判断用户什么时候开始获取用户信息,所以用户一进入页面,前端就会调用 ttlogin 接口进行登录,然后放到localstorage缓存中,在用户点击按钮时,d出授权框用户确认后获取到用户信息的加密数据,然后前端将缓存的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对称加密
后端后idea。
微信小程序通过wxloginAPI进行登录获取code。由于AppID和AppSecret不能泄露给用户,根据code获取openid需要在服务端完成,所以需要将code发送给服务端,服务端通过code和appid、APPSecret获取到openid和SessionKey。
服务端需要返回自定义登录态给前端,不能返回SessionKey,前端保存自定义登录态,获取用户信息时携带自定义登录态给后端。
通过wxgetUserInfo获取用户的openId 和unionId,需要对接口返回的加密数据( encryptedData )进行对称解密。
/
功能描述: <br>
〈功能详细描述〉
@paramargs
@see[相关类/方法](可选)
@since[产品/模块版本](可选)
/
publicstaticvoidmain(String[] args){
String encryptedData ="";
String sessionKey ="";
String iv ="9btKSYjvtGMGpknPpjS2Ag==";
JSONObject jsonObject = getUserInfo(encryptedData, sessionKey, iv);
Systemoutprintln(jsonObjectgetString("unionId"));
Systemoutprintln(jsonObjecttoJSONString());
}
结果运行报错:
javaxcryptoBadPaddingException: pad block corrupted
at orgbouncycastlejcajceprovidersymmetricutilBaseBlockCipher$BufferedGenericBlockCipherdoFinal(Unknown Source)
at orgbouncycastlejcajceprovidersymmetricutilBaseBlockCipherengineDoFinal(Unknown Source)
at javaxcryptoCipherdoFinal(Cipherjava:2087)
at comsaicebizserviceutilAESUtilsgetUserInfo(AESUtilsjava:62)
at comsaicebizserviceutilAESUtilsmain(AESUtilsjava:86)
Exception in thread"main"javalangNullPointerException
at comsaicebizserviceutilAESUtilsmain(AESUtilsjava:87)
查询原因,有可能是我的wxlogin在wxgetUserInfo之后调的原因,细究一下
我们通过wxlogin获得用户授权码code,接下来我们用code以及appid和appSecret请求微信
>
微信小程序的登陆一般都是写在appjs当中,具体流程如下
1、用户通过login()方法获取code,然后把code传给开发后台,后台通过code 以及appid以及密钥获取openid和sessionkey 进行登陆,然后返回一个token给前端
2、前端拿到token之后存储到globalData里的变量当中,这样其他页面就是可以同过var app=getapp();appglobalData调用token,但是全局变量会随之小程序关闭,就会清除变量,所以我们要将token存到缓存当中,
① 在onLaunch中token的具体流程是
以上就是关于微信小程序(抖音小程序):手机号码解析失败解决方案全部的内容,包括:微信小程序(抖音小程序):手机号码解析失败解决方案、微信小程序后端用hubild还是idea、微信小程序解密报错:pad block corrupted 解决方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)