收藏
回答

java验证消息的确来自微信服务器失败?

/**
 *  检查是否是微信服务器发来的请求
 * @param signature
 * @param timestamp
 * @param nonce
 * @param echostr
 * @return 非回显字符串的其他都视为不通过
 */

@Override
public String check(String signature, String timestamp, String nonce, String echostr) {
    String[] list = {token, timestamp, nonce};
    Arrays.sort(list);
    // 2) 将三个字符串以此顺序进行拼接
     StringBuilder builder = new StringBuilder();
    for(String s : list) {
        builder.append(s);
    }
    // 2.1) 加密
    try {
        MessageDigest messageDigest = MessageDigest.getInstance("sha1");
        byte[] digest = messageDigest.digest(builder.toString().getBytes(StandardCharsets.UTF_8));
        // 2.2) 将加密后的byte数组转换为signature一样的格式(每个字节都转换为十六进制进行拼接)
        builder = new StringBuilder();
        for(byte b : digest) {
            // builder.append(Integer.toHexString(b));不能这么弄因为这样弄b如果是负,那么就凉凉
            // 这样写保证两位十六进制都存在并且正确
            builder.append(Integer.toHexString((b >> 4) & 15));//前四个字节转换为十六进制
            builder.append(Integer.toHexString(b & 15));//后四个字节转换为十六进制
        }
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
    // 3) 核对请求是否来自于微信(加密解析后的字符串与signature比较)
    if(builder.toString().equals(signature)) {
        // 相同才返回回显字符串
        // 并且返回echostr代表开发者确认了这是公众号服务器发来的请求,公众号就进行配置
        System.out.println("成功 : " + echostr);
        return echostr;
    } else {
        // 否则返回null
        return null;
    }
}


我检查过了,token和url都没有问题,后端也能接受到请求,我调试过并且通过日志表明,我可以返回echostr的

但是还是配置失败!

就是调试的时候,最后一步返回echostr,哪怕我不做任何处理,也是配置失败,返回echostr的时候去了奇奇怪怪的页面!

无语了,这个是我的新项目,之前我练习的微信开发程序,就没问题,难道我每次都要去那个程序运行配置后再回来运行这个项目吗?

回答关注问题邀请回答
收藏

1 个回答

登录 后发表内容
问题标签