导致问题的原因是session_key没有及时更新 在调用wx.login()之前调用了wx.getUserInfo(),在调用getUserInfo()时将获取到 iv 和encryptedData 传给后台,而后调用login(),此时的session_key可能会被新的session_key覆盖,就会导致后台在对数据解密时使用新的session_key去解密旧的encryptedData,如此就会Illegal Buffer报错。
在使用微信官方WXBizDataCrypt.js
解密encryptedData
获取敏感数据的时候,偶尔会报错。
DeprecationWarning: Buffer() is deprecated due to security and usability issues.
Please use the Buffer.alloc(),Buffer.allocUnsafe(), or Buffer.from() methods instead.
message: Illegal Buffer, stack: Error: Illegal Buffer at WXBizDataCrypt.decryptData
这种错误一定概率出现,一般出现在项目初始化的时候。
我一开始还以为是Buffer
库的问题,使用了safer-buffer
替换,还是没有解决。
网上还有人说需要encodeURIComponent
对参数包裹,这也不能解决。
其实,最后的解决办法,就是在小程序端
通过open-type="getUserInfo"
获取参数之前,必须要wx.login
。
所以,重要的事情说三遍:
wx.login
wx.login
wx.login
必须先执行。最近在搞一下小程序授权登录(用户注册功能),在密钥,appId等内容都没问题的情况下,请求授权注册接口等时候一直报错 Illegal Buffer。
在解密encryptedData数据的时候,传过来的数据里面可能会有+等符号, 如下:
encryptedData: 'BQRDHWz16TcmEOkp1yV0eMd8L0a7orJeA1y8uNZycPHO41MBZmYm1jbMMh36tozePbtnbdxovStZhEbMKW9fYBpUKcXDedcChyowIXuYNic2CSItr4lv9TI47kfmBrhYE39wGE20BMtj8ORVQ2xM5A3X1uL7HHI5IZbnEqQS1W38PzGbJBW8IkybFQHXwtvigWquekDe1DmV1LA8vEFflUIjfuA5cWgGJJstzxi8bjtUMjQC/hcPRb+7pNzpo+jmtE0jU9F/a5V95lK6foYTu1ErWjEezaJ3YwujWK5oq581/b5TIL+vJPUn+vdXj71plfrH7WnSoC0ZS3yF6ToBcH17GAZsyaiGqOl88NVtkuwCA/WGMqpvnAUfromw5kaZj1QFA6U/N/lF43HdOyhjQUAkPsIMJLaHkfso6Aww0IYTcIc+qXOV8Rcrh0h61R34Dqkn11iE4mo1fmUc14ynvd4d6KXB2AvqOl+dHOd+SnRGYwTINAkPuyhxQRA/Yqj2F6MlUdKZxth73w2JEUYkoA==',
iv: 'GcF/mmbBBQA7kJOSR9I/7w=='
这些符号传递给服务器就会消失,导致微信提供等解密函数一直报错。
前端在传递encryptedData和iv向量等时候需要进行encodeURIComponent编码