您的位置:首页 > 移动开发 > 微信开发

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

2020-02-04 18:56 387 查看

本文引自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         }

 

转载于:https://www.cnblogs.com/bearduncle/p/8250830.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
a540216759 发布了0 篇原创文章 · 获赞 0 · 访问量 129 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: