1. 前言
我们在微信公众平台配置了一个我们自己服务器的URL地址,注意该地址有两个作用:
验证服务器的有效性。也就是说在填写URL并点击提交时,微信官方会发送消息到指定URL,验证我们提供的URL是否有效。
验证消息的合法性。微信给我们的服务发消息时,会先发送验证消息,里面会携带参数,我们可以根据这些参数信息验证消息是否合法——即是否的确来自微信而不是伪造的。
2. 区分验证方法
那么,两种验证都是共享一个URL,如何区分呢。我们从微信官方文档得知,第一种验证是GET方式,第二种是POST方式。而且第二种验证里面并不涉及echostr参数。
所以我们修改验证控制器代码如下:
/**
* 验证控制器
*/
@Controller
public class CheckController {
@Autowired
private WxMpService wxMpService;
// 接入验证
@GetMapping("/checkToken")
@ResponseBody
public String checkTokenGet(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce,
@RequestParam(name = "echostr", required = false) String echostr) {
System.out.println("接入验证");
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息不合法
return "消息不合法";
}
// 消息合法
return echostr;
}
// 消息合法验证
@PostMapping("/checkToken")
@ResponseBody
public String checkTokenPost(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce) {
System.out.println("消息合法验证");
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息不合法
return "消息不合法";
}
// 消息合法则继续处理
return "";
}
}
3. 验证
我们首先验证服务器有效性,登录微信公众平台,打开【设置与开发】-【基本配置】菜单,点击【修改配置】,然后直接【提交】。控制台打印接入验证,说明此时微信将消息发送到了checkTokenGet 方法。
接下来验证消息的合法性,我们关注微信公众号,然后通过微信给公众号发送一个消息,此时控制台输出了消息合法验证,说明此时微信将消息发送给了checkTokenPost方法处理。
OK,这说明我们的程序逻辑是对的。
4. 小结
我们通过微信公众平台配置的URL,实际上是有两层作用的,第一层是接受微信对我们服务器的验证,第二层是每次发送消息微信会发送合法性的参数供我们来验证消息是否真正来自微信。
这两种消息的关键区分就是一个是GET请求,一个是POST请求,我个人认为应该设计成两个URL接口,这样弄成一个会让初学者感到困惑。
个人一些浅薄见解,仅供参考。