Java 实现关注微信公众号动态获取验证码

news2024/9/28 5:32:18

大家好,我是程序猿小张

前言

个人博客今天上线一个文章私密的功能,该功能需要通过关注公众号来获取验证码,通过正确的验证码才能来查阅文章,具体效果如下图。
在这里插入图片描述
在这里插入图片描述
我感觉还蛮有意思的就决定把这个写出来,供大家去使用,下面来讲讲我的具体实现。

一、首先需要自行前往微信公众平台创建公众号(博主已经有公众号就不在进行讲解这一步了)

二、 在公众号平台选择基础配置进行服务器的配置,如下图

在这里插入图片描述

  • url:填写你后端的接口地址,get请求
  • token:自己随便定义一个
  • EncodingAESKey:可以自己选择也可以随机生成
  • 加解密方式:根据自己的实际情况来选择

三、controller层代码

 @ApiOperation("微信公众号服务器配置校验token")
    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public void checkToken(HttpServletRequest request, HttpServletResponse response) {
        //token验证代码段
        try {
            log.info("请求已到达,开始校验token");
            if (StringUtils.isNotBlank(request.getParameter("signature"))) {
                String signature = request.getParameter("signature");
                String timestamp = request.getParameter("timestamp");
                String nonce = request.getParameter("nonce");
                String echostr = request.getParameter("echostr");
                log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
                if (WeChatUtil.checkSignature(signature, timestamp, nonce)) {
                    log.info("数据源为微信后台,将echostr[{}]返回!", echostr);
                    BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
                    out.write(echostr.getBytes());
                    out.flush();
                    out.close();
                }
            }
        } catch (IOException e) {
            log.error("校验出错");
            e.printStackTrace();
        }
    }

四、.WeChatUtil代码,需要注意此类里面的token需要与公众号平台填写的token一致

private static String token = "demo123456";

    private static final Logger LOGGER = LoggerFactory.getLogger(WeChatUtil.class);

    /**
     * 校验签名
     * @param signature 签名
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @return 布尔值
     */
    public static boolean checkSignature(String signature,String timestamp,String nonce){
        String checktext = null;
        if (null != signature) {
            //对ToKen,timestamp,nonce 按字典排序
            String[] paramArr = new String[]{token,timestamp,nonce};
            Arrays.sort(paramArr);
            //将排序后的结果拼成一个字符串
            String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);

            try {
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                //对接后的字符串进行sha1加密
                byte[] digest = md.digest(content.getBytes());
                checktext = byteToStr(digest);
            } catch (NoSuchAlgorithmException e){
                e.printStackTrace();
            }
        }
        //将加密后的字符串与signature进行对比
        return checktext !=null ? checktext.equals(signature.toUpperCase()) : false;
    }

    /**
     * 将字节数组转化我16进制字符串
     * @param byteArrays 字符数组
     * @return 字符串
     */
    private static String byteToStr(byte[] byteArrays){
        String str = "";
        for (int i = 0; i < byteArrays.length; i++) {
            str += byteToHexStr(byteArrays[i]);
        }
        return str;
    }

    /**
     *  将字节转化为十六进制字符串
     * @param myByte 字节
     * @return 字符串
     */
    private static String byteToHexStr(byte myByte) {
        char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        char[] tampArr = new char[2];
        tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
        tampArr[1] = Digit[myByte & 0X0F];
        String str = new String(tampArr);
        return str;
    }

需要注意在公众号平台提交服务器配置时这些代码需要部署上线,否则会token失效。以上代码可直接复制,经过博主测试不会存在token失效问题。下面讲一下如何通过关键词来实现自动回复功能

五、pom.xml引入依赖

  		<dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

六、同样的是controller层添加如下代码

@ApiOperation("处理微信服务器的消息转发")
    @PostMapping(value = "test")
    public String  wechat(HttpServletRequest request) throws Exception {
        // 调用parseXml方法解析请求消息
        Map<String,String> requestMap = WeChatUtil.parseXml(request);
        // 消息类型
        String msgType = requestMap.get("MsgType");
        // xml格式的消息数据
        String respXml = null;
        String mes = requestMap.get("Content");
        // 文本消息
        if ("text".equals(msgType) && "验证码".equals(mes)) {
            String code = RanDomUtil.generationNumber(6);
            respXml=WeChatUtil.sendTextMsg(requestMap,code);
            redisCache.setCacheObject(RedisConstants.WECHAT_CODE+code,code,30, TimeUnit.MINUTES);
        }
        return respXml;
    }

此处需要注意 此接口和前面校验token的接口请求方式不同,这里是post请求,前面校验token是get请求,这里的接口地址不能乱写,需要和公众号平台填写的url相同,也就是前面校验token和这里接收请求的接口一致,只是请求方式不同

