微信公众号自动回复功能开发

不想你离开。 提交于 2019-12-25 09:20:19

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

微信公众号自动回复功能开发

 本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧!

 1.注册公众号

  如果你从来没创建过请先注册 微信公众平台

  请选择订阅号,然后填写一些基本信息即可 ,具体注册流程这里就展开说了。

  注意 邮箱作为登录帐号,请填写未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 建议直接注册一个新邮箱使用

Xnip20191220_225433.png

 2.微信托管自动回复功能

  微信提供了自动回复功能,也就是直接在微信上配置

  分别提供了3种配置 1.关键词回复 2.收到消息回复 3.被关注回复

  使用方法很简单 只需要在对应的回复类型上面配置即可 这里不做详细说明

Xnip20191220_233937.png

Xnip20191220_230059.png

 3.自己开发服务托管自动回复功能

  本篇重点讲解自己去托管自动回复功能,微信只做转发

  3.1 关闭微信的自动回复功能

    要想自己托管自动回复功能首先要讲微信的自动回复功能关闭 关闭方式如下

Xnip20191220_230557.png

  3.2 开发者中心配置托管的服务器信息

   在开始服务器端开发之前,我先介绍一个natapp 内网穿透工具,有了它你可以直接将其本地映射一个地址配置到该URL地址上面,那么方便你调试 具体关于natapp的使用 请看我另一篇博客 natapp 内网穿透工具

    主要配置URL地址 和Token信息 EncodingAESKey 可以随机生成

Xnip20191220_232540.png

  3.3 服务端开发(验证消息来来自微信服务器)

    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数	描述
signature	微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp	时间戳
nonce		随机数
echostr		随机字符串

  开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

  1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

你也可以简单粗暴的直接返回echostr 我暂时就是这样做的

/**
 * 微信成为开发者 接口
 * [@param](https://my.oschina.net/u/2303379) signature : 签名
 * [@param](https://my.oschina.net/u/2303379) timestamp : 时间戳
 * [@param](https://my.oschina.net/u/2303379) nonce     : 随机数
 * [@param](https://my.oschina.net/u/2303379) echostr   : 随机字符串
 * [@return](https://my.oschina.net/u/556800)
 */
@GetMapping("/authorize")
public String authorize(@RequestParam("signature") String signature,
                        @RequestParam("timestamp") Long timestamp,
                        @RequestParam("nonce") String nonce,
                        @RequestParam("echostr") String echostr) {

    log.info("【signature:{}】", signature);
    log.info("【timestamp:{}】", timestamp);
    log.info("【nonce:{}】", nonce);
    log.info("【echostr:{}】", echostr);

    return echostr;
}

  在上图中点击提交微信会发送请求到该接口 只要该接口正确返回了echostr,微信公众号管理平台就会如下显示 提交成功

Xnip20191220_233937.png

  微信验证 开发者成功后点击 启用 服务器配置信息

Xnip20191220_234124.png

  3.4 服务器端开发 (接收消息)

  附上微信关于消息的开发文档 微信公众平台开发文档

  当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,也就是你刚刚配置的验证接口的URL地址,只不过是POST方式提交,所以你需要写一个POST接口

文本消息

<xml>
   <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>


 参数	        描述

 ToUserName	开发者微信号
 FromUserName	发送方帐号(一个OpenID)
 CreateTime	消息创建时间 (整型)
 MsgType	消息类型,文本为text
 Content	文本消息内容
 MsgId


  

  接受到的消息格式:

Xnip20191220_233959.png

  封装接收微信消息的实体

  这里我使用了 XStream 来解析XML 它非常好用,不了解的自行百度 后期可能会写一篇关于XStream的用法

