网站首页 > 基础教程 正文
微信公众号自动回复功能开发
?本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧!
?1.注册公众号
??如果你从来没创建过请先注册 https://mp.weixin.qq.com/
??请选择订阅号,然后填写一些基本信息即可 ,具体注册流程这里就展开说了。
??注意 邮箱作为登录帐号,请填写未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 建议直接注册一个新邮箱使用
?2.微信托管自动回复功能
??微信提供了自动回复功能,也就是直接在微信上配置
??分别提供了3种配置 1.关键词回复 2.收到消息回复 3.被关注回复
??使用方法很简单 只需要在对应的回复类型上面配置即可 这里不做详细说明
?3.自己开发服务托管自动回复功能
??本篇重点讲解自己去托管自动回复功能,微信只做转发
??3.1 关闭微信的自动回复功能
????要想自己托管自动回复功能首先要讲微信的自动回复功能关闭 关闭方式如下
??3.2 开发者中心配置托管的服务器信息
???在开始服务器端开发之前,我先介绍一个natapp 内网穿透工具,有了它你可以直接将其本地映射一个地址配置到该URL地址上面,那么方便你调试 具体关于natapp的使用 请看我另一篇博客 https://www.askajohnny.com/#/blog/111
????主要配置URL地址 和Token信息 EncodingAESKey 可以随机生成
??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 我暂时就是这样做的??在上图中点击提交微信会发送请求到该接口 只要该接口正确返回了echostr,微信公众号管理平台就会如下显示 提交成功
??微信验证 开发者成功后点击 启用 服务器配置信息
??3.4 服务器端开发 (接收消息)
??附上微信关于消息的开发文档 https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
??当普通微信用户向公众账号发消息时,微信服务器将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
??
??**接受到的消息格式:**
??封装接收微信消息的实体
??这里我使用了 XStream 来解析XML 它非常好用,不了解的自行百度 后期可能会写一篇关于XStream的用法
@Data
@XStreamAlias("xml")
public class WxXmlData implements Serializable {
@XStreamAlias("ToUserName")
private String toUserName;
@XStreamAlias("FromUserName")
private String fromUserName;
@XStreamAlias("CreateTime")
private Long createTime;
@XStreamAlias("MsgType")
private String msgType;
@XStreamAlias("Content")
private String content;
@XStreamAlias("MsgId")
private String msgId;
//
@XStreamAlias("Title")
private String title;
@XStreamAlias("Description")
private String description;
@XStreamAlias("Url")
private String url;
/**
* 订阅或者取消订阅的事件
*/
@XStreamAlias("Event")
private String event;
@XStreamAlias("EventKey")
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("【receive xmlData str : {}】", xmlData);
WxXmlData wxXmlData = null;
try {
XStream xstream = new XStream();
//这个必须要加 不然无法转换成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 (Exception e) {
log.error("【error】{}", e.getMessage());
}
return wxXmlData;
}
??编写自动回复接口,这里有判断 event,如果是订阅可以做相应的回复,如果是 普通消息可以做相应的回复等等。。具体怎么实现回复逻辑看你自己的需求
??注意:你的回复的人是 发送给你消息的人
@Override
public String autoResponse(WxXmlData wxData) {
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("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("欢迎来到Johnny屋,本公众号会定期更新技术干货,愿与 读者共同成长。\n\n" +
"-<a href=\"https://www.askajohnny.com\">我的博客(建议PC端打开,移动端适配正在紧张开发中)</a>");
}
} else if(wxData.getContent().equalsIgnoreCase("vip")){
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("<a href=\"https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322\">点击该链接,获取博客解锁验证码</a>");
} else {
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("公众号正在开发中。后期请多多关注!");
}
XStream xstream = new XStream();
xstream.processAnnotations(WxXmlData.class);
xstream.setClassLoader(WxXmlData.class.getClassLoader());
return xstream.toXML(resultXmlData); //XStream的方法,直接将对象转换成 xml数据
}
??效果如下:
4.总结
本篇主要讲解微信公众号自动回复功能的开发,实现自己托管消息回复,能够更加灵活的根据不同的消息进行回复,主要就是对XML的报文解析并且发送对应的报文即可,后期可能会有其他关于微信公众号开发的文章包括 自定义菜单 等等 多多关注
个人博客网站 https://www.askajohnny.com 欢迎访问!
本文由博客一文多发平台 https://openwrite.cn?from=article_bottom 发布!
猜你喜欢
- 2024-11-08 你居然只知道蓝绿发布?今天教你全链路灰度
- 2024-11-08 redis 分布式锁的 5个坑,真是又大又深
- 2024-11-08 Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权
- 2024-11-08 Spring Boot利用filter实现xss防御
- 2024-11-08 Spring连环CVE-2015-5211和CVE-2020-5421漏洞升级教程
- 2024-11-08 如何进行权限系统设计,一文吃透 如何设计一个权限系统
- 2024-11-08 基于Spring Boot的注解驱动式公众号极速开发框架FastBootWeixin
- 2024-11-08 教育平台项目前端:项目前后端接口联调,项目上线部署发布
- 2024-11-08 HTTP通讯框架选型HttpClient/OkHttp
- 2024-11-08 Java对象复制系列三: 手把手带你写一个 Spring BeanUtils
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)