七、WeChatUtil添加如下代码

 /**
     * 解析微信发来的请求(xml)
     *
     * @param request
     * @return
     * @throws Exception
     */
    public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
        LOGGER.info("请求已到达,开始解析参数...");

        // 将解析结果存储在HashMap中
        Map<String,String> map = new HashMap<>();

        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList) {
            map.put(e.getName(), e.getText());
        }

        // 释放资源
        inputStream.close();
        LOGGER.info("参数解析完成。{}",map);
        return map;
    }
    /**
     * 回复文本消息
     * @param requestMap
     * @param content
     * @return
     */
    public static String sendTextMsg(Map<String,String> requestMap,String content){

        Map<String,Object> map= new HashMap<>();
        map.put("ToUserName", requestMap.get("FromUserName"));
        map.put("FromUserName",  requestMap.get("ToUserName"));
        map.put("MsgType", "text");
        map.put("CreateTime", new Date().getTime());
        map.put("Content", content);
        return  mapToXML(map);
    }
    public static String mapToXML(Map map) {
        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        mapToXML2(map, sb);
        sb.append("</xml>");
        LOGGER.info("请求完成,返回参数:{}",sb);
        try {
            return sb.toString();
        } catch (Exception e) {
        }
        return null;
    }
    private static void mapToXML2(Map map, StringBuffer sb) {
        Set set = map.keySet();
        for (Iterator it = set.iterator(); it.hasNext();) {
            String key = (String) it.next();
            Object value = map.get(key);
            if (null == value)
                value = "";
            if (value.getClass().getName().equals("java.util.ArrayList")) {
                ArrayList list = (ArrayList) map.get(key);
                sb.append("<" + key + ">");
                for (int i = 0; i < list.size(); i++) {
                    HashMap hm = (HashMap) list.get(i);
                    mapToXML2(hm, sb);
                }
                sb.append("</" + key + ">");

            } else {
                if (value instanceof HashMap) {
                    sb.append("<" + key + ">");
                    mapToXML2((HashMap) value, sb);
                    sb.append("</" + key + ">");
                } else {
                    sb.append("<" + key + "><![CDATA[" + value + "]]></" + key + ">");
                }

            }

        }
    }

OK,大功告成,以上只是讲解了自动回复文本类型的功能,其他类型功能以后在进行讲解或可自行百度 最后献上完成的示例图
在这里插入图片描述
Bye~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712134.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3.0数字货币有哪些?

Web3.0的到来为数字货币带来了全新的发展机遇&#xff0c;它不仅仅是加密货币的进化版&#xff0c;更是一种去中心化、可编程性和自治性的数字资产。 在这个新的数字经济时代&#xff0c;Web3.0数字货币成为了金融革命的核心。本文将介绍一些重要的Web3.0数字货币&#xff0c;…

基于SpringBoot+vue的新生宿舍管理系统设计与实

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

基于Servlet的CRM客户关系管理系统

1.需求分析 客户是公司最宝贵的资源&#xff0c;为了更好的发掘老客户的价值,并开发更多新客户,公司实施客户关系管理系统。系统的功能是:通过这个系统完成对员工基本信息、客户基本信息、交往信息、客户服务信息的充分共享和规范化管理;通过对销售机会、客户开发过程的追踪和…

服务器配置静态IP

服务器配置静态IP 一、前期准备二、配置静态IP 将服务器配置为使用静态IP地址。这将使服务器拥有一个永久的IP地址&#xff0c;而不会在每次启动时更改。为此&#xff0c;您需要编辑网络配置文件并将服务器的IP地址添加到其中。详细步骤如下&#xff1a; 一、前期准备 请在配置…

Docter容器

轻量&#xff0c;高效&#xff0c;敏捷 本质是进程&#xff0c;所以才轻量&#xff0c;namespace隔离资源&#xff0c;cgroups资源限制 namespace 运行容器&#xff0c;100个容器争夺资源&#xff0c; 给每个容器分配多少资源 审计&#xff1a;你利用多少资源&#xff1f;技…

免费的CRM软件都有哪些功能?

有哪些免费好用的CRM软件推荐&#xff1f;Zoho CRM是免费的CRM客户管理软件。虽然限制了部分功能&#xff0c;但是依然可以管理客户关系&#xff0c;提高销售效率&#xff0c;实现快速增长。 联系人管理&#xff1a; 创建和管理联系人&#xff0c;记录他们的基本信息、交易历…

阿里云短信平台收费标准价格表

阿里云短信服务平台&#xff0c;阿里云短信0.032元一条&#xff0c;阿里云短信&#xff1f;阿里云短信怎么收费&#xff1f;阿里云短信多少钱一条&#xff0c;阿里云短信0.032元一条。新用户购买阿里云短信套餐包6.9元200条起&#xff0c;费用0.032元/条&#xff0c;阿里云短信…

轻量级的CRM系统有哪些优势

