privatevoidvalidateCharacter(finalint emptyBitsMask, final Context context){
if (isStrictDecoding() && (context.ibitWorkArea & emptyBitsMask) != 0) {
thrownew IllegalArgumentException(
"Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. " +"Expected the discarded bits from the character to be zero.");
}
我也遇到了这个问题,跟你一样用了WxJava。看了代码是要求用base64对EncodingAESKey进行解码,但是commons-codec:1.14有合法性检查,所以过不了。
后来我还是用了1.14这个版本,但是EncodingAESKey我是用32个字符串(数字或字符)经过base64编码出来的,去掉等号正好是43个字符长度,填到微信后台里,这样就保证EncodingAESKey是可以被commons-codec:1.14解码成功的。
经过测试,这个方法是可行的。
用其他的misc 和Java8utils下的包可以解码。那就是commons-codec的问题,不是腾讯的问题。。
其他语言可以,唯独Java下的一个库不可以,就要改机制。想的太多了。
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.16.0</version> </dependency>
如果引入的依赖包有与之冲突的版本,请使用
<exclusion> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </exclusion>
将冲突的包排除掉。
微信加密推过来的报文如下:
<xml> <AppId><![CDATA[wxXXXXX]]></AppId> <Encrypt><![CDATA[iEmcIRyvpIxajr4knyDDch36Vf2EYzaP+czY/ku/+2XXDVl9BF54U3y+fZleAClXaHR9Em2yQcVJrx0kou8F9xjJA6O1xq2mN4BawPsdATqCEKY16ZExcuexBvG9NHS82+qI0JlGAw8CvHibNCNftZYuRO6bgGv0nUrUn1gr1zCwDDA5Gh1xFAute+p17WndpgNLrOUGtbxgYaL7shZLKE/MRzPmzYLqngjYP7oj215B1axbf02E0d0T0jAvkAY9zNheMF7cWZCSUGGsogm/C1KXCDQ4nlL5E/V4oUt2cp8fBDZXGSR7cWj9r0V/3L6hMdoAmF3onx9AbQx4yuV3qcppiYX4TAjEi4v7zJ09RrOaVegS0HkVNiS1RCVpsjGMCw+eA25uWr+36QXJGKGH7QJG5uA/b1WZCi0RPaC9QepMO+O5CJJAYva034CGa1L4xDu7VPH+CpCrBDD97Z8ZNQ==]]></Encrypt> </xml>
篇幅有限 有不明白的加微信进一步交流: comeon_betty
说得好,什么鬼东西
commons-codec:1.13 开始加入了以下代码:
private void validateCharacter(final int emptyBitsMask, final Context context) { if (isStrictDecoding() && (context.ibitWorkArea & emptyBitsMask) != 0) { throw new IllegalArgumentException( "Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. " +"Expected the discarded bits from the character to be zero."); }
代码查看地址:https://github.com/apache/commons-codec/blob/master/src/main/java/org/apache/commons/codec/binary/Base64.java
因此只能使用1.12版本或者更低的版本
还是希望腾讯能升级一下代码保证能使用新版本的包
算了,腾讯说什么就是什么,没办法,我还是改成明文吧,不折腾了。