微信二次开发 之 公众平台开发者模式配置与请求验证

Posted C小海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信二次开发 之 公众平台开发者模式配置与请求验证相关的知识,希望对你有一定的参考价值。

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("\\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.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怎么实现

微信二次分享

微信二次开发SDK

微信二次开发 之 微信文本消息接口实现

微信二次开发 之 微信接口凭证的获取

微信二次分享不显示摘要和图片的解决方法