博舍

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

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

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

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

 1.注册公众号

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

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

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

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

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

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

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

Xnip20191220_233937.pngXnip20191220_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我暂时就是这样做的

/***微信成为开发者接口*@paramsignature:签名*@paramtimestamp:时间戳*@paramnonce:随机数*@paramechostr:随机字符串*@return*/@GetMapping("/authorize")publicStringauthorize(@RequestParam("signature")Stringsignature,@RequestParam("timestamp")Longtimestamp,@RequestParam("nonce")Stringnonce,@RequestParam("echostr")Stringechostr){log.info("【signature:{}】",signature);log.info("【timestamp:{}】",timestamp);log.info("【nonce:{}】",nonce);log.info("【echostr:{}】",echostr);returnechostr;}

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

Xnip20191220_233937.png

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

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

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

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

文本消息

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

  接受到的消息格式:

Xnip20191220_233959.png

  封装接收微信消息的实体

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

@Data@XStreamAlias("xml")publicclassWxXmlDataimplementsSerializable{@XStreamAlias("ToUserName")privateStringtoUserName;@XStreamAlias("FromUserName")privateStringfromUserName;@XStreamAlias("CreateTime")privateLongcreateTime;@XStreamAlias("MsgType")privateStringmsgType;@XStreamAlias("Content")privateStringcontent;@XStreamAlias("MsgId")privateStringmsgId;//@XStreamAlias("Title")privateStringtitle;@XStreamAlias("Description")privateStringdescription;@XStreamAlias("Url")privateStringurl;/***订阅或者取消订阅的事件*/@XStreamAlias("Event")privateStringevent;@XStreamAlias("EventKey")privateStringeventkey;}

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

@OverridepublicWxXmlDataresolveXmlData(InputStreamin)throwsIOException{StringxmlData=FileUtils.getInputToString(in);log.info("【receivexmlDatastr:{}】",xmlData);WxXmlDatawxXmlData=null;try{XStreamxstream=newXStream();//这个必须要加不然无法转换成WxXmlData对象xstream.setClassLoader(WxXmlData.class.getClassLoader());xstream.processAnnotations(WxXmlData.class);xstream.alias("xml",WxXmlData.class);wxXmlData=(WxXmlData)xstream.fromXML(xmlData);log.info("【wxXmlData:{}】",wxXmlData);}catch(Exceptione){log.error("【error】{}",e.getMessage());}returnwxXmlData;}  

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

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

@OverridepublicStringautoResponse(WxXmlDatawxData){`WxXmlDataresultXmlData=newWxXmlData();resultXmlData.setToUserName(wxData.getFromUserName());//收到的消息是谁发来的再发给谁resultXmlData.setFromUserName(wxData.getToUserName());//if(!StringUtils.isEmpty(wxData.getEvent())){if(WxSubscribeEnum.SUBSCRIBE.getValue().equals(wxData.getEvent())){resultXmlData.setMsgType("text");resultXmlData.setCreateTime(System.currentTimeMillis());resultXmlData.setContent("欢迎来到Johnny屋,本公众号会定期更新技术干货,愿与读者共同成长。 "+"-我的博客(建议PC端打开,移动端适配正在紧张开发中)");}}elseif(wxData.getContent().equalsIgnoreCase("vip")){resultXmlData.setMsgType("text");resultXmlData.setCreateTime(System.currentTimeMillis());resultXmlData.setContent("点击该链接,获取博客解锁验证码");}else{resultXmlData.setMsgType("text");resultXmlData.setCreateTime(System.currentTimeMillis());resultXmlData.setContent("公众号正在开发中。后期请多多关注!");}XStreamxstream=newXStream();xstream.processAnnotations(WxXmlData.class);xstream.setClassLoader(WxXmlData.class.getClassLoader());returnxstream.toXML(resultXmlData);//XStream的方法,直接将对象转换成xml数据

效果如下:

Xnip20191220_23395119.png4.总结

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