福哥需要使用java制作微信公众号的服务器后台接口,从官方下载了示例代码,福哥将对接的过程记录下来分享给大家
打开网址 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Message_Encryption/Message_encryption_and_decryption.html,找到如下位置进行示例代码的下载

解压缩下载下来的压缩包 SampleCode.zip,将src下面的com和demo复制到自己的项目里面

项目需要导入 commons-codec 包,在 pom.xml 里加入依赖
<!-- commons.codec --> <dependency> <groupId>org.eclipse.ecf</groupId> <artifactId>org.apache.commons.codec</artifactId> <version>1.9.0.v20170208-1614</version> </dependency>
项目包自带一个 WXBizMsgCryptTest.java 测试代码,删除掉
通过SpringBoot建立一个接口方法,不需要参数,我们的参数通过servlet获取
企鹅教的人给出的 SampleCode 估计自己都没有用过,各种问题各种坑。
福哥先抛出第一个坑,verifyUrl方法里用到了getSHA1方法,你直接使用 SampleCode 的代码会发现 verifyUrl 算出来的签名根本不一样,检查这个getSHA1的声明发现第四个参数是encrypt,但是verifyUrl根本没有传递encrypt进来,verifyUrl定义里是把echoStr当作encrypt传入,不过这样算出来的签名是错的。
解决方法就是在verifyUrl的定义里面把调用getSHA1方法的地方的encrypt这个参数传入一个“”就行了。
public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr)
throws AesException {
String signature = SHA1.getSHA1(token, timeStamp, nonce, "");
if (!signature.equals(msgSignature)) {
throw new AesException(AesException.ValidateSignatureError);
}
String result = decrypt(echoStr);
return result;
}福哥再抛出第二个坑,verifyUrl方法的签名不一样的问题解决了,但是你会发现依然过不去,卡在了decrypt这了,因为echoStr根本不是encrypt出来的也就理所当然不能decrypt了
解决方法就是在verifyUrl的定义里面不要decrypt了,直接返回echoStr就可以了
public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr)
throws AesException {
String signature = SHA1.getSHA1(token, timeStamp, nonce, "");
if (!signature.equals(msgSignature)) {
throw new AesException(AesException.ValidateSignatureError);
}
return echoStr;
}接下来需要实现VerifyURL,用来完成服务器配置的验证需要
@RequestMapping("/tongfu/wxapi")
public String responseTongfuWXAPI(
) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
HttpServletResponse response = attributes.getResponse();
WXBizMsgCrypt wxBizMsgCrypt;
String msgSignature, timeStamp, nonce, echoStr;
String corpID = "wx2ba95b5aab984f48";
String encodingAesKey = "rN6LfP9qbILPSHQ938IixdYoy3s5ksIqjcPmYxOPx4v";
String token = "tongfu";
try{
msgSignature = request.getParameter("signature");
timeStamp = request.getParameter("timestamp");
nonce = request.getParameter("nonce");
echoStr = request.getParameter("echostr");
wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, corpID);
return wxBizMsgCrypt.verifyUrl(msgSignature, timeStamp, nonce, echoStr);
}
catch (Exception e){
e.printStackTrace();
}
return "";
}正常情况下,就可以完成VerifyURL了