使用Java开发微信公众号服务器后台接口

发表于 2020-08-21 16:17:33
阅读 77

介绍

介绍

福哥需要使用java制作微信公众号的服务器后台接口,从官方下载了示例代码,福哥将对接的过程记录下来分享给大家

安装

下载示例代码

打开网址 https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Message_Encryption/Message_encryption_and_decryption.html,找到如下位置进行示例代码的下载

44394e3663fecbf7.jpg

复制示例代码

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

036cfed2cdf17b5c.jpg

导入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了