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

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

  
  **接受到的消息格式:**

![Xnip20191220_233959.png]()

  **封装接收微信消息的实体**

  **这里我使用了 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=http://www.likecs.com/\"https://www.askajohnny.com\">我的博客(建议PC端打开,移动端适配正在紧张开发中)</a>");
}
} else if(wxData.getContent().equalsIgnoreCase("vip")){
resultXmlData.setMsgType("text");
resultXmlData.setCreateTime(System.currentTimeMillis());
resultXmlData.setContent("<a href=http://www.likecs.com/\"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数据

  **效果如下:**

![Xnip20191220_23395119.png]()

### <a></a>4.总结

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwssyd.html