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

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

谢谢关注。

时间: 2024-10-18 01:03:20

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

微信公众平台开发者模式自动回复功能与自定义菜单

微信开发者模式自动回复功能 1.提取POST来的数据中的信息 2.判断微信客户端发来的信息内容(以文本信息为例) 3.根据信息内容进行处理 4.把处理结果以XML的形式返回给微信服务器 5.微信服务器反馈内容给微信客户端 1.获取用户发来的文本信息的内容 private void ExtractPostData() /*** 提取POST来的数据中的信息 ***/ { Stream s = HttpContext.Current.Request.InputStream; //读取post来的数据

C#微信公众平台开发者模式开启代码

using System;using System.IO;using System.Text;using System.Web.Security; namespace HPZJ.Web.sys.excel{    public partial class hpd_api_weixin : System.Web.UI.Page    {        const string Token = "token";  //你的token        protected void Page_L

MVC下c#对接微信公众平台开发者模式

在ashx文件中进行HttpContext的处理: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Biz.WX; namespace weixinplat { /// <summary> /// WeiXin 的摘要说明 /// </summary> public class WeiXin : IHttpHandler { public void

CentOS7+Python3.6利用web.py库进行微信公众平台服务器简易配置,token验证

1.安装配置Python CentOS7 自带 Python2.7, 我用的是Python3.6.5,需要CentOS7安装配置Python3并和Python2共存的,请看以下教程: CentOS7安装配置Python3.6.5 2.安装web.py pip install web.py 可以换国内源下载,速度比较快 3.安装libxml2, libxslt, lxml python yum install libxml2 yum install libxslt yum install lxml

微信公众平台开发者文档

微信公众平台开发者文档 公众平台开发接口介绍微信公众平台开发者文档,布布扣,bubuko.com

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

p.p1 { margin: 13.0px 0.0px 13.0px 0.0px; text-align: justify; font: 16.0px SimSun } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px SimSun } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times N

.Net程序员关于微信公众平台测试账户配置 项目总结

今天项目第一次验收,夜晚吃过晚饭后,想把项目中用到的关于微信配置总结一下,虽然网上关于这方面的资料很多很多,还有官方API,但是总感觉缺点什么,就像期初做这个项目时,各方面找了很久的资料,说说配置吧! 1.你必须有一个微信可以访问的网站,然后有一个公众账户. 2.成为开发者. 上面这个URL填写你的网站的链接,微信服务器会放这个URL推送一些验证信息,具体验证信息,你可以查看官方API,写的很详细,因为我用的是MVC,所以我写了一个类,让控制器继承这个类,源码贴下,大家一看就明白.还有这个URL

微信二次开发SDK

微信二次开发sdk,微信开发sdk,云控微信开发SDK 服务端调用接口目录 1.基础消息类型 1.客户端发送的心跳包 HeartBeatReq = 1001; 2.消息接收确认回复(接收或拒绝接收) MsgReceivedAck = 1002; 3.错误单独提升为一种消息类型 Error = 1003; 2.设备客户端授权类消息 1.设备(手机客户端.客服客户端)获取通信token请求 DeviceAuthReq = 1010; 2.设备(手机客户端.客服客户端)获取通信token响应 Devi

软件二次开发的系统平台

二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能,一般来说都不会改变原有系统的内核.一般的来说,一些大公司如IBM开发了一个大型的软件系统平台,根据不同的客户的需要,一些其它的中小公司为客户根据需求在该平台上进行第二次有针对性的开发.是否提供相应的接口,有的软件公司只提供软件,但也有小公司连代码一起出售,如是后者,就更方便进行二次开发.比如售票系统,车站里面弄好了,提供几个储存过程给银行,银行就可以代理售票了,这也是一种,还有一种如我们利用delphi,C#等