Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 6777|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-8 09:27:28 | 显示全部楼层 |阅读模式

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

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 03:05 , Processed in 0.072454 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表