关于getPhoneNumber(OBJECT)的解码问题
发布于 6 年前 作者 fhou 7208 次浏览 来自 问答

请问下wx.getUserInfo(OBJECT)和getPhoneNumber(OBJECT)的解码是一样的吗?为什么我原来的代码wx.getUserInfo(OBJECT)用示例代码可以解出来,但是getPhoneNumber(OBJECT)解码的时候始终都是

error code<li>-41003: aes 解密失败</li>???

想请问一下我是哪里出错了?


正常解出来的,用一样的代码一样的解密函数,导入一样的参数,但是就是出错

求指教~谢谢~~~~

10 回复

你好,session未过期情况下login会刷新登录态,导致sessionKey发生变化。稳妥的方案是在用户点击后,先checkSession,如果未过期,不login,服务器可以用之前的sessionKey解密。如果session过期,再重新login,可以使用新的sessionKey解密。

@易装客装修顾问 

是的,在bindgetphonenumber 前先重新生成一个code,然后提交服务器时用这个code

虽然土了点:) 但总比不行强。       

@晨

您好,

我觉得这个不是重点啊,获取phone的频率很低,无非就是多刷几次sessionkey,也不至于把把都获取不到phonenumber

@易装客装修顾问           

哦,不好意思,看错了

我的是41003,解密失败

如果你是41001的话,那你查一下你获取session_key的方法吧

@晨

这个解释大概明白了,但这样逻辑也有问题

如果先获取到加密信息后,登录正好过期了,那岂不是也拿不到正确的sessionkey?

如果加密的时候登录已经过期,这是会生成新的sessionKey,之后login会延续这个sessionKey。除非是加密之后,login之前登录过期,但一般这个时间间隔很短,发生几率很低。

如果在获取到加密信息后调用login,如果此时登录未过期,sessionKey会刷新,开发者使用code获取到的sessionKey和加密用的sessionKey就不是同一个了。

手机号码这个可能也会有另一个问题,对某些解密算法库的实现支持有问题,刚刚定位到,我们会尽快修复。

@晨

__
__

明白了,谢谢耐心解释,刚才测试也成功了。

也就是说,bindgetphonenumber的时候是用现有的key进行加密的,如果过期就用新的key加密。

如果提交服务器前再wx.login会产生新的key而解不出来。

那么问题来了。。。哎!

很多人都不储存 code 或者sessionkey 在用户端或服务器上,因为wx.XXXX,的接口都是异步的,判断起来有点麻烦,所以都是现用现wx.login(), 反正频率也不会搞,我们保持用户连接的key是自己生成的key,不用wx.login。

而过去的getUserInfo, getWeRunData,还有群ID的那个就是用接口,都可以先wx.login(), 成功后再 wx.XXXXX

只有这个是先加密好了, 这个就有点麻烦了,需要改不少地方。

我不知道在<button /> 上 加个bindtap=“login” ,能否先在 bindgetphonenumber 重新生成 code,这样就不需要改很多地方。

我的也通了,其实也简单。就是用存在自己数据库里的sessionkey来解就OK了。这样就要求在调用个体phone number之前就保证sessionkey是最新的就行了。要么就在上一页进行检测或在本页的onload里完成检测和刷新。

@stephen 

解密文档中有下列说明

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。

  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。

  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。

  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

Base64_Decode(iv)在哪里要用这个函数处理,我之前解密用户数据都没用到这个函数啊.而且现在解密用户数据也正常.

你知道这个函数要用在哪里吗

回到顶部