java 实现公众号自动回复功能

前言

功能要点,关注公众号之后,进行给关注用户发一条消息和自己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 文本哦。其他参数先不给了哈。

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

测试一下哦
image.png

可以用哦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值