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

前言

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容