zoukankan      html  css  js  c++  java
  • java微信公众号开发token验证失败的问题及解决办法

    本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424

    微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示token验证失败,是因为微信后台并未检测到你代码中有验证token的代码,那么应该按照官方文档对token进行验证,验证后再将结果返回微信公众平台即可。

    验证的代码为:

     1 public class SignUtil {
     2     
     3     private static String token = "WnbVm6GTQj4BPmLliSday4K";//这里是自定义的token,需和你提交的token一致
     4 
     5     /**
     6      * 校验签名
     7      * 
     8      * @param signature
     9      *            签名
    10      * @param timestamp
    11      *            时间戳
    12      * @param nonce
    13      *            随机数
    14      * @return 布尔值
    15      */
    16     public static boolean checkSignature(String signature, String timestamp, String nonce) {
    17         String checktext = null;
    18         if (null != signature) {
    19             // 对ToKen,timestamp,nonce 按字典排序
    20             String[] paramArr = new String[] { token, timestamp, nonce };
    21             Arrays.sort(paramArr);
    22             // 将排序后的结果拼成一个字符串
    23             String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
    24 
    25             try {
    26                 MessageDigest md = MessageDigest.getInstance("SHA-1");
    27                 // 对接后的字符串进行sha1加密
    28                 byte[] digest = md.digest(content.toString().getBytes());
    29                 checktext = byteToStr(digest);
    30             } catch (NoSuchAlgorithmException e) {
    31                 e.printStackTrace();
    32             }
    33         }
    34         // 将加密后的字符串与signature进行对比
    35         return checktext != null ? checktext.equals(signature.toUpperCase()) : false;
    36     }
    37 
    38     /**
    39      * 将字节数组转化为16进制字符串
    40      * 
    41      * @param byteArrays
    42      *            字符数组
    43      * @return 字符串
    44      */
    45     private static String byteToStr(byte[] byteArrays) {
    46         String str = "";
    47         for (int i = 0; i < byteArrays.length; i++) {
    48             str += byteToHexStr(byteArrays[i]);
    49         }
    50         return str;
    51     }
    52 
    53     /**
    54      * 将字节转化为十六进制字符串
    55      * 
    56      * @param myByte
    57      *            字节
    58      * @return 字符串
    59      */
    60     private static String byteToHexStr(byte myByte) {
    61         char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    62         char[] tampArr = new char[2];
    63         tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
    64         tampArr[1] = Digit[myByte & 0X0F];
    65         String str = new String(tampArr);
    66         return str;
    67     }
    68 
    69 }

    提交时公众平台会请求你的地址,并校验你是否在后台做了验证,验证部分:

     1         if (StringUtils.isNotBlank(request.getParameter("signature"))) {
     2             String signature = request.getParameter("signature");
     3             String timestamp = request.getParameter("timestamp");
     4             String nonce = request.getParameter("nonce");
     5             String echostr = request.getParameter("echostr");
     6             LOGGER.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
     7             if (SignUtil.checkSignature(signature, timestamp, nonce)) {
     8                 LOGGER.info("数据源为微信后台,将echostr[{}]返回!", echostr);
     9                 response.getOutputStream().println(echostr);
    10             }
    11         }
  • 相关阅读:
    7. Reverse Integer
    4. Median of Two Sorted Arrays
    微服务实战系列(四)-注册中心springcloud alibaba nacos-copy
    微服务实战系列(五)-注册中心Eureka与nacos区别-copy
    Restful、SOAP、RPC、SOA、微服务之间的区别-copy
    从SOA到RPC、SOAP、REST-copy
    spring-session实现分布式集群session的共享-copy
    深入理解 RESTful Api 架构-copy
    RESTful 架构详解-copy
    SpringBoot使用MyBatis-Generator详解-copy
  • 原文地址:https://www.cnblogs.com/bearduncle/p/8250830.html
Copyright © 2011-2022 走看看