收藏
回答

微信公众号开发-接入概述-帮助文档说明与示例代码版本不匹配,无法使用开发

问题模块
教程反馈

在微信公众号刚刚开始配置开发中的基本配置时,


根据接入指南 (https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319)提示是三个参数进行操作

1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信


在本页中的详情请参考消息体签名及加解密部分的文档 。

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=&lang=zh_CN


根据路径中提供的示例代码


下载JAVA示例代码,在WXBizMsgCrypt.java中提供了验证url的方法


/**
     * 验证URL
     * @param msgSignature 签名串,对应URL参数的msg_signature
     * @param timeStamp 时间戳,对应URL参数的timestamp
     * @param nonce 随机串,对应URL参数的nonce
     * @param echoStr 随机串,对应URL参数的echostr
     *
     * @return 解密之后的echostr
     * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
     */
    public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr)
            throws AesException {
        String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
 
        if (!signature.equals(msgSignature)) {
            throw new AesException(AesException.ValidateSignatureError);
        }
 
        String result = decrypt(echoStr);
        return result;
    }

并提供了test方法

@Test
    public void testVerifyUrl() throws AesException {
        WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("QDG6eK",
                "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C", "wx5823bf96d3bd56c7");
        String verifyMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3";
        String timeStamp = "1409659589";
        String nonce = "263014780";
        String echoStr = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==";
        wxcpt.verifyUrl(verifyMsgSig, timeStamp, nonce, echoStr);
        // 只要不抛出异常就好
    }

测试代码和源码非常清晰,可以通过测试


但是实际开发中的echoStr参数是不会加密的,无论选择以下[明文模式][兼容模式][安全模式]  其中echoStr参数都是19位的数字


作为开发自行调用源码API进行加密,在原有测试代码上做尝试,进行解密自行加密,再次调用方法,发现并不可行.

@Test
   public void testVerifyUrl() throws AesException {
       WXBizMsgCrypt wxcpt = new WXBizMsgCrypt("QDG6eK",
               "jWmYm7qr5nMoAUwZRjGtBxmz3KA1tkAj3ykkR6q2B2C", "wx5823bf96d3bd56c7");
       String verifyMsgSig = "5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3";
       String timeStamp = "1409659589";
       String nonce = "263014780";
       String echoStr = "P9nAzCzyDtyTWESHep1vC5X9xho/qYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp+4RPcs8TgAE7OaBO+FZXvnaqQ==";
       //解密
       String decrypt = wxcpt.decrypt(echoStr);
       System.out.println("解密后:"+decrypt);
       //加密
       echoStr = wxcpt.encrypt(wxcpt.getRandomStr(),decrypt);
       System.out.println("加密后:"+echoStr);
       //解密
       decrypt = wxcpt.decrypt(echoStr);
       System.out.println("再次解密:"+decrypt);
       wxcpt.verifyUrl(verifyMsgSig, timeStamp, nonce, echoStr);
       // 只要不抛出异常就好
   }
解密后:1616140317555161061
加密后:HfgmaBM9GWwZLn3y8TYiDSLw2oDqVYcXO+IFJiXLVs+ptZRESUO743aYZkbCROtR6IrKB75azeSZBDtG2VHu6Q==
再次解密:1616140317555161061



不知道如何利用这套源码进行开发.


开发环境:JDK1.8  Spring boot 2.1.1.RELEASE   commons-codec1.9(使用pom文件引入,否则默认使用是1.11版本)

<dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
           <version>1.9</version>
       </dependency>

如有其它问题请回帖留言,我近期关注此贴

最后一次编辑于  06-23
回答关注问题邀请回答
收藏

2 个回答

  • 张三疯
    张三疯
    07-08

    echostr是随机串,不加密的。

    07-08
    赞同
    回复 2
    • 安逸
      安逸
      07-14
      在官方demo示例代码中是有的,也抽象出了方法,四个参数,并且在test类中有个testVerifyUrl进行了测试.
      07-14
      回复
    • 安逸
      安逸
      07-14
      谢谢,已经解决了,https://blog.csdn.net/qq_40310046/article/details/82840660 在论坛找了一个自己写的验证方法,实时证明demo不可信
      07-14
      回复
  • 安逸
    安逸
    06-21

    为什么没有管理员回复我.两天了是我反馈错地方了么

    2019年6月25日

    明明编辑的时候代码有格式的,为什么发布成文章就没有格式了.

    帖子简版意思:demo和真实接口参数以及文档三者匹配不对

    2019年7月6日

    没有解决,也不指望了,已从收藏夹删除.

    06-21
    赞同
    回复