springboot实现公众号接入,遇到一直token认证失败的原因

1、封装微信加密认证工具类

public class CheckUtil {

	public static final String tooken = "pxtoken"; //开发者自行定义Tooken要与公众号平台输入的token保持一致
	
	public static boolean checkSignature(String signature, String timestamp, String nonce) {

        //1.定义数组存放tooken,timestamp,nonce
        String[] arr = new String[]{tooken, timestamp, nonce};

        //2.对数组进行排序
        Arrays.sort(arr);

        //3.生成字符串
        StringBuffer sb = new StringBuffer();

        for (String s : arr) {

            sb.append(s);
        }

        String temp = getSha1(sb.toString());   //加密成一个字符串再与signature对比

        logger.info("\n----------执行微信签名加密认证---------------"+temp.equals(signature));
        System.out.println("----------执行微信签名加密认证---------------"+temp.equals(signature));


        //5.将加密后的字符串,与微信传来的加密签名比较,返回结果
        return temp.equals(signature);
    }
	
	public static String getSha1(String str) {

        if (str == null || str.length() == 0) {

            return null;

        }

        char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',

                'a', 'b', 'c', 'd', 'e', 'f'};

        try {

            MessageDigest mdTemp = MessageDigest.getInstance("SHA1");

            mdTemp.update(str.getBytes("UTF-8"));


            byte[] md = mdTemp.digest();

            int j = md.length;

            char buf[] = new char[j * 2];

            int k = 0;

            for (int i = 0; i < j; i++) {

                byte byte0 = md[i];

                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];

                buf[k++] = hexDigits[byte0 & 0xf];

            }

            return new String(buf);

        } catch (Exception e) {

            // TODO: handle exception

            return null;

        }

    }
}

2、Controller层的代码

@Controller
public class Uhtml {
	@ResponseBody
    @GetMapping(value = "/wx/check",produces = "text/plain;charset=utf-8")
    public void wxCheck(@RequestParam(name = "signature", required = false) String signature,
                        @RequestParam(name = "timestamp", required = false) String timestamp,
                        @RequestParam(name = "nonce", required = false) String nonce,
                        @RequestParam(name = "echostr", required = false) String echostr,
                        HttpServletResponse response){

        System.out.println("-----------验证微信订阅号信息开始------------");
        logger.info("\n-----------验证微信订阅号信息开始------------");
        try {

            System.out.println("signature = "+signature);
            logger.info("\nsignature = "+signature);

            System.out.println("timestamp = "+timestamp);
            logger.info("\ntimestamp = "+timestamp);

            System.out.println("nonce = "+nonce);
            logger.info("\nnonce = "+nonce);

            System.out.println("echostr = "+echostr);
            logger.info("\nechostr = "+echostr);

            if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
                System.out.println("-----------验证微信订阅号信息结束------------");
                logger.info("\n-----------验证微信订阅号信息结束------------");
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
                out.write(echostr.getBytes());
                out.flush();
                out.close();
            }else{
                System.out.println("-----------不是微信服务器发送过来的请求------------");
                logger.info("\n-----------不是微信服务器发送过来的请求------------");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

3、为了避免修改代码后频繁的部署测试,我选用的是natapp实现内网穿透,natapp下载地址:https://natapp.cn/,根据自己实际情况下载对应版本。

在这里插入图片描述

4、下载完natapp客户端之后,还需要下载一个config.ini文件,如下图:

在这里插入图片描述

5、安装完之后需要先登录natapp,https://natapp.cn/官网右上角有登录,登进去之后购买免费隧道,如下图:

在这里插入图片描述

6、购买完之后点击我的隧道就可以查看到隧道信息,如下图:

在这里插入图片描述

7、进行隧道配置,如下图:

在这里插入图片描述

8、复制隧道authtoken,打开下载好的config.ini,将token复制到指定位置,如下图:

在这里插入图片描述

9、最后再双击下载好的natapp.exe客户端启动,至此我们已经实现了内网穿透,可以通过本地映射出来的地址进行外网访问,如图所示:

在这里插入图片描述

10、最后一步就是登录微信公众号平台就可以进行微信公众号接入的配置了,URL填写自己编写的公众号接入接口地址,token比自己代码中设置的常量保持一致,加密规则可以使用随机生成,因为这里点击提交后,微信服务会去调用我们填写的接口地址进行认证(需外网,所以先实现内网穿透)如下图:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值