在微信公众平台机型服务器配置的时候,下图中的服务必须先在服务端跑起来,后台接口使用java开发。
authenticate控制器接口如下:
/**
* 验证只接受微信后台的服务请求
* 开发者通过检验signature对请求进行校验。
* 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功。
* 验证流程如下:
* 1、将token timestamp nonce三个参数进行字典序排序;
* 2、将三个参数字符串拼接成一个字符串进行sha1加密;
* 3、将加密后的字符串与signature对比,相同则该请求来源于微信。
* @return
*/
@ResponseBody
@GetMapping(value="/authenticate")
public String authenticate(Model model, HttpServletRequest request, HttpServletResponse response) {
String signature = request.getParameter("signature"); // 微信加密签名,结合了开发者填写的token参数和请求中的timestamp、nonce参数
String timestamp = request.getParameter("timestamp"); // 时间戳
String nonce = request.getParameter("nonce"); // 随机数
String echostr = request.getParameter("echostr"); // 随机字符串
// 1) 将token timestamp nonce进行字典序排序
List<String> wxlist = new ArrayList<String>();
wxlist.add(WxConstants.MY_TOKEN);
wxlist.add(timestamp);
wxlist.add(nonce);
Collections.sort(wxlist);
String orderstr = "";
for (int t=0; t<wxlist.size(); t++) {
if (wxlist.get(t) != null) {
orderstr = orderstr + wxlist.get(t);
}
}
// 2) 将三个参数字符串拼接成一个字符串并加密
String sha1str = DigestUtils.sha1Hex(orderstr);
// 3) 比对signature,是否相同
if (sha1str != null && signature != null && sha1str.equals(signature)) {
return echostr;
}
return "hello";
}