服务器是将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
我的解决方法是在使用 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) => {}); }, }); }, }); }
同样遇到这个问题,最后还是后端严格按照官方文档的流程设计登录解决的 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
回想了一下,应该是session_key 和 encryptedData 不匹配造成的
就是说前端获取的encryptedData和iv信息是之前的session_key所匹配的,而本次又发送了code重新获取了session_key
建议后端完善一下接口流程
楼主怎么解决?
楼主好,可以上一段代码吗?现在iv是通过<button>控件的open-data才能获取到,encodeURIComponent()方法是向服务端发送request前调用呢还是在服务端收到iv后再调用。
现在小程序官方已经改成了<button>控件的open-data,那么我现在大概流程就是,用户点击button -> 绑定用户事件里拿到 iv和encryptedData -> 调用wx.login拿到code,然后将三个参数都encodeURIComponent后网络请求发给服务器
你好。
我用encodeURIComponent之后,‘==’被换成了%3D%3D,导致iv的长度不对,产生了41002的错误。
我之前也是跟你差不多,有几率出现41003,怎么说呢,其实还是有规律41003的:第一次登陆都失败,第二次都成功,然后删除登录态之后立刻登陆又成功,但是过一段时间之后再登陆又41003了
encodeURIComponent就是将字符串进行URLEncode编码,当然是转成如%3D%3D,服务器接收到后将其URLDecode解码还原为原字符串
怎么解决的?
总的来说就两点
1,小程序端 iv、decryptData 等包含特殊字符的字段发送服务器encodeURIComponent
2,wx.login 获取 code,调用时间稍微提前调用会
官方大人们,有没有人出来回答一下啊,急急急