微信公众平台Token验证
2015-12-16 19:31
609 查看
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"; }
5.web.xml的配置
<?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" xmlns:web="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_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>coreServlet</servlet-name> <servlet-class>com.zjn.servlet.CoreServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>coreServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
6.index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>微信公共平台开发者接口</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>仝家班微信公共平台开发者接口</h1> </body> </html>
7.测试
我们的代码已经写完了,现在访问请求地址试试,如果报错如下,说明代码没问题了,然后需要将代码发布到外网上,再把上面填的Token,和外网的URL在微信公众平台进行配置就好了。8.源码地址
相关文章推荐
- H5活动页面遇到的坑+微信分享代码
- 微信分享自定义图片
- SAE+Servlet+JSP实现微信公众平台OAuth2.0网页授权的使用
- Android之微信支付功能
- 36选7小程序
- 腻人的微信营销
- 手把手教你微信支付
- 微信企业号开发八:JSAPI模式之身份验证接口
- Android ActionBar应用实战,高仿微信主界面的设计
- 微信企业号开发七:JSAPI模式
- android集成支付,支付宝,微信
- 微信企业号开发六:回调模式之消息回复
- 微信移动支付V3开发详细教程服务端采用.net mvc webapi(C#)
- 防微信底部标题栏
- 透彻分析微信公众平台三大矛盾
- 玩转AWS CloudWatch微信告警
- 玩转AWS CloudWatch微信告警
- 微信朋友圈技术之道:三个人的后台团队与每日十亿的发布量
- 微信企业号开发五:回调模式
- Android 微信抢红包插件