zoukankan      html  css  js  c++  java
  • (4)微信二次开发 之 公众平台开发者模式配置与请求验证

    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包下面创建servletjava,并且继承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("
    ")
                .append("时间戳:").append(timestamp)
                .append("
    ")
                .append("随机数").append(nonce)
                .append("
    ")
                .append("随机字符串").append(echostr)
                .append("
    ").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.javaservlet请求。

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

     

    谢谢关注。

  • 相关阅读:
    电商数据分析模型
    电商系统中的商品模型的分析与设计
    java枚举使用详解
    运用四色建模法进行领域分析
    UML,Powerdesigner 使用方法
    powerdsigner Association Multiplicity
    UML的类图、时序图表示方法以及惯例
    面向对象分析与设计—四色原型模式(彩色建模、领域无关模型)(概念版)
    知识读书笔记
    知识型读书笔记
  • 原文地址:https://www.cnblogs.com/c-xiaohai/p/6782985.html
Copyright © 2011-2022 走看看