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、成功配置

谢谢关注。