1、在eclipse中创建一个动态工程
在src下面创建一个包:
2、eclipse中添加tomcat服务器
在编辑器中添加tomcat
3、修改编译生成的class文件存放的目录
在项目WechatValidation项目的properties的java build path 的Add libray添加tomcat7,这样就不要在后期编码的时候在WEB-INF的lib目录下添加servlet.api.jard的包,这个包是有相关的HttpServlet对象需要使用。
修改classes生产的文件目录,
创建classes目录:
修改classes完整路径如下图:
查看项目的路径是否正确
4、编写serlvet相关代码与配置servlet
在com.aixunma.validation包下面创建servlet的java,并且继承HttpServlet类
实现获取请求微信服务器的提交到servlet的请求参数验证。
代码如下:
package com.aixunma.validation; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 用来请求微信服务器请求验证 * <p>类的描述:</p> * <p>@Description: TODO</p> * <p>@author 小海</p> * <p>@time:2017年4月27日 下午10:14:10</p> * <p>@Vesion: 1.0</p> */ public class ValidationServlet extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); // 设置编码 /* *获取微信服务器往自己的服务器的请求参数中传递的4个参数 */ // 签名之字符串 final String signature = request.getParameter("signature"); // 时间戳 final String timestamp = request.getParameter("timestamp"); // 随机数 final String nonce = request.getParameter("nonce"); // 随机字符串 final String echostr = request.getParameter("echostr"); StringBuilder builder = new StringBuilder(); builder.append("签名之字符串:").append(signature) .append("\n") .append("时间戳:").append(timestamp) .append("\n") .append("随机数").append(nonce) .append("\n") .append("随机字符串").append(echostr) .append("\n").append("-------------------------"); // 输出 System.out.println(builder.toString()); // 验证:调用工具类 final boolean result = ValidationTool.checkSignature(signature, timestamp, nonce); // 输出 final PrintWriter writer = response.getWriter(); if (result == true) { // 校验成功后返回原样echostr writer.println(echostr); } writer.close(); } }
再该包下编写一个工具类:ValidationTool.java,以后关于任何的微信公众号基本验证方法可直接使用该类的方法。
代码如下:
package com.aixunma.validation; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 微信服务器校验工具类 * <p>类的描述:</p> * <p>@Description: TODO</p> * <p>@author 小海</p> * <p>@time:2017年4月27日 下午10:32:26</p> * <p>@Vesion: 1.0</p> */ public class ValidationTool { // 声明一个TOKEN:必须要与微信公众号后台基本配置的的Token保持一致 private static final String TOKEN = "aixunma"; @SuppressWarnings("static-access") public static boolean checkSignature(String signature, String timestamp, String nonce) { // 1、将token、timestamp、nonce三个参数进行字典序排序:先保存在数组中,再实现字典顺序排序 final String[] params = new String[] {TOKEN, timestamp, nonce}; Arrays.sort(params); // 2、将三个参数字符串拼接成一个字符串进行sha1加密 final StringBuilder builder = new StringBuilder(); for (int i = 0; i < params.length; i++) { builder.append(params[i]); } MessageDigest digest = null; String result = ""; try { // 进行sha1加密 digest = digest.getInstance("SHA-1"); byte[] byteArray = digest.digest(builder.toString().getBytes()); // 将加密后的密文字节数组转换成为密文字符串 result = byteArrayToStr(byteArray); System.out.println("加密后的密文是:" + result); } catch (NoSuchAlgorithmException e) { System.out.println("加密失败"); e.printStackTrace(); } finally { if (digest != null) { try { digest.clone(); } catch (CloneNotSupportedException e) { // 不做处理 } } } // 3、将加密后的字符串与微信服务器接受的原始signature签名字符串进行对比, // 如果对比相等说明标识该请求来源微信服务器,否则不是来之微信服务器,请求验证不通过 return result != null ? result.equals(signature.toUpperCase()) : false; } /** * 将一个字节数组转换成字符串 * @param byteArray 字节数组 * @return */ private static String byteArrayToStr(byte[] byteArray) { final StringBuilder strDigest = new StringBuilder(); for (int i = 0; i < byteArray.length; i++) { strDigest.append(byteToHexStr(byteArray[i])); } return strDigest.toString(); } /** * 将一个字节转换为十六进制的字符串 * @param byteDate 一个字节 * @return */ private static String byteToHexStr(byte byteDate) { char[] digit = {‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘}; char[] temp = new char[2]; temp[0] = digit[(byteDate >>> 4) & 0X0F]; temp[1] = digit[byteDate & 0X0F]; final String str = new String(temp); return str; } }
在web.xml中配置validationServlet.java的servlet请求。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>WechatValidation</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>validation</servlet-name> <servlet-class>com.aixunma.validation.ValidationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>validation</servlet-name> <url-pattern>/validation.html</url-pattern> </servlet-mapping> </web-app>
如图:
5、运行web项目编译成class文件
运行web项目,使用之前配置的tomcat7,这时候会将编译好的class文件存放在classes目录下。
6、将项目部署在阿里云服务器
(1)使用sftp上传打包好的项目到/mnt 目录下
压缩
(2)上传到/mnt目录
(3)解压zip
#unzip wechatValidation
(4)查看该目录是否正确(ok)
(5)在部署一个tomcat,去配置server.xml
我的tomcat7 放在/usr/local/server/ 这个下
在当前目录下进入tomcat的conf目录,修改server.xml配置
# cd apache-tomcat-7.0.77/conf
修改tomcat的端口为80 ,因为微信服务器请求的URl中只能支持80和443端口。
修改Context:
(6)查看tomcat是否启动,如果启动,就关闭tomcat
# ps -aux|grep tomcat
(7)关闭tomcat
在bin目录下执行
# ./shutdown.sh
如果tomcat出现关闭不了,使用kill 进程ID ,进行强制关闭。
# kill 进程ID
(8)启动tomcat
# ./startup.sh
(9)查看tomcat是否启动正常,在log目录下执行
# tail -f catalina.out
6、在微信公众号的基本配置中提交请求
7、成功配置
谢谢关注。