无论是正式的微信公众号还是测试账号,都需要配置URL和Token,用于验证服务器是否配置正确,如下图。
图中的URL除了包括协议、域名,还需要具体的接口路径,比如这里就是"/wx/enter"。
Token可以自己随便设置,但是需要在URL中的接口进行验证。
@RequestMapping(value = "/enter")public String wxEnter(HttpServletRequest req){//获取签名String signature = req.getParameter("signature");//获取timestampString timestamp = req.getParameter("timestamp");//获取nonceString 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安全域名在配置的时候可能会出现二级域名,此时只需要配置一级域名就可以,比如: