博主在用java做微信小程序的密文解码时遇到了这个问题。挠人的是这个错误只是偶尔出现,但是很影响使用体验。经过一番排查总算找到了错误原因。
这是一个很容易忽视的坑。具体错误`:
2021-03-10 21:43:32.224 ERROR 25476 --- [nio-443-exec-93] o.s.b.w.servlet.support.ErrorPageFilter : Forwarding to error page from request [/user/loggingByPhone] due to exception [unable to decode base64 string: invalid characters encountered in base64 data]
org.bouncycastle.util.encoders.DecoderException: unable to decode base64 string: invalid characters encountered in base64 data
at org.bouncycastle.util.encoders.Base64.decode(Unknown Source) ~[bcprov-jdk15on-1.65.jar:1.65.0]
at com.justwannago.SQL.ThirdClassTools.WechatUtil.decryptData(WechatUtil.java:30) ~[classes/:0.0.1-SNAPSHOT]
at com.justwannago.SQL.ThirdClassTools.WechatUtil.mainDecode(WechatUtil.java:20) ~[classes/:0.0.1-SNAPSHOT]
at com.justwannago.SQL.service.UserServiceImplement.Decode(UserServiceImplement.java:116) ~[classes/:0.0.1-SNAPSHOT]
at com.justwannago.SQL.controller.justTest.getInfoByPhone(justTest.java:65) ~[classes/:0.0.1-SNAPSHOT]
at sun.reflect.GeneratedMethodAccessor424.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_151]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_151]
出错在于从微信API传输的session有时包含“\”,而Base64的处理字符中不包含""字符,所以需要把session_key字符串中的右斜杠删除。
平时正常解密提供的session大多是以下这种:
xCHPs4Pw6ojOHuRARWMsAQ==(除去两个等号,共22个字符,一般而言session_key就是这个长度)
但是偶尔会出现以下这种:
Je854c9dFCi3BwhDKG/gnw==(除去两个等号,共23个字符,其中\不是Base64可以处理的字符)
出现原因:当session_key中包含左斜杠时,会连带包含有转义的右斜杠,Base64无法处理右斜杠,于是报错。
解决方案:在调用解码类之前把字符串中的右斜杠替换为空即可
session_key = session_key.replace("\\", "");//session_key中可能出现\这个符号,会导致invalid错误