介绍
介绍
福哥需要使用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包
项目需要导入 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测试代码
项目包自带一个 WXBizMsgCryptTest.java 测试代码,删除掉
开发
建立接口
通过SpringBoot建立一个接口方法,不需要参数,我们的参数通过servlet获取
实现VerifyURL
企鹅教的人给出的 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
接下来需要实现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了