悦已 發表於 2019-12-25 15:08:00

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

<p># 微信公众号自动回复功能开发</p>
<p> 本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧!</p>
<p>### &amp;emsp;1.注册公众号</p>
<p> &amp;emsp;如果你从来没创建过请先注册 [微信公众平台](https://mp.weixin.qq.com/)</p>
<p> &amp;emsp;请选择订阅号,然后填写一些基本信息即可 ,具体注册流程这里就展开说了。</p>
<p> &amp;emsp;**注意 邮箱作为登录帐号,请填写未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 建议直接注册一个新邮箱使用**</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_22-54-33.png)</p>
<p>### &amp;emsp;2.微信托管自动回复功能</p>
<p> &amp;emsp;微信提供了自动回复功能,也就是直接在微信上配置</p>
<p> &amp;emsp;**分别提供了3种配置 1.关键词回复 2.收到消息回复 3.被关注回复**</p>
<p> &amp;emsp;使用方法很简单 只需要在对应的回复类型上面配置即可 这里不做详细说明</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-39-37.png)</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-00-59.png)</p>
<p>### &amp;emsp;3.自己开发服务托管自动回复功能</p>
<p> &amp;emsp;本篇重点讲解自己去托管自动回复功能,微信只做转发</p>
<p>#### &amp;emsp;&amp;emsp;3.1 关闭微信的自动回复功能</p>
<p>  &amp;emsp;&amp;emsp;要想自己托管自动回复功能首先要讲微信的自动回复功能关闭 关闭方式如下</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-05-57.png)</p>
<p>#### &amp;emsp;&amp;emsp;3.2 开发者中心配置托管的服务器信息</p>
<p> &amp;emsp;&amp;emsp;**在开始服务器端开发之前,我先介绍一个natapp 内网穿透工具**,有了它你可以直接将其本地映射一个地址配置到该URL地址上面,那么方便你调试 具体关于natapp的使用 请看我另一篇博客 (https://www.askajohnny.com/#/blog/111)</p>
<p>  &amp;emsp;&amp;emsp;主要配置URL地址 和Token信息 EncodingAESKey 可以随机生成</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-25-40.png)</p>
<p>#### &amp;emsp;&amp;emsp;3.3 服务端开发(验证消息来来自微信服务器)</p>
<p>  &amp;emsp;&amp;emsp;开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:</p>
<p> 参数 描述<br>    signature        微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。<br>    timestamp        时间戳<br>    nonce                随机数<br>    echostr                随机字符串<br>   </p>
<p>   &amp;emsp;&amp;emsp;开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:</p>
<p>      1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信</p>
<p>   **你也可以简单粗暴的直接返回echostr 我暂时就是这样做的**</p>
<p>        /**<br>         * 微信成为开发者 接口<br>         * @param signature : 签名<br>         * @param timestamp : 时间戳<br>         * @param nonce   : 随机数<br>         * @param echostr   : 随机字符串<br>         * @return<br>         */<br>        @GetMapping("/authorize")<br>        public String authorize(@RequestParam("signature") String signature,<br>                        @RequestParam("timestamp") Long timestamp,<br>                        @RequestParam("nonce") String nonce,<br>                        @RequestParam("echostr") String echostr) {</p>
<p>            log.info("【signature:{}】", signature);<br>            log.info("【timestamp:{}】", timestamp);<br>            log.info("【nonce:{}】", nonce);<br>            log.info("【echostr:{}】", echostr);</p>
<p>            return echostr;<br>        }</p>
<p>   &amp;emsp;&amp;emsp;在上图中点击提交微信会发送请求到该接口 只要该接口正确返回了echostr,微信公众号管理平台就会如下显示 提交成功</p>
<p>   !(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-39-37.png)</p>
<p>   &amp;emsp;&amp;emsp;微信验证 开发者成功后点击 启用 服务器配置信息</p>
<p>   !(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-20_23-41-24.png)</p>
<p><br>#### &amp;emsp;&amp;emsp;3.4 服务器端开发 (接收消息) <br>&amp;emsp;&amp;emsp;附上微信关于消息的开发文档 [微信公众平台开发文档](https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html)</p>
<p>&amp;emsp;&amp;emsp;当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,也就是你刚刚配置的验证接口的URL地址,只不过是POST方式提交,所以你需要写一个POST接口</p>
<p><br>文本消息</p>
<p>        &lt;xml&gt;<br>           &lt;ToUserName&gt;&lt;!]&gt;&lt;/ToUserName&gt;<br>          &lt;FromUserName&gt;&lt;!]&gt;&lt;/FromUserName&gt;<br>          &lt;CreateTime&gt;1348831860&lt;/CreateTime&gt;<br>          &lt;MsgType&gt;&lt;!]&gt;&lt;/MsgType&gt;<br>          &lt;Content&gt;&lt;!]&gt;&lt;/Content&gt;<br>          &lt;MsgId&gt;1234567890123456&lt;/MsgId&gt;<br>        &lt;/xml&gt;</p>
<p><br>   参数                描述</p>
<p>   ToUserName        开发者微信号<br>   FromUserName        发送方帐号(一个OpenID)<br>   CreateTime        消息创建时间 (整型)<br>   MsgType        消息类型,文本为text<br>   Content        文本消息内容<br>   MsgId<br>    </p>
<p>      <br>&amp;emsp;&amp;emsp;**接受到的消息格式:**</p>
<p>   !(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-15_13-20-59.png)</p>
<p>   &amp;emsp;&amp;emsp;**封装接收微信消息的实体**</p>
<p>   &amp;emsp;&amp;emsp;**这里我使用了 XStream 来解析XML** 它非常好用,不了解的自行百度 后期可能会写一篇关于XStream的用法</p>
<p>        @Data<br>        @XStreamAlias("xml")<br>        public class WxXmlData implements Serializable {</p>
<p><br>        @XStreamAlias("ToUserName")<br>        private String toUserName;<br>        @XStreamAlias("FromUserName")<br>        private String fromUserName;</p>
<p>        @XStreamAlias("CreateTime")<br>        private Long createTime;</p>
<p>        @XStreamAlias("MsgType")<br>        private String msgType;</p>
<p>        @XStreamAlias("Content")<br>        private String content;</p>
<p>        @XStreamAlias("MsgId")<br>        private String msgId;</p>
<p>        //<br>        @XStreamAlias("Title")<br>        private String title;</p>
<p>        @XStreamAlias("Description")<br>        private String description;</p>
<p>        @XStreamAlias("Url")<br>        private String url;</p>
<p>        /**<br>       * 订阅或者取消订阅的事件<br>         */<br>        @XStreamAlias("Event")<br>        private String event;</p>
<p>        @XStreamAlias("EventKey")<br>        private String eventkey;</p>
<p>        }<br>    </p>
<p>&amp;emsp;&amp;emsp;从InputStream流中读取到xml字符串(inputstream从 post接口的 request.getInputStream()获取),然后通过XStream解析到封装的实体对象WxXmlData中</p>
<p>        @Override<br>        public WxXmlData resolveXmlData(InputStream in) throws IOException {<br>    String xmlData = FileUtils.getInputToString(in);<br>    log.info("【receivexmlData str : {}】", xmlData);<br>    WxXmlData wxXmlData = null;<br>    try {<br>      XStream xstream = new XStream();<br>      //这个必须要加 不然无法转换成WxXmlData对象<br>      xstream.setClassLoader(WxXmlData.class.getClassLoader());<br>      xstream.processAnnotations(WxXmlData.class);<br>      xstream.alias("xml", WxXmlData.class);<br>      wxXmlData = (WxXmlData) xstream.fromXML(xmlData);<br>      log.info("【wxXmlData: {}】 ", wxXmlData);<br>    } catch (Exception e) {<br>      log.error("【error】{}", e.getMessage());<br>    }<br>    return wxXmlData;<br>        }</p>
<p>      <br>        <br>&amp;emsp;&amp;emsp;**编写自动回复接口,这里有判断 event,如果是订阅可以做相应的回复,如果是 普通消息可以做相应的回复等等。。具体怎么实现回复逻辑看你自己的需求**</p>
<p>   &amp;emsp;&amp;emsp;**注意:你的回复的人是 发送给你消息的人**</p>
<p>           @Override<br>        public String autoResponse(WxXmlData wxData) {</p>
<p>    WxXmlData resultXmlData = new WxXmlData();<br>    resultXmlData.setToUserName(wxData.getFromUserName());//收到的消息是谁发来的再发给谁<br>    resultXmlData.setFromUserName(wxData.getToUserName());//<br>    if (!StringUtils.isEmpty(wxData.getEvent())) {<br>      if (WxSubscribeEnum.SUBSCRIBE.getValue().equals(wxData.getEvent())) {<br>            resultXmlData.setMsgType("text");<br>            resultXmlData.setCreateTime(System.currentTimeMillis());<br>            resultXmlData.setContent("欢迎来到Johnny屋,本公众号会定期更新技术干货,愿与 读者共同成长。\n\n" +<br>                  "-&lt;a href=\"https://www.askajohnny.com\"&gt;我的博客(建议PC端打开,移动端适配正在紧张开发中)&lt;/a&gt;");<br>      }<br>    } else if(wxData.getContent().equalsIgnoreCase("vip")){<br>      resultXmlData.setMsgType("text");<br>      resultXmlData.setCreateTime(System.currentTimeMillis());<br>      resultXmlData.setContent("&lt;a href=\"https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322\"&gt;点击该链接,获取博客解锁验证码&lt;/a&gt;");<br>    } else {<br>      resultXmlData.setMsgType("text");<br>      resultXmlData.setCreateTime(System.currentTimeMillis());<br>      resultXmlData.setContent("公众号正在开发中。后期请多多关注!");<br>    }<br>    XStream xstream = new XStream();<br>    xstream.processAnnotations(WxXmlData.class);<br>    xstream.setClassLoader(WxXmlData.class.getClassLoader()); <br>    return xstream.toXML(resultXmlData);//XStream的方法,直接将对象转换成 xml数据</p>
<p>  **效果如下:**</p>
<p>!(http://q1xacbncg.bkt.clouddn.com/Xnip2019-12-17_09-22-56.png)</p>
<p>### &lt;a id="4_235"&gt;&lt;/a&gt;4.总结</p>
<p>**本篇主要讲解微信公众号自动回复功能的开发,实现自己托管消息回复,能够更加灵活的根据不同的消息进行回复,主要就是对XML的报文解析并且发送对应的报文即可,后期可能会有其他关于微信公众号开发的文章包括 自定义菜单 等等 多多关注**</p><br><br>
来源:https://www.cnblogs.com/askajohnny/p/12096772.html
頁: [1]
查看完整版本: 微信公众号自动回复功能开发