@Data
@XStreamAlias(&quot;xml&quot;)
public class WxXmlData implements Serializable {

@XStreamAlias(&quot;ToUserName&quot;)
private String toUserName;
@XStreamAlias(&quot;FromUserName&quot;)
private String fromUserName;

@XStreamAlias(&quot;CreateTime&quot;)
private Long createTime;

@XStreamAlias(&quot;MsgType&quot;)
private String msgType;

@XStreamAlias(&quot;Content&quot;)
private String content;

@XStreamAlias(&quot;MsgId&quot;)
private String msgId;

//
@XStreamAlias(&quot;Title&quot;)
private String title;

@XStreamAlias(&quot;Description&quot;)
private String description;

@XStreamAlias(&quot;Url&quot;)
private String url;

/**
 * 订阅或者取消订阅的事件
 */
@XStreamAlias(&quot;Event&quot;)
private String event;

@XStreamAlias(&quot;EventKey&quot;)
private String eventkey;

}

  从InputStream流中读取到xml字符串(inputstream从 post接口的 request.getInputStream()获取),然后通过XStream解析到封装的实体对象WxXmlData中

@Override
public WxXmlData resolveXmlData(InputStream in) throws IOException {
    String xmlData = FileUtils.getInputToString(in);
    log.info(&quot;【receive  xmlData str : {}】&quot;, xmlData);
    WxXmlData wxXmlData = null;
    try {
        XStream xstream = new XStream();
        //这个必须要加 不然无法转换成WxXmlData对象
        xstream.setClassLoader(WxXmlData.class.getClassLoader());
        xstream.processAnnotations(WxXmlData.class);
        xstream.alias(&quot;xml&quot;, WxXmlData.class);
        wxXmlData = (WxXmlData) xstream.fromXML(xmlData);
        log.info(&quot;【wxXmlData: {}】 &quot;, wxXmlData);
    } catch (Exception e) {
        log.error(&quot;【error】{}&quot;, e.getMessage());
    }
    return wxXmlData;
}


  

  编写自动回复接口,这里有判断 event,如果是订阅可以做相应的回复,如果是 普通消息可以做相应的回复等等。。具体怎么实现回复逻辑看你自己的需求

  注意:你的回复的人是 发送给你消息的人

@Override

public String autoResponse(WxXmlData wxData) {

<pre>`    WxXmlData resultXmlData = new WxXmlData();
    resultXmlData.setToUserName(wxData.getFromUserName());  //收到的消息是谁发来的再发给谁
    resultXmlData.setFromUserName(wxData.getToUserName());  //
    if (!StringUtils.isEmpty(wxData.getEvent())) {
        if (WxSubscribeEnum.SUBSCRIBE.getValue().equals(wxData.getEvent())) {
            resultXmlData.setMsgType(&quot;text&quot;);
            resultXmlData.setCreateTime(System.currentTimeMillis());
            resultXmlData.setContent(&quot;欢迎来到Johnny屋,本公众号会定期更新技术干货,愿与 读者共同成长。\n\n&quot; +
                    &quot;-&lt;a href=\&quot;https://www.askajohnny.com\&quot;&gt;我的博客(建议PC端打开,移动端适配正在紧张开发中)&lt;/a&gt;&quot;);
        }
    } else if(wxData.getContent().equalsIgnoreCase(&quot;vip&quot;)){
        resultXmlData.setMsgType(&quot;text&quot;);
        resultXmlData.setCreateTime(System.currentTimeMillis());
        resultXmlData.setContent(&quot;&lt;a href=\&quot;https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322\&quot;&gt;点击该链接,获取博客解锁验证码&lt;/a&gt;&quot;);
    } else {
        resultXmlData.setMsgType(&quot;text&quot;);
        resultXmlData.setCreateTime(System.currentTimeMillis());
        resultXmlData.setContent(&quot;公众号正在开发中。后期请多多关注!&quot;);
    }
    XStream xstream = new XStream();
    xstream.processAnnotations(WxXmlData.class);
    xstream.setClassLoader(WxXmlData.class.getClassLoader()); 
    return xstream.toXML(resultXmlData);  //XStream的方法,直接将对象转换成 xml数据

  效果如下:

Xnip20191220_23395119.png

<a id="4_235"></a>4.总结

本篇主要讲解微信公众号自动回复功能的开发,实现自己托管消息回复,能够更加灵活的根据不同的消息进行回复,主要就是对XML的报文解析并且发送对应的报文即可,后期可能会有其他关于微信公众号开发的文章包括 自定义菜单 等等 多多关注

个人博客系统:https://www.askajohnny.com 欢迎访问! 本文由博客一文多发平台 OpenWrite 发布!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!