收藏
回答

关于getPhoneNumber(OBJECT)的解码问题

问题模块
API和组件

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

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

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


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


求指教~~~~~谢谢~~~~~~~~

最后一次编辑于  2017-08-25  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

17 个回答

  • stephen
    stephen
    2017-08-25

    @易装客装修顾问 


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

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

    2017-08-25
    赞同
    回复
  • focus
    focus
    2017-08-25

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

    2017-08-25
    赞同
    回复
  • stephen
    stephen
    2017-08-25

    @晨


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


    也就是说,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,这样就不需要改很多地方。

    2017-08-25
    赞同
    回复
  • 晨
    2017-08-25

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

    2017-08-25
    赞同
    回复
  • stephen
    stephen
    2017-08-25

    @晨

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


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

    2017-08-25
    赞同
    回复
  • 晨
    2017-08-25

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


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

    2017-08-25
    赞同
    回复
  • stephen
    stephen
    2017-08-25

    @晨


    您好,


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

    2017-08-25
    赞同
    回复
  • 晨
    2017-08-25

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


    2017-08-25
    赞同
    回复 1
    • Deron
      Deron
      2018-08-21

      怎么判断之前的sessionKey是当前这个用户的呢?

      2018-08-21
      回复
  • stephen
    stephen
    2017-08-25

    @易装客装修顾问           


    哦,不好意思,看错了


    我的是41003,解密失败

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

    2017-08-25
    赞同
    回复
  • focus
    focus
    2017-08-25

    @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)在哪里要用这个函数处理,我之前解密用户数据都没用到这个函数啊.而且现在解密用户数据也正常.

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


    2017-08-25
    赞同
    回复

正在加载...