收藏
回答

php版获取unionid,有时候解密失败

环境:php5.5.7

问题: 有时候获取unionid失败,检查是openssl_decrypt解密后的数据为空

场景:假如我有一段时间没有操作微信开发者工具,第一次就会解密失败,后续都会成功

public function decryptUser($sessionKey, $encryptData, $iv)
{
   $errorCode = [
       0=>'ok',
       41001=>'encodingAesKey 非法',
       41002=>'IllegalIv',
       41003=>' aes 解密失败',
       41004=>'解密后得到的buffer非法',
       41005=>'base64解密失败',
       41016=>'base64解密失败',
   ];
   if (mb_strlen($sessionKey) !== 24) {
       throw new \Exception($errorCode[41001], 41001);
   }
   if (mb_strlen($iv) !== 24) {
       throw new \Exception($errorCode[41002], 41002);
   }
   $aesKey = base64_decode($sessionKey);
   $aesIv = base64_decode($iv);
   $aesCipher = base64_decode($encryptData);
   $result = openssl_decrypt($aesCipher, 'AES-128-CBC', $aesKey, 1, $aesIv);
   var_dump($result);
   $decodeResult = json_decode($result,true);
   var_dump($decodeResult);
   if (empty($decodeResult)) {
       throw new \Exception($errorCode[41003], 41003);
   }
   if ($decodeResult['watermark']['appid'] !== $this->appid) {
       throw new \Exception($errorCode[41003], 41003);
   }
   return $decodeResult;
}


最后一次编辑于  2018-07-25
回答关注问题邀请回答
收藏

10 个回答

  • 清风醉
    清风醉
    2019-05-16

    也遇到这个情况了,楼主怎么解决的?求分享

    2019-05-16
    有用
    回复
  • 碎、
    碎、
    2018-10-23

    我用java写的   第一次也会失败,然后用同样的session_key再次解密就会成功,为什么?

    2018-10-23
    有用
    回复
  • 2018-09-10

    你好, 请问楼主返回-41002的问题是怎么造成的呢 , 有解决方法了吗

    2018-09-10
    有用
    回复
  • Break
    Break
    2018-08-20

    这个问题没人解决么?

    2018-08-20
    有用
    回复
  • 刘大力
    刘大力
    2018-08-18

    同样遇到这个坑,不同小程序,一样的代码,一个解密正常获取到手机号,另外一个就一直41001.

    2018-08-18
    有用
    回复
  • 郭郭哒
    郭郭哒
    2018-08-09

    你好,请问你那个openssl_decrypt结果为空的问题是怎么解决掉的呢,我现在从始至终都是获取到的数据为空。。麻烦指教一下好不呀T——T

    2018-08-09
    有用
    回复 6
    • Tumi
      Tumi
      2018-08-09

      你检测一下 code,session_key ,etc 那些数据是不是有。


      获取unionid的前提是开open.wechat.qq.com

      参考文档https://developers.weixin.qq.com/miniprogram/dev/api/unionID.html

      2018-08-09
      回复
    • 郭郭哒
      郭郭哒
      2018-08-09回复Tumi

      你好,我这些参数检查过了,都是有的,只是base64_decode之后都是乱码,然后就采用openssl_decrypt,结果就是为空,我试过了aes类方法,也是空值,真的很奇怪啊。

      2018-08-09
      回复
    • Tumi
      Tumi
      2018-08-09回复郭郭哒

      base64_decode之后就是乱码。你公众号和小程序都在open.wechat.qq.com里面绑定了?

      2018-08-09
      回复
    • 郭郭哒
      郭郭哒
      2018-08-10回复Tumi

      我没有绑定,不是说没有绑定不可以获取到unionID,但并不影响解密用户的信息嘛,我现在一直都是结果为空~~T——T

      2018-08-10
      回复
    • 郭郭哒
      郭郭哒
      2018-08-14回复Tumi

      你好,我现在遇到了你的这个首次解密失败的问题,请问你是怎么处理的呢?Y——Y

      2018-08-14
      回复
    查看更多(1)
  • 锦卓
    锦卓
    2018-08-09

    解密需要session_key,

    session_key需要code,

    你检查下session_key与code,

    都没问题的话就能解密了

    2018-08-09
    有用
    回复 3
    • Tumi
      Tumi
      2018-08-09

      嗯,但是隔一段时间的第一次获取的为空

      2018-08-09
      回复
    • 锦卓
      锦卓
      2018-08-09回复Tumi

      我觉得那是因为session_key过期了,你可以做个方法,如果过期了就重新获取session_key

      2018-08-09
      回复
    • Tumi
      Tumi
      2018-08-09回复锦卓

      也不是吧。每次的session_key都是新的

      2018-08-09
      回复
  • 晴天
    晴天
    2018-07-26

    好像 不能 直接获取  包括解密 也一样的,只有关注小程序的公众号 才能获取到

    2018-07-26
    有用
    回复 1
    • Tumi
      Tumi
      2018-07-27

      关注公众号 就可以jscode2session直接获取,没关注公众号就要解密

      2018-07-27
      回复
  • 2018-07-26

    应该是登录状态的关系,前面的已经失效或者还没有生效。再来一次就好了,我经常碰到这个,不知道算不算bug

    2018-07-26
    有用
    回复 1
    • Tumi
      Tumi
      2018-07-27

      我也不清楚,第一次肯定失效。。

      2018-07-27
      回复
  • 祺爸💎
    祺爸💎
    2018-07-25

    现在获取unionid好像不需要进行到解密这一步

    https://api.weixin.qq.com/sns/jscode2session

    这个接口就可以直接返回unionid

    2018-07-25
    有用
    回复 9
    • Tumi
      Tumi
      2018-07-25

      假如用户关注了与小程序关联的公众号这个可以直接获取到uninoid,不然就要解密。

      2018-07-25
      回复
    • 祺爸💎
      祺爸💎
      2018-07-25回复Tumi

      坑啊

      2018-07-25
      回复
    • Tumi
      Tumi
      2018-07-25回复祺爸💎

      是的 啊。(v.v)

      2018-07-25
      回复
    • 祺爸💎
      祺爸💎
      2018-07-25回复Tumi

      我刚才试了一下,我这边取关公众号之后,仍然是可以拿到unionid的

      2018-07-25
      回复
    • 祺爸💎
      祺爸💎
      2018-07-25回复Tumi

      看了一下文档,还是需要授权的,大概我以前授权过,所以就算取关了,也一样有unionid

      2018-07-25
      回复
    查看更多(4)
登录 后发表内容