接入微信公众平台开发,最开始的一步就是让你验证服务器的有效性。
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
你需要填写你的服务器项目url、token、EncodingAESKey,选择明文模式(官方推荐安全模式,需要加解密消息),其中token、EncodingAESKe可以随机填写,EncodingAESKey在这里用不到,当你点击提交的时候微信会携带signature、timestamp、nonce、echostr四个参数请求该url,而你的服务需要验证并原样返回echostr参数内容。
@Controller
@RequestMapping("/wx")
public class WxController {
@RequestMapping()
@ResponseBody
public void checkToken(String signature, String timestamp, String nonce, String echostr
, HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean ok = MPUtils.checkToken( signature, timestamp, nonce, echostr);
if(ok){
response.getWriter().print(echostr);
System.out.println("验证通过");
}
}
}
验证步骤分为三步:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
- 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
public static boolean checkToken(String signature,String timestamp,String nonce,String echostr){
String sortStr = sort(Constants.TOKEN, timestamp, nonce);//排序串
String sha1Str = DigestUtils.sha1Hex(sortStr);//sha1加密串
System.out.println("加密后:"+sha1Str);
return sha1Str.equals(signature);
}
public static String sort(String token,String timestamp,String nonce){
String[] arr = { token, timestamp, nonce };
Arrays.sort(arr); // 字典序排序
String str = arr[0] + arr[1] + arr[2];
return str;
}
其中DigestUtils.sha1Hex(sortStr);需要引入commons-codec依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>$1.7</version>
</dependency>
部署项目运行,填写URL、token提交,例如我的url是 https://huangtl.com/wx,因为需要提供外网地址,若需要本地开发测试可参考我的另一篇文章《内网映射工具 ngrok》映射本地的一个地址。
注意:验证成功后,用户正在公众号的操作(消息、事件等)微信都会请求到该URL上,所以你在验证成功后可以将该方法注释,重新使用该路径写针对微信发送过来的消息/事件进行处理,也可以继续使用该方法做改造。
感谢阅读