Java微信公众号服务器配置-验证Token

一、填写服务器配置

首先我们需要在微信公众平台上填写服务器配置

重点内容

服务器地址URL(一定要外网能访问的到)
        在我们提交配置的时候,微信会发送GET请求到URL上,
        并会携带 signature,timestamp,nonce,echostr 四个参数,
        我的URL是 http://www.baidu.com/wxpublic/verify_wx_token,
        也就是 域名 + 接口 路径,至于怎么验证,我会在下面说到
        signature: 微信加密签名,signature结合了我们自己填写的token参数和请求中的timestamp参数、nonce参数
        timestamp: 时间戳
        nonce: 字符串
        echostr: 随机字符串
    令牌Token
        Token 可由我们自行定义,主要作用是参与生成签名,与微信请求的签名进行比较
    消息加解密密钥EncodingAESKey
        EncodingAESKey 可由我们自行定义或随机生成,主要作用是参与接收和推送给公众平台消息的加解密
    消息加解密方式
        此处我选择的是安全模式,大家可以根据自己的具体需求,选择相应的模式

二、代码验证

@RequestMapping("/wxpublic/verify_wx_token")
@ResponseBody
    public String verifyWXToken(HttpServletRequest request) throws AesException {
        String msgSignature = request.getParameter("signature");
        String msgTimestamp = request.getParameter("timestamp");
        String msgNonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        if (WXPublicUtils.verifyUrl(msgSignature, msgTimestamp, msgNonce)) {
            return echostr;
        }
        return null;
    }

WXPublicUtils

public class WXPublicUtils {

/**
     * 验证Token
     * @param msgSignature 签名串,对应URL参数的signature
     * @param timeStamp 时间戳,对应URL参数的timestamp
     * @param nonce 随机串,对应URL参数的nonce
     *
     * @return 是否为安全签名
     * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
     */
    public static boolean verifyUrl(String msgSignature, String timeStamp, String nonce)
            throws AesException {
        // 这里的 WXPublicConstants.TOKEN 填写你自己设置的Token就可以了
        String signature = SHA1.getSHA1(WXPublicConstants.TOKEN, timeStamp, nonce);
        if (!signature.equals(msgSignature)) {
            throw new AesException(AesException.ValidateSignatureError);
        }
        return true;
    }
}

AesException

@SuppressWarnings("serial")
public class AesException extends Exception {

public final static int OK = 0;
    public final static int ValidateSignatureError = -40001;
    public final static int ParseXmlError = -40002;
    public final static int ComputeSignatureError = -40003;
    public final static int IllegalAesKey = -40004;
    public final static int ValidateAppidError = -40005;
    public final static int EncryptAESError = -40006;
    public final static int DecryptAESError = -40007;
    public final static int IllegalBuffer = -40008;
    public final static int EncodeBase64Error = -40009;
    public final static int DecodeBase64Error = -40010;
    public final static int GenReturnXmlError = -40011;

private int code;

private static String getMessage(int code) {
        switch (code) {
        case ValidateSignatureError:
            return "签名验证错误";
        case ParseXmlError:
            return "xml解析失败";
        case ComputeSignatureError:
            return "sha加密生成签名失败";
        case IllegalAesKey:
            return "SymmetricKey非法";
        case ValidateAppidError:
            return "appid校验失败";
        case EncryptAESError:
            return "aes加密失败";
        case DecryptAESError:
            return "aes解密失败";
        case IllegalBuffer:
            return "解密后得到的buffer非法";
        case EncodeBase64Error:
            return "base64加密错误";
        case DecodeBase64Error:
            return "base64解密错误";
        case GenReturnXmlError:
            return "xml生成失败";
        default:
            return null;
        }
    }

public int getCode() {
        return code;
    }

public AesException(int code) {
        super(getMessage(code));
        this.code = code;
    }
}

SHA1

public class SHA1 {

/**
     * 用SHA1算法验证Token
     *
     * @param token     票据
     * @param timestamp 时间戳
     * @param nonce     随机字符串
     * @return 安全签名
     * @throws AesException
     */
    public static String getSHA1(String token, String timestamp, String nonce) throws AesException {
        try {
            String[] array = new String[]{token, timestamp, nonce};
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // SHA1签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

StringBuffer hexstr = new StringBuffer();
            String shaHex = "";
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            return hexstr.toString();
        } catch (Exception e) {
            e.printStackTrace();
            throw new AesException(AesException.ComputeSignatureError);
        }
    }
}

Java微信公众号配置验证Token相关推荐

  1. 阿里云服务器+微信公众号配置(Token验证不通过)

    推荐使用CentOS操作系统,本人在使用Ubuntu操作系统时安装第三方软件不是很顺利,导致在微信公众号服务器配置的Token验证失败不通过上浪费大量时间. 以下是 CentOS 和 Ubuntu的介 ...

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

    服务器验证Token验证分为以下及步骤 一,在微信公众号平台上设置 1.1打开微信公众号平台 1.2打开"开发"中的<基本配置> 1.3点击基本配置页面里的修改配置 1 ...

  3. Java微信公众号服务器配置/硬件平台服务器配置-验证Token

    最近在做微信硬件平台的东东,刚开始,没搞过, 先踩微信公众号服务器配置的坑吧! 首先进入微信公众平台->开发基本配置. 看看都需要啥子参数(先不填写): 1.你的服务器地址, 2.令牌Token ...

  4. java-微信公众号服务器配置验证token

    微信公众号服务器配置验证token @GetMapping("/demo3")public String demo3(String timestamp, String nonce, ...

  5. Java微信公众号开发(一:接入平台,验证token)

    Java微信公众号开发(一:接入平台,验证token) 开发环境: 环境:JDK1.8 框架:springBoot 首先,在我们接入微信公众平台之前,我们需要注册微信公众号的开发者账号,获取开发者ID ...

  6. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  7. 微信公众号配置JAVA

    微信公众号配置 step1:填写服务器配置 开发者文档:公众平台后台管理页面 - 开发者中心页,点击"修改配置"按钮,填写服务器地址(URL).Token和EncodingAESK ...

  8. 微信公众号修改服务器配置token验证失败

    @微信公众号修改服务器配置token验证失败 微信公众号修改服务器配置token验证失败 新建SignUtil类 public class SignUtil {// 与接口配置信息中的 Token 要 ...

  9. 微信公众号配置token

    1.在微信公众平台开发-基本设置页面,点击"修改配置"按钮,填写服务器地址(URL).Token和EncodingAESKey. token可以任意填写,对应验证的token,UR ...

最新文章

  1. Lua生成Guid(uuid)
  2. Exchange 2007迁移2010时的公用文件夹多个公用树错误
  3. centos误删除文件如何恢复
  4. dw超链接标签_小花园DW学习笔记
  5. ubuntu18系统搭建ftp服务器详解
  6. python使用matplotlib绘制k线图
  7. 计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc
  8. 赋能零售成长型企业营销增长,云徙「数盈·新营销中台」发布
  9. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
  10. loj 6083.「美团 CodeM 资格赛」数码
  11. 首届国际数字科技节启动仪式暨主办单位战略合作签约仪式在京举行
  12. python连接微信运动_怎样读取微信运动数据接口?
  13. 闪寸 U盘 检测工具 量产工具
  14. Complier Validation via Equivalence Modulo Inputs
  15. SpringBoot单元测试RunWith注解无法解析
  16. 专访|搜狐媒体UED设计总监李伟巍:如何做好UED设计
  17. 使用resetFields点击取消时,没有清空「el-form」的内容
  18. Android微信通讯录界面代码,Android中使用Expandablelistview实现微信通讯录界面
  19. keep跑步截图生成器ios_主题月活动 |『公装跑步月』突破自我 票选邀您来参与!...
  20. 【数据集NO.1】最经典大规模、多样化的自动驾驶视频数据集——BDD100K数据集

热门文章

  1. jquery之onblur事件
  2. 华为你学不会思维脑图
  3. mac PHP开发环境搭建abc
  4. “白眉”Paimei安装使用手册
  5. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式
  6. 王老吉也玩元宇宙?发言要成为“全球饮料NO.1”
  7. 利用永恒之蓝渗透WIN7
  8. MongoDB中$redact操作符的使用
  9. 【每日新闻】2017年漏洞披露数量创纪录达20,832个 | 朱啸虎评ICO:考验人性的模式从来就没有成功过
  10. python英英字典开发过程中学到的tkFont的使用