springboot的微信公众号(三)微信接入验证

首先pom依赖,你可以直接全部复制进去

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example.weixin</groupId>
	<artifactId>wx-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>wx-demo</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-tomcat</artifactId>
		    <scope>compile</scope>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
		
		<!-- aop依赖 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
		
		<!-- alibaba data source 相关jar包-->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>0.2.23</version>
     </dependency>
     
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		<dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
            </dependency>
            
            <dependency>
			      <groupId>com.thoughtworks.xstream</groupId>
			      <artifactId>xstream</artifactId>
			      <version>1.4.9</version>
			</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

application.properties配置文件

server.port = 8080
server.context-path = /wx-demo
spring.datasource.druid=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/wxtest
spring.datasource.username=root
spring.datasource.password=123456

这里的数据库配置暂时没有用,可以先放着,如果你想接入数据库,可以直接接入

启动类

package com.example.weixin.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WxDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(WxDemoApplication.class, args);
	}
}

注意:如果配置了数据库文件,需要在建立相应的数据库,否则会报错

这个时候应该能正常启动了。

 

下面进行接入:

官方文档上面指出,需要四个参数,然后是get请求,参数需要加密的

接入代码如下:

@RequestMapping(value="/wx",method={RequestMethod.GET,RequestMethod.POST})
	public void wxLogin(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{
		//设置编码,不然接收到的消息乱码
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		String signature = request.getParameter("signature");//微信加密签名
		String timestamp = request.getParameter("timestamp");//时间戳
		String nonce = request.getParameter("nonce");//随机数
		String echostr = request.getParameter("echostr");//随机字符串
		PrintWriter out = null;
			//接入验证
			  if(WeiXinUtil.checkSignature(signature, timestamp, nonce)){
				  if (echostr!=null) {
					  System.out.println(echostr);
					  try {
						out = response.getWriter();
					} catch (IOException e) {
						e.printStackTrace();
					}
					  out.write(echostr);//验证成功返回的值
					  return;
				}

校验代码

/**
	 * 
	 * @param signature 微信加密签名
	 * @param timestamp 时间戳
	 * @param nonce 随机数
	 * @return
	 */
	public static boolean checkSignature(String signature,String timestamp,String nonce){
		String[] str = new String[]{token,timestamp,nonce};
		//排序
		Arrays.sort(str);
		//拼接字符串
		StringBuffer buffer = new StringBuffer();
		for(int i =0 ;i<str.length;i++){
			buffer.append(str[i]);
		}
		//进行sha1加密
		String temp = SHA1.encode(buffer.toString());
		//与微信提供的signature进行匹对
		return signature.equals(temp);
	}
private static final String token = "mytoken123456";//自己在微信测试平台设置的token

加密比对代码

/**
 * sha1加密
 * @author Administrator
 *
 */
public final  class SHA1 {
	 private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',  
         '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
	
	/** 
	* Takes the raw bytes from the digest and formats them correct. 
	* 
	* @param bytes the raw bytes from the digest. 
	* @return the formatted bytes. 
	*/  
	private static String getFormattedText(byte[] bytes) {  
		int len = bytes.length;  
		StringBuilder buf = new StringBuilder(len * 2);  
		// 把密文转换成十六进制的字符串形式  
		for (int j = 0; j < len; j++) {  
		buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);  
		buf.append(HEX_DIGITS[bytes[j] & 0x0f]);  
		}  
		return buf.toString();  
	}  
	
	public static String encode(String str) {  
		if (str == null) {  
		return null;  
		}  
		try {  
		MessageDigest messageDigest = MessageDigest.getInstance("SHA1");  
		messageDigest.update(str.getBytes());  
		return getFormattedText(messageDigest.digest());  
		} catch (Exception e) {  
		throw new RuntimeException(e);  
		}  
	}  

如果,校验成功就会在这里

springboot的微信公众号(三)微信接入验证

弹出配置成功

同时,这里

springboot的微信公众号(三)微信接入验证

也会显示成功的,一般不会失败,如果失败就慢慢排查。