JFinal-weixin项目token校验失败问题

准备做微信项目下了个JFinal-weixin的demo,结果在校验token的时候一直显示配置失败,就单步调试了一下。结果发现问题在这里

image.png

checkSignature函数里根本没对token, timestamp, nonce做字典序排序。tempStr和signature在大多数情况下当然不会相等。然而微信文档明确要求对这三个参数做字典排序

image.png

一开始根本没想到demo代码会有这些基本问题。。。。还到处去核对URL, token等等参数纠结了我一个小时。

修改成以下代码可通过token校验。希望大家尽量少踩坑

image.png

评论区

JFinal

2019-04-21 10:02

这个问题挺大的,jfinal weixin 早期版本是我写的这个函数,是一定有排序的,我记得非常清楚,以下是早期版本的代码:
public boolean checkSignature(String signature, String timestamp, String nonce) {
String TOKEN = ApiConfigKit.getApiConfig().getToken();
String array[] = {TOKEN, timestamp, nonce};
Arrays.sort(array);
String tempStr = new StringBuilder().append(array[0] + array[1] + array[2]).toString();
tempStr = HashKit.sha1(tempStr);
return tempStr.equalsIgnoreCase(signature);
}

在 git 上也可以看到直到最新版本 jfinal weixin 2.3 的时候还有排序这个:
https://gitee.com/jfinal/jfinal-weixin/blob/jfinal-weixin-2.3/src/main/java/com/jfinal/weixin/sdk/kit/SignatureCheckKit.java


排查了一下,没有排序的版本是在 18 天前被改掉的:
https://gitee.com/jfinal/jfinal-weixin/commit/c4f4c3aea5e3cc3e635229e8f34e93d1c3763cae

幸好 maven 中心库的最新版本仍然是有排序的,建议使用 maven 中心库的版本

非常感谢你的发现,否则下个版本会出大问题

JFinal

2019-04-21 10:23

git 中的代码已更新, update 一下使用最新版

ComAndSun

2019-04-21 10:28

@JFinal 没事,找到问题就好。我看到您在git上已经更新了,感谢

JFinal

2019-04-21 10:56

@ComAndSun 出问题的代码是 jfinal weixin 开发者 @卢春梦 可能不知道排序的用意引发的,最初的排序代码是我在 4 年前写的

Dreamlu

2019-04-21 11:26

@JFinal 把 Arrays.sort 看掉了,我知道这块要排序,我以为之前是直接写死顺序了。