配置URL验证地址
微信服务器会将请求发送到配置的地址, 地址必须是80端口, 可使用花生壳等工具
验证参数
signature: 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp: 时间戳
nonce: 随机数
echostr: 随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1 将token、timestamp、nonce三个参数进行字典序排序
2 将三个参数字符串拼接成一个字符串进行sha1加密
3 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
接入配置
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = resp.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
System.out.println("校验成功");
out.print(echostr);
}
}
sha1加密工具类####
private static final String token = "weixintoken";
public static boolean checkSignature(String signature, String timestamp, String nonce){
String[] arr = new String[]{token,timestamp,nonce};
//排序
Arrays.sort(arr);
//生成字符串
StringBuffer content = new StringBuffer();
for(int i=0;i<arr.length;i++){
content.append(arr[i]);
}
//sha1加密
String temp = getSha1(content.toString());
return temp.equals(signature);
}
因为用的是servlet 在web.xml中添加mapping配置
<servlet>
<servlet-name>weixinServlet</servlet-name>
<servlet-class>com.xxxx.xxxx.controller.WeixinServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>weixinServlet</servlet-name>
<url-pattern>/wechat/portal</url-pattern>
</servlet-mapping>