自己申请的微信公众号来学习微信公众号的开发,至于申请的流程本来想整理一下再发出来的,但是今天碰到一个估计很多人都会碰到的小问题,就是接收文本信息时候的数据处理,在这里就顺便将微信公众号对于接收文本信息作出的一个记录。
文本消息
<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 消息id,64位整型
这是从微信开发者文档中截出来的文档,服务器接收公众号平台以post请求发送过来的信息,开发人员需要对得到的数据进行包装后抛出。
由于刚进行对于微信公众号的开发,很多东西都没有进行更好的封装,都暴露在接口处,在后期开发的时候将会将该封装的都封装起来,让代码风格看起来更清爽。
这是我编写的接口:
@RequestMapping(value = "/valid", method = RequestMethod.POST)
@ResponseBody
public String accpetMessage(HttpServletRequest request)
throws IOException {
request.setCharacterEncoding("utf-8");
Map<String, String> param = MessageUtil.xmlToMap(request);
String fromUserName = param.get("FromUserName");
String toUserName = param.get("ToUserName");
String msgType = param.get("MsgType");
String content = param.get("Content");
Long createTime = Long.valueOf(param.get("CreateTime"));
Long msgId = Long.valueOf(param.get("MsgId"));
System.out.println("--------->" + param);
String message = null;
if ("text".equals(msgType)) {
TextMessage text = new TextMessage();
text.setContent("the message is:"+content);
text.setCreateTime(createTime);
text.setToUserName(fromUserName);
text.setFromUserName(toUserName);
text.setMsgType("text");
text.setMsgId(msgId);
message = MessageUtil.textMessageToXml(text);
System.out.println("message--------->" + message);
}
return message;
}
得到的xml的格式为:
<xml>
<ToUserName>ocQcEvxKvjK3I24qDGkdObwfX2CQ</ToUserName>
<FromUserName>gh_0a599cb04a12</FromUserName>
<CreateTime>1482142737</CreateTime>
<MsgType>text</MsgType>
<Content>the message is:Gags</Content>
<MsgId>6365754583835498455</MsgId>
</xml>
里面用到了xml转化成对象以及对象转换成xml的过程。
开发过程中,碰到的问题就是,明明看着xml的格式是正确的,并且能正确接收到输入的数据,但是微信公众平台始终显示‘该官方账号暂时无法提供服务,请稍后再试’。
刚开始以为是xml的格式有问题,在xml数据中加上
<xml>
<ToUserName><![CDATA[fromUser]]></ToUserName>
<FromUserName><![CDATA[toUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
以这样的格式传输过去的时候确实能够正确的返回数据。。。这个大坑。。。