收藏
回答

微信小程序登录,服务端解密有几率-41003


服务器是将unionId作为唯一id的,需要使用WXBizDataCrypt.decryptData将encryptedData解密出来。不过在调用WXBizDataCrypt.decryptData的时候总是又会30%的几率解密失败,返回errorCode -41003


服务器端语言:PHP (Laravel框架)


报错为:openssl_decrypt(): IV passed is only 15 bytes long…ects an IV of precisely 16 bytes, padding with \0

最后一次编辑于  2017-12-23
回答关注问题邀请回答
收藏

7 个回答

  • 雁来月三日
    雁来月三日
    2020-07-09

    我的解决方法是在使用 wx.login() 之后 再使用 wx.getUserInfo() 获取用户的加密数据,如下:

    function loginweixin(res{
      wx.login({
        success(result) => {
          wx.getUserInfo({
            success(o) => {
              fetch("xxx", {
                data: {
                  code: result.code,
                  encryptedData: o.encryptedData,
                  iv: o.iv,
                },
              }).then((x) => {});
            },
          });
        },
      });
    }
    
    2020-07-09
    有用 2
    回复 1
    • āáǎà
      āáǎà
      2020-09-07
      我也是这么解决的,有用,顶上去
      2020-09-07
      回复
  • 张建广-码农
    张建广-码农
    2020-07-03

    同样遇到这个问题,最后还是后端严格按照官方文档的流程设计登录解决的 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

    回想了一下,应该是session_key 和 encryptedData 不匹配造成的

    就是说前端获取的encryptedData和iv信息是之前的session_key所匹配的,而本次又发送了code重新获取了session_key

    建议后端完善一下接口流程

    2020-07-03
    有用
    回复
  • Abdu-Weli
    Abdu-Weli
    2020-03-10

    楼主怎么解决?

    2020-03-10
    有用
    回复
  • 2018-05-04

    楼主好,可以上一段代码吗?现在iv是通过<button>控件的open-data才能获取到,encodeURIComponent()方法是向服务端发送request前调用呢还是在服务端收到iv后再调用。

    2018-05-04
    有用
    回复 4
    • 枫儿
      枫儿
      2018-06-01

      现在小程序官方已经改成了<button>控件的open-data,那么我现在大概流程就是,用户点击button -> 绑定用户事件里拿到 iv和encryptedData -> 调用wx.login拿到code,然后将三个参数都encodeURIComponent后网络请求发给服务器

      2018-06-01
      回复
    • 刘小军Lebus
      刘小军Lebus
      2018-07-08

      你好。

      我用encodeURIComponent之后,‘==’被换成了%3D%3D,导致iv的长度不对,产生了41002的错误。

      我之前也是跟你差不多,有几率出现41003,怎么说呢,其实还是有规律41003的:第一次登陆都失败,第二次都成功,然后删除登录态之后立刻登陆又成功,但是过一段时间之后再登陆又41003了

      2018-07-08
      回复
    • 枫儿
      枫儿
      2018-08-05回复刘小军Lebus

      encodeURIComponent就是将字符串进行URLEncode编码,当然是转成如%3D%3D,服务器接收到后将其URLDecode解码还原为原字符串

      2018-08-05
      1
      回复
    • w~h
      w~h
      2019-12-10回复刘小军Lebus
      我和你的问题一样怎么解决的
      2019-12-10
      回复
  • Zoelov
    Zoelov
    2018-03-13

    怎么解决的?

    2018-03-13
    有用
    回复 2
    • 枫儿
      枫儿
      2018-08-30

      总的来说就两点

      1,小程序端 iv、decryptData  等包含特殊字符的字段发送服务器encodeURIComponent

      2,wx.login 获取 code,调用时间稍微提前调用会

      2018-08-30
      1
      回复
    • 枫儿
      枫儿
      2018-08-30

      2018-08-30
      3
      回复
  • 枫儿
    枫儿
    2017-12-23

    补充:每次小程序获取到iv的值中间有空格的,就会出错

    成功的iv例子:$iv = "MLbq\/WIGb1YHk8f0GWmzLA=="
    出错的iv例子:$iv = "shNiHyqyaVamI Fe\/YHUjw=="


    2017-12-23
    有用
    回复 1
    • 花落去
      花落去
      2021-06-14
      我也遇到这个问题了。。有解决么?
      2021-06-14
      回复
  • 枫儿
    枫儿
    2017-12-23

    官方大人们,有没有人出来回答一下啊,急急急

    2017-12-23
    有用
    回复
登录 后发表内容