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         }

 

posted @ 2018-01-09 12:19  胡子叔叔  阅读(8206)  评论(1编辑  收藏  举报