微信公众号token 验证

news/2024/7/2 23:32:44

1. 首先给出测试项目的整体目录:

:

2. CoreServlet类:

当get请求的时候会执行get方法,post请求的时候会执行post方法,分别来处理不同的请求

package com.zjn.servlet;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; import com.zjn.util.SignUtil; /** * 核心请求处理类 * */ @SuppressWarnings("serial") public class CoreServlet extends HttpServlet { /** * 确认请求来自微信服务器 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); System.out.println("微信服务验证成功!"); } out.close(); out = null; } /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }

 

3. SignUtil类:

上面类中用到了SignUtil 类,用来验证签名

package com.zjn.util;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;import com.zjn.constants.Constant; /** * 请求校验工具类 * */ public class SignUtil { /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { Constant.TOKEN, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } } 

 

4.Constant.java

我们看到 checkSignature 这个方法里使用到了Constant.TOKEN ,这个token,我声明的一个常量,放在Constant.Java这个类里面, 要与微信配置接口里面的token值一样。

package com.zjn.constants;public class Constant { // 与接口配置信息中的Token要一致 public final static String TOKEN = "tongchema163"; }

 

转载于:https://www.cnblogs.com/CaptainLin/p/7133407.html


http://lihuaxi.xjx100.cn/news/241464.html

相关文章

docker安装mysql5.7_超详细Docker安装Mysql5.7并进行挂载

1、下载mysql 5.7镜像docker pull mysql:5.72、创建mysql容器并启动docker run -d -p 3306:3306 -e MYSQL_USER"ppx" -e MYSQL_PASSWORD"123456" -e MYSQL_ROOT_PASSWORD"123456" --name mysqltest1 mysql:5.7 --character-set-serverutf8 --col…

PAT 显示格式错误

记录一&#xff1a; 2021/7/8 10:26 代码逻辑写错了&#xff0c;一个该没有空格的地方也加了空格

redhat6.5 yum源

首先在自己的电脑上安装Redhat6.5&#xff08;本经验用的是Redhat6.5-64位的系统&#xff09;&#xff0c;然后把Redhat6.5系统ISO镜像文件放到自己的电脑中&#xff08;本经验是放在/root 下&#xff0c;切记自己的存放路经&#xff0c;以后不要再变动此路径和移动ISO文件&…

c程序设计语言_习题8-4_重新实现c语言的库函数fseek(FILE*fp,longoffset,intorigin)

fseek库函数 #include <stdio.h> int fseek(FILE *stream, long int offset, int origin); 返回&#xff1a;成功为0&#xff0c;出错为非0 对流stream相关的文件定位&#xff0c;随后的读写操作将从新位置开始。 对于二进制文件&#xff0c;此位置被定位在由origin开…

centos 7.2 yum mysql_20191209_Centos7.2使用yum安装mysql

1. 下载mysql的rpm包[rootizwz91qnvovd6suufon1ccz ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm2. 安装rpm包[rootizwz91qnvovd6suufon1ccz ~]# yum localinstall -y mysql57-community-release-el7-7.noarch.rpm3. 安装mysql 5.7[rootizwz…

python基本数据类型之序列类型和映射类型

序列类型&#xff1a;字符串/元组/列表 映射类型&#xff1a;字典 更正&#xff1a;&#xff1a;三引号也可以用来表示字符串&#xff0c;并且有额外用途&#xff1a;①搞定多行字符串 ②内用单引号和双引号 列表可以根据内容得到索引 有多个相同内容时根据第一个得到下标

spring读取配置文件的几种方式

场景 假如有以下属性文件dev.properties, 需要注入下面的tag tag123 通过PropertyPlaceholderConfigurer <bean class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name"location" value"dev.prop…

mysql5.6 thread pool_mysql5.6 thread pool

从percona 的压测来看&#xff0c;确实很牛笔啊。提升很大。http://www.mysqlperformanceblog.com/2014/01/29/percona-server-thread-pool-improvements/当然&#xff0c;他指出目前mysql5.6 有2套thread pool &#xff0c;一套是mysql企业版里面的&#xff0c;另外一套是mari…