美文网首页
我给我的公众号添加了自动回复功能

我给我的公众号添加了自动回复功能

作者: 客观开发者 | 来源:发表于2023-08-20 11:23 被阅读0次

    前言

    功能要点,关注公众号之后,进行给关注用户发一条消息和自己blog 需要一个关注公众号之后,在验证码之后,输入正确的验证码之后,才能进行进行下去。
    所以涉及到公众号Api 接口的使用和开发。

    开发账号准备

    1、开通一个公众号,可以是服务号,企业号或订阅号,都是可以的。

    微信公众平台:https://mp.weixin.qq.com/

    开发者文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

    说明: 点击右上角立即注册,选择“服务号”或“订阅号”注册(服务号仅限机构用户注册,个人用户只能选择订阅号)

    2、进入公众号与开发里面的公众号设置。


    image.png

    找到设置,设置号自己的域名。

    3、找到设置与开发中的基本配置
    获取和保存好下面信息
    开发者ID(AppID)
    开发者密码(AppSecret)
    令牌(Token)
    消息加解密密钥(EncodingAESKey)
    服务器地址(URL)

    然后拿着 这个接口值,开始写代码了。

    这个会用到两个方法,一个get 方法,一个是post 方法。因为URL 地址只有一个。
    我发现了get 是用于微信验证码,返回去任性信息即可。另一个是消息post 来的数据,然后我们出来,返回出去就是为消息了。

    期间配置还有一个 文件放入项目里面去,是一个txt 文件。

    @GetMapping("/MP_verify_EdATxxxIn.txt")
        public String verify() {
            return "EdAxxx";
        }
    
    

    我一般这样写,这样写的目的是为了,保证方法放入到域名下了。少配置一个nginx 了。

    接着配置第一个 和微信公账号里面 验证的时候需要

    /**
         * 认证需要
         *
         * @param request
         * @return
         */
        @SaIgnore
        @GetMapping("/getToken")
        public String getToken(HttpServletRequest request) {
            return checkToken(request, token);
        }
    
        public static String checkToken(HttpServletRequest request, String token) {
            String method = request.getMethod();
            //微信token验证get请求
            if ("GET".equals(method)) {
                //微信加密签名
                String echostr = request.getParameter("echostr");//时阅鲛
                String signature = request.getParameter("signature");//随机宁符串
                String timestamp = request.getParameter("timestamp");//随机数
                String nonce = request.getParameter("nonce");
                String[] str = {token, timestamp, nonce};
                //字典排序
                Arrays.sort(str);
                String bigStr = str[0] + str[1] + str[2];// SHA1加密
                String digest = SecureUtil.sha1(bigStr);//对比签名
                if (digest.equals(signature)) {
                    return echostr;
                } else {
                    return "";
                }
            }
            return "";
        }
    

    这里的token 就是公众号里面配置的。

    通过就可以进行下一部分。

    回复方法。我们这里填写了一个方法,用户发送来消息,是post 请求,所以他会走一个post 请求过来。

      /**
         * 自动回复用
         *
         * @param requestBody
         * @return
         */
        @SaIgnore
        @PostMapping("/getToken")
        public String getToken(@RequestBody String requestBody) {
            ReceiveMessage receiveMessage = XMLTOModel(requestBody);
            return parseMsgToXML(receiveMessage);
        }
    

    我这里写了两个方法,也可以写一个方法,然后判断是get 还是post 请求,在进入不同的方法。

    先进行 数据获取,获取数据是做什么,然后再返回去参数,微信公众号里面的参数是xml 的
    需要我们对xml 解析和生成了。

    这里我用到了xstream

    
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.4.9</version>
            </dependency>
    
    

    对xml 解析和生成操作了。

    这里生返回数据
    private String parseMsgToXML(ReceiveMessage receiveMessage) {
            String content = receiveMessage.getContent();
    
            String message = null;
            String msgType = receiveMessage.getMsgType();
            String toUserName = receiveMessage.getToUserName();
            String fromUserName = receiveMessage.getFromUserName();
    
            //判断发送的类型是文本
            if (MpMessageUtil.MESSAGE_TEXT.equals(msgType)) {
                //发送的内容为???时
                if ("0".equals(content)) {
    后面的可以为空
                    message = MpMessageFormat.initText(toUserName, fromUserName, MpMessageUtil.menuText());
                } else if ("1".equals(content)) {
                    Random random = new Random();
                    message = MpMessageFormat.initText(toUserName, fromUserName, String.format("您本次的验证码为:%s%s%s%s", random.nextInt(10), random.nextInt(10), random.nextInt(10), random.nextInt(10)));//模拟验证码
                } else if ("验证码".equals(content)) {
                    Random random = new Random();
                    message = MpMessageFormat.initText(toUserName, fromUserName, String.format("您本次的验证码为:%s%s%s%s", random.nextInt(10), random.nextInt(10), random.nextInt(10), random.nextInt(10)));//模拟验证码
                } else {
                    message = MpMessageFormat.initText(toUserName, fromUserName, "感谢您的来电,我们会尽快处理,请按提示信息操作[回复'0'显示主菜单]。");
                }
            } else if (MpMessageUtil.MESSAGE_EVENT.equals(msgType)) {//验证是关注/取消事件
                String eventType = receiveMessage.getEvent();//获取是关注还是取消
                //关注
                if (MpMessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)) {
                    message = MpMessageFormat.initText(toUserName, fromUserName, "欢迎关注乐观开发者,回复[0]即可调出功能菜单");
                }
            }
    
            return message;
        }
    
    这里是解析
        public static ReceiveMessage XMLTOModel(String str) {
            ReceiveMessage receiveMessage = new ReceiveMessage();
            try {
                Document document = DocumentHelper.parseText(String.valueOf(str));
                Element root = document.getRootElement();
                receiveMessage.setToUserName(root.elementText("ToUserName"));
                receiveMessage.setFromUserName(root.elementText("FromUserName"));
                receiveMessage.setMsgType(root.elementText("MsgType"));
                receiveMessage.setContent(root.elementText("Content"));
                receiveMessage.setCreateTime(root.elementText("CreateTime"));
                receiveMessage.setMsgId(root.elementText("MsgId"));
    //            关注
                receiveMessage.setEvent(root.elementText("Event"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return receiveMessage;
        }
    
    
    public static final String MESSAGE_TEXT = "text";//文本
    

    这里只讲text 文本哦。其他参数先不给了哈。

    返回去,需要注意的是,发送人和接受人,是要相互交互的哦。否则不成功。

    测试一下哦
    回复一下可以用哦。

    相关文章

      网友评论

          本文标题:我给我的公众号添加了自动回复功能

          本文链接:https://www.haomeiwen.com/subject/ipkrmdtx.html