入口:
详情的官方文档里面都有,我这边只写一些自己的理解,欢迎补充
- URL: 是开发者用来接收微信消息和事件的接口URL,必须以http://或https://开头,只能是80 和 443 端口
- Token : 可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
开启服务器时,会调用一次URL,Token 验证通过了才能开启,调用是传递参数如下:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
我们要做的是:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
- 开发者获得加密后的字符串与signature对比,标识该请求来源于微信
- 返回 echostr 则表示成功
public static void validate(HttpServletRequest request, HttpServletResponse response) throws IOException {
String signature = request.getParameter("signature");// 微信加密签名
String timestamp = request.getParameter("timestamp");// 时间戳
String nonce = request.getParameter("nonce");// 随机数
List<String> list = new ArrayList<String>();
list.add(token);
list.add(timestamp);
list.add(nonce);
Collections.sort(list);// 字典排序
String str = "";
for (int i = 0; i < list.size(); i++) {
str += (String) list.get(i);
}
if (encode("SHA1", str).equalsIgnoreCase(signature)) {
response.getWriter().write(request.getParameter("echostr"));
response.getWriter().close();
logger.info("验证通过");
} else{
logger.error("验证失败");
}
}