市面上的CRM客户管理系统多种多样&#xff0c;但并不是所有的CRM系统都适合您的企业——有些CRM过于复杂和昂贵&#xff0c;初创或小型企业无法负担。那么&#xff0c;有哪些好用的轻量级在线CRM系统&#xff1f; Zoho Bigin是初创或小型企业设计的轻量级在线CRM系统&#xff…

联想小新电脑无法启动怎么办?

1&#xff0c;电脑启动不了 2&#xff0c;强制断电3次开机后&#xff0c;Win11进入高级启动模式 &#xff08;注意每次强制关机要按住15秒左右&#xff09; 3&#xff0c;选择疑难解答 4&#xff0c;选择高级选项 5&#xff0c;卸载更新 6&#xff0c;卸载最新的质量更新 7&am…

Spring Boot 中的 Spring Cloud Feign

Spring Boot 中的 Spring Cloud Feign Spring Boot 是一个非常流行的 Java Web 开发框架&#xff0c;它提供了很多工具和组件来简化 Web 应用程序的开发。其中&#xff0c;Spring Cloud Feign 是 Spring Boot 中的一个非常重要的组件&#xff0c;它可以帮助我们实现声明式的 R…

Git构建和Github的ssh配置

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的&#xff0c;所以我们需要配置验证信息 ssh-keygen -t rsa -C "youremailexample.com" your_emailyouremail.com 改为你在 Github 上注册的邮箱&#xff0c;之后会要求确认路径和输入密码&#xff0c…

计算机网络(谢希仁版)基础期末复习

一、前言 该篇文章是对计算机网络&#xff08;谢希仁版&#xff09;常考的期末复习知识点进行的总结&#xff0c;可以供大家进行简单的复习&#xff0c;适用于网络工程、计算机网络类专业的同学进行复习使用。其他对计算机网络感兴趣的同学、相关专业人士也可进行阅读。 二、第…

arcpy调用系统自带工具箱、检测文件是否存在、获取要素文件的属性(名称类型)、列出数据函数的使用

前言 前言其实我也不知道说什么&#xff0c;以往说的都是&#xff1b;垃圾话&#xff0c;现在垃圾话也说不出了&#xff0c;但是这是必不可少的内容&#xff01; 一、调用系统工具箱 我在这里以裁剪工具为例&#xff0c;其他的工具类似。 那么我们怎么知道我想使用的工具在…

【如何用大语言模型快速深度学习系列】从n-gram到TFIDF

感谢上一期能够进入csdn“每日推荐看”&#xff0c;那必然带着热情写下第二期《从n-gram到TFIDF》&#xff0c;这里引入一本《Speach and Language Processing》第三版翻译版本&#xff08;语音与语言处理(SLP)&#xff09;&#xff0c;前半部分写的很好&#xff01;里面连编辑…

软件测试的概念与过程---项目启动与需求评审

软件测试的概念与过程---项目启动与需求评审 1、项目启动参加的人员成员组成 2、需求评审 1、项目启动参加的人员 成员组成 项目经理: 为项目的成功策划和执行负总责的人产品经理: 根据市场的需求制定需求分析研发组长: 1.负责本小组的安全工作和日常研发工作 2.对组内人员…

High Performance Visual Tracking with Siamese Region Proposal Network(SiamRPN)

High Performance Visual Tracking with Siamese Region Proposal Network&#xff08;SiamRPN&#xff0c;CVPR2018&#xff09; 主要贡献&#xff1a; 提出了SiamRPN跟踪器&#xff0c;首次将端到端的离线训练方式&#xff0c;应用到了大尺度的图像跟踪任务上在在线跟踪过程…

Elasticsearch 分词器切词器分析器

normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理&#xff0c;过滤无用字符 HTML Strip Character Filter &#xff1a;htm…

【C3】内核模块,设备号,字符驱动,设备节点

文章目录 1.内核模块&#xff1a;必须包含module.h2.内核模块参数&#xff1a;权限位是用在sysfs文件系统里&#xff0c;只读权限用S_IRUGO设置2.1 extern&#xff1a;声明来自另一个模块 3.设备号&#xff1a;主设备号对应驱动程序&#xff0c;具有相同主设备号设备使用相同驱…

Android Studio Bot 下载使用

Android Studio Bot 下载使用 本文最新更新地址 https://gitee.com/chenjim/chenjimblog 下载 Android Studio Hedgehog 当前的新版本是 2023.1.1 Canary 10找到Studio Bot: View->Tool Windows->Studio Bot&#xff0c;或者下图 登录 Google 账号&#xff0c;注意当前限…

Echarts拼接折线图,左右两部分设置不同的样式及formatter的处理

option {tooltip: {trigger: axis,formatter: (params) > {console.log(params);if (params && params.length 2) {if (params[0].value ! -) {return 日期&#xff1a;${params[0].name}<br>${params[0].marker} ${params[0].value};} else {return 日期&a…