无论是正式的微信公众号还是测试账号,都需要配置URL和Token,用于验证服务器是否配置正确,如下图。
图中的URL除了包括协议、域名,还需要具体的接口路径,比如这里就是"/wx/enter"。
Token可以自己随便设置,但是需要在URL中的接口进行验证。
@RequestMapping(value = "/enter")
public String wxEnter(HttpServletRequest req){
//获取签名
String signature = req.getParameter("signature");
//获取timestamp
String timestamp = req.getParameter("timestamp");
//获取nonce
String nonce = req.getParameter("nonce");
//获取echostr,验证成功需要返回这个参数
String echostr = req.getParameter("echostr");
//校验是否正确
if(Util.check(signature, timestamp, nonce)){
return echostr;
}
return "校验失败";
}
签名校验代码:
public static boolean check(String signature, String timestamp, String nonce) throws Exception{
// 将 "test", timestamp, nonce 进行字典排序
String[] array = new String[] {"test", timestamp, nonce};
Arrays.sort(array);
String content = array[0] + array[1] + array[2];
MessageDigest md = MessageDigest.getInstance("SHA-1");
// shal 加密
byte[] digest = md.digest(content.toString().getBytes());
//转换为字符串
String sign = byteToStr(digest);
// 校验签名
return sign != null ? sign.equals(signature.toUpperCase()) : false;
}
在保存配置的时候,微信服务器会通过GET方式请求所配置的URL,以上代码就是这个验证过程,确定服务器配置正确。
注意,以上代码不保证完全正确,仅作参考!因为CSDN的原因,上面两端代码重复了。
JS安全域名在配置的时候可能会出现二级域名,此时只需要配置一级域名就可以,比如: