版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zc_ad/article/details/83378345
微信有很多消息时间,如:文本、图片、语音、事件等消息,微信服务器将POST消息的XML数据包到开发者填写的URL上。即与你微信验证token的接口一样,不过是post请求,此处只演示消息的接收,以及文本消息的被动回复。
需要额外引用的maven依赖:
<!--xml解析-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.0</version>
</dependency>
定义返回消息POJO类:
public class TextMsgDTO{
public String ToUserName;
public String FromUserName;
public String CreateTime;
public String MsgType;
public String Content;
public String msgToXml(){
XStream xstream=new XStream();
xstream.alias("xml", this.getClass());
return xstream.toXML(this);
}
}
定义xml解析工具类:
public class XMLUtil {
public static Document readXML(String str){
Document document=null;
try {
document= DocumentHelper.parseText(str);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 读取节点信息
* @param node
* @param name
* @return
*/
public static String readNode(Element node,String name){
return node.element(name).getTextTrim();
}
}
定义消息接收接口以及消息的处理:
@RestController
@RequestMapping("/wx")
public class WXController {
@Autowired
WXService wxService;
@PostMapping("")
public Object receiveMessage(@RequestBody String xml){
return wxService.TXMessage(xml);
}
public interface WXService {
Object TXMessage(String xml);
}
@Service
public class WXServiceImpl implements WXService {
private Logger logger = LoggerFactory.getLogger(WXServiceImpl.class);
/**
* 接收微信消息回调并返回
* @param xml
* @return
*/
@Override
public Object TXMessage(String xml) {
/**将信息转换为Document*/
Document document = XMLUtil.readXML(xml);
Element root = document.getRootElement();
logger.info("receive:"+xml);
String replyContent;
String toUserName = XMLUtil.readNode(root, "ToUserName");
String fromUserName = XMLUtil.readNode(root, "FromUserName");
String msgType = XMLUtil.readNode(root, "MsgType");
if("text".equals(msgType)){
replyContent = XMLUtil.readNode(root, "Content");
}else{
replyContent = "你发送的消息类型为:"+msgType;
}
String replyMsg = packageReplyTextMsg(fromUserName,toUserName,replyContent);
logger.info("reply:"+replyMsg);
return replyMsg;
}
/**封装返回消息*/
private String packageReplyTextMsg(String fromUserName, String toUserName, String replyContent){
TextMsgDTO textMsg = new TextMsgDTO();
textMsg.MsgType = "text";
textMsg.FromUserName = toUserName;
textMsg.ToUserName = fromUserName;
textMsg.CreateTime = String.valueOf(System.currentTimeMillis()).substring(0,10);
//将XML消息的参数都转化内容回复给微信
textMsg.Content = replyContent;
String replyMsg = null;
try {
//将对象转化为XML
replyMsg = textMsg.msgToXml();
} catch (Exception e) {
e.printStackTrace();
}
return replyMsg;
}
}