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的时候去了奇奇怪怪的页面! [图片] [图片] 无语了,这个是我的新项目,之前我练习的微信开发程序,就没问题,难道我每次都要去那个程序运行配置后再回来运行这个项目吗?