微信公众号token 验证

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";
}
时间: 2024-11-12 12:35:53

微信公众号token 验证的相关文章

Thinkphp5 微信公众号token验证不成功的原因

最近要启动微信项目,上个月就开始了解微信的开发,这个月要启动项目,配置微信公众号信息一直失败.为此,我甚至手工写了微信提交过来的记录,如: &timestamp=1510210523&nonce=2414550015&signature=30b9eeb6b1134d0a53623375c48ca734c41facb5&echostr=6863786913073725439 我眼睛看着验证信息没错,输出的echostr跟get提交来的一模一样,但是还是会出错.忍无可忍,一直无

自己的服务器通过微信公众号Token验证测试的代码(Python版)

我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意把Token的值改成你自己的值,然后在微信后台填对你的服务器的公网IP,提交就可以通过验证了 #coding=utf-8 html = '''True ''' import socket import signal import errno import re import os import ha

asp.net mvc 微信公众号token验证

本人的公众号要申请成为开发者,必须经过token认证.微信公众号的官方代码只列出了PHP代码的实例,明显是歧视.net用户.我用的asp.net mvc中的web api,结果调了好久都没有成功,最后发现只要下面几句即可: public void Get() { string temp = HttpContext.Current.Request.QueryString["echostr"]; HttpContext.Current.Response.Write(temp); HttpC

php:微信公众号token验证失败原因、验证码显示不出来的问题

ob_clean(); 问题描述: 用微信官方提供的demo验证token是成功的,但是放到自己网站的框架上进行token验证老是提示"token验证失败",经过检查(用生成日志的方式一步步检查的),地址,token信息,微信....等待账号信息是没有任何问题的. 解决方案: 最终在echo $_GET['echostr'];前添加了一句代码ob_clean();把问题搞定. 问题分析: 因为用的是框架,在echo $_GET['echostr'];之前可能有一些你不知道的输出到&qu

微信公众号服务器验证Token的完整步骤

服务器验证Token验证分为以下及步骤 一,在微信公众号平台上设置 1.1打开微信公众号平台 1.2打开”开发“中的<基本配置> 1.3点击基本配置页面里的修改配置 1.4输入URL: url填写:http://外网IP:端口号/wx .外网IP请到腾讯云购买成功处查询, http的端口号固定使用80,不可填写其他. Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事.这个token只用于验证开发者服务器.(注:Token可以随便写  写完记住留着

微信公众平台——token验证php版

这几天开始接触微信公众号的开发,注册这些就不说了,我是先弄了个测试号用着.进入正题 所谓token验证,其实就是微信服务器向自己要用到的服务器url发送一段数据,其中有一个参数$_GET['echhostr'],这个参数在经过一系列逻辑判断后再原封不动返回给微信也就是 echo $_GET['echhostr']; 碰到的一些小问题解决方法如下: 1.微信开发后台上的token要与php代码中定义的一致: 2.加header('content-type:text'); 3.还不行就加 ob_cl

django搭建微信公众号后台——验证(7.19)

php研究了好几个框架,感觉还是django强大,用起来也顺手,虽然django在微信后台这方面用得没有那么普及,但还是打算试一试,拿我自己的公众号试手. 今天主要是创建项目然后验证通过,代码还是放在pythonanywhere上. 具体怎么创建就不写了,之前有过一篇文章,这里开发用了星星的wechat-python-sdk. 在微信后台填了网址之后,在urls.py设置路由 url(r'^$', index, name='index'), 在views.py里进行验证: #-*- coding

微信公众平台Token验证失败的解决办法

1.可查看url和token是否正确 2.查看服务器端口是否为80端口 3.你可以通过记录log日志来判断是否接受到微信提交过来的信息 1.$fp=fopen("log.txt","w+");2.$strText='http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\r\n";3.fwrite($fp,$strText); 把上述代码粘贴到private function checkS

微信公众号接入服务器验证(Go实现)

1 基本流程 将token.timestamp.nonce三个参数进行字典序排序 将三个参数字符串拼接成一个字符串进行sha1加密 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 2 请求参数 参数 描述 signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数.nonce参数. timestamp 时间戳 nonce 随机数 echostr 随机字符串 3 注册页面填写 URL填写:http://IP地址:监