收藏
回答

code 和 iv与encryptedData是否需要撇皮

问题模块 框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
API和组件 小程序 Bug wx.login getUserInfo 客户端 iOS 6.7.0 2.0.9

场景:据后台描述,wx.login取得的code要去换取session_key,来解密encryptedData,但是偶发解密不出来的情况,

问题: 现在必须要用button的open-type,所以必然是会出现先调用getUserInfo再调用wx.login的情况,所以code与iv和encryptedData到底是否需要匹配,即是否必须要先调用wx.login取得code保存起来再等到getUserInfo按钮点击.希望能给出一个解决方案



最后一次编辑于  2018-06-28  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

1 个回答

  • gb
    gb
    2018-06-28

    wx.login和getUserInfo没有必然联系。


    wx.login是根据获取code来换取用户的open id等信息,不包含user info。


    而要获取user info,腾讯现在已经修改接口,必须用button的方式

    wx.getUserInfo(OBJECT)

    注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作


    2018-06-28
    赞同
    回复 6
    • orz~
      orz~
      2018-06-28

      button这个问题就不要强调了,那解密的时候后台获得的session_key是要用来解密encryptedData的,sessition_key是用code去换的,如果没有联系的话要怎么解密,还是说sessiton_key只是一个特殊处理过的数据相同的数据

      2018-06-28
      回复
    • gb
      gb
      2018-06-28回复orz~

      没错,是先要调用wx.login,你解密不出来是你代码有问题。

      2018-06-28
      回复
    • gb
      gb
      2018-06-28
      /**
       * error code 说明.
       * <ul>
       
       *    <li>-41001: encodingAesKey 非法</li>
       *    <li>-41003: aes 解密失败</li>
       *    <li>-41004: 解密后得到的buffer非法</li>
       *    <li>-41005: base64加密失败</li>
       *    <li>-41016: base64解密失败</li>
       * </ul>
       */
      class ErrorCode
      {
          public static $OK = 0;
          public static $IllegalAesKey = -41001;
          public static $IllegalIv = -41002;
          public static $IllegalBuffer = -41003;
          public static $DecodeBase64Error = -41004;
      }
       
       
       
      /**
       * 对微信小程序用户加密数据的解密示例代码.
       *
       * @copyright Copyright (c) 1998-2014 Tencent Inc.
       */
       
       
       
      class WXBizDataCrypt
      {
          private $appid;
          private $sessionKey;
       
          /**
           * 构造函数
           * @param $sessionKey string 用户在小程序登录后获取的会话密钥
           * @param $appid string 小程序的appid
           */
          public function __construct( $appid, $sessionKey)
          {
              $this->sessionKey = $sessionKey;
              $this->appid = $appid;
          }
       
       
          /**
           * 检验数据的真实性,并且获取解密后的明文.
           * @param $encryptedData string 加密的用户数据
           * @param $iv string 与用户数据一同返回的初始向量
           * @param $data string 解密后的原文
           *
           * @return int 成功0,失败返回对应的错误码
           */
          public function decryptData( $encryptedData, $iv, &$data )
          {
              if (strlen($this->sessionKey) != 24) {
                  return ErrorCode::$IllegalAesKey;
              }
              $aesKey=base64_decode($this->sessionKey);
       
               
              if (strlen($iv) != 24) {
                  return ErrorCode::$IllegalIv;
              }
              $aesIV=base64_decode($iv);
       
              $aesCipher=base64_decode($encryptedData);
       
              $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
       
              $dataObj=json_decode( $result );
              if( $dataObj  == NULL )
              {
                  return ErrorCode::$IllegalBuffer;
              }
              if( $dataObj->watermark->appid != $this->appid )
              {
                  return ErrorCode::$IllegalBuffer;
              }
              $data = $result;
              return ErrorCode::$OK;
          }
       
      }


      2018-06-28
      回复
    • orz~
      orz~
      2018-06-28回复gb

      我们这边解密是没有问题的,那个,不知道你是不是做小程序前端的啊,你是怎么维护小程序的登录态的呢,方便的话可以给个联系方式么

      2018-06-28
      回复
    • gb
      gb
      2018-06-29回复orz~

      你可以参考腾讯官方出的一个项目。

      https://github.com/tencentyun/wafer-client-demo/tree/master/vendor/qcloud-weapp-client-sdk


      在需要登录状态的时候,只要设置request的属性login:true即可

      2018-06-29
      回复
    查看更多(1)