当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
接收文本消息
例如用户给公众号发送消息“欢迎开启公众号开发者模式”,在开发者后台收到的公众平台发送的消息xml如下
<xml>
<ToUserName><![CDATA[公众号]]></ToUserName>
<FromUserName><![CDATA[粉丝号]]></FromUserName>
<CreateTime>1460537339</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[欢迎开启公众号开发者模式]]></Content>
<MsgId>6272960105994287618</MsgId>
</xml>
被动回复文本消息
即公众号回复用户的文本消息
1) 被动回复消息,即发送被动响应消息,不同于客服消息接口
2) 它其实并不是一种接口,而是对微信服务器发过来消息的一次回复
3) 收到粉丝消息后不想或者不能5秒内回复时,需回复“success”字符串(下文详细介绍)
4) 客服接口在满足一定条件下随时调用
回复的消息
<xml>
<ToUserName><![CDATA[粉丝号]]></ToUserName>
<FromUserName><![CDATA[公众号]]></FromUserName>
<CreateTime>1460541339</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[test]]></Content>
</xml>
服务端开发
1)pom文件引入dom4j jar包,用来解析xml
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
2)新建bean类用来解析xml使用
/**
*
* 类名称: BaseMessage
* 类描述: 回复消息的基类
* @author yuanjun
* 创建时间:2017年12月8日上午11:38:11
*/
public class BaseMessage {
protected String ToUserName;
protected String FromUserName;
protected long CreateTime;
protected String MsgType;
public BaseMessage() {
super();
}
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
/**
*
* 类名称: MessageTest 类描述: 消息内容实体
*
* @author yuanjun 创建时间:2017年12月5日上午10:41:40
*/
public class MessageText extends BaseMessage {
private String Content;// 文本消息内容
private String MsgId;// 消息id,64位整型
public MessageText() {
}
public MessageText(String toUserName, String fromUserName, long createTime, String msgType, String content,
String msgId) {
super();
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
Content = content;
MsgId = msgId;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
}
xml解析工具类
public class MessageUtil {
public static Map<String,String> xmlToMap(HttpServletRequest request)
{
Map<String,String> map = new HashMap<>();
SAXReader reader = new SAXReader();
InputStream in = null;
try {
in = request.getInputStream();
Document doc = reader.read(in);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for (Element element : list) {
map.put(element.getName(), element.getText());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return map;
}
}
message转xml工具类
public class TextMessageUtil {
/**
* 将发送消息封装成对应的xml格式
*/
public String messageToxml(MessageText message) {
XStream xstream = new XStream();
xstream.alias("xml", message.getClass());
return xstream.toXML(message);
}
/**
* 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
* @param FromUserName
* @param ToUserName
*/
public String initMessage(String FromUserName, String ToUserName) {
MessageText text = new MessageText();
text.setToUserName(FromUserName);
text.setFromUserName(ToUserName);
text.setContent("欢迎开始微信公众号");
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return this.messageToxml(text);
}
}
controller代码
@RequestMapping(value = "test",method=RequestMethod.POST)
public void dopost(HttpServletRequest request,HttpServletResponse response)
{
response.setCharacterEncoding("utf-8");
PrintWriter out = null;
//将微信请求xml转为map格式,获取所需的参数
Map<String,String> map = MessageUtil.xmlToMap(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String message = null;
//处理文本类型,实现输入1,回复相应的封装的内容
if("text".equals(MsgType)){
if("1".equals(Content)){
TextMessageUtil textMessage = new TextMessageUtil();
message = textMessage.initMessage(FromUserName, ToUserName);
}
}
try {
out = response.getWriter();
out.write(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.close();
}
最终结果展示
当用户输入1时,公众号返回消息