作者:zhutulang
在这篇中,笔者将介绍如何让你的公众号响应接收到的文本消息。
在第一篇中,我们配置了url。于是当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
如果你看了文档,那么你会知道,发送文本消息时,微信发送的是类似下面的xml数据包:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is atest]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
它们的含义如下:
参数 | 描述 |
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
我们在第一篇中写的controller里没有写post方法,那么现在,我们就要提供一个post方法。当普通微信用户A向我们的公众号发送一段文本之后,controller里的post方法就会接收到该请求。我们可以稍微处理下,然后用同样的xml格式返回,微信服务器就会收到该响应。如果说我们要对A用户做出回应,这里有一点要注意的是,我们返回的xml数据中,要记得把ToUserName和 FromUserName 交换。这个很好理解,因为,我们收到的数据包,发送方是A,接收方是我们的公众号,而我们回应时,发送方是我们的公众号,而接收方是A。记住喽!
这么看来,这个post方法实在是太简单了,不是吗?以我这里的例子来说,当我收到文本消息内容Content后,如果Content是1,那么我给A回应“you are the onlyone!”,否则回应"你发给我的信息是:"+Content 。
Post方法如下,至于解析xml和生成xml不是我们说的重点,具体请看详细代码。
@RequestMapping(method =RequestMethod.POST)
public void post(HttpServletRequestrequest, HttpServletResponse response) {
try{
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
}catch (UnsupportedEncodingException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
PrintWriterout = null;
try {
out= response.getWriter();
StringresponseMsg = null;
TextMsgParserHandlertextMsgParserHandler = new TextMsgParserHandler();
TextMsgtextMsg = textMsgParserHandler.getTextMsg(request.getInputStream());
Stringcontent = textMsg.getContent();
log.info("收到的文本信息是:"+content);
if(content.equals("1")){
responseMsg= "you are the only one!";
}else{
responseMsg= "你发给我的信息是:"+content;
}
textMsg.setContent(responseMsg);
//注意这里发送者和接收者交换
String fromUserName = textMsg.getFromUserName();
String toUserName =textMsg.getToUserName();
textMsg.setFromUserName(toUserName);
textMsg.setToUserName(fromUserName);
//将textMsg 转换成xml字符串
String responseXml =TextMsgWriter.getXmlString(textMsg);
out.print(responseXml);
log.info("response="+responseXml);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
out = null;
}
}
看哥的截图:
其它相关代码可查看:
http://download.csdn.net/detail/zhutulang/9423587