发表于: 2017-11-02 20:22:53
1 735
今天完成的事情:
申请的测试号,自带appid和appsecret
然后呢,如果照我前天那样配置在服务器上配置过项目和token,就可以连接了。显示配置成功就是连接上了,否则肯定会出现配置错误。
如果要模拟用户点击进入回调网页,需要前端写一些JS代码,还要一个域名
搞不了搞不了,先做一个消息回复测试一下吧
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。如下:
<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>
还有别的种类的消息,图片啊,视频啊,语音啊什么的,不管了
如果我们要回复消息,也要回复XML数据包的形式
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
xml消息不太利于编写程序,所以需要对xml消息进行相应的转换,这里将其转会为map
public static Map<String, String> xmlToMap(HttpServletRequest request) {
Map<String, String> map = new HashMap<String, String>();
SAXReader reader = new SAXReader();
InputStream ins = null;
try {
ins = request.getInputStream();
} catch (IOException e1) {
e1.printStackTrace();
}
Document doc = null;
try {
doc = reader.read(ins);
} catch (DocumentException e1) {
e1.printStackTrace();
}
Element root = doc.getRootElement();
@SuppressWarnings("unchecked")
List<Element> list = root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
}
try {
ins.close();
} catch (IOException e1) {
e1.printStackTrace();
}
return map;
}
/**
* 文本消息转化为xml
*
* @param textMessage
* @return
*/
public static String textMessageToXml(TextMessage textMessage) {
XStream xstream = new XStream();
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
需要额外的jar包,dom4j和xstream
接受微信消息的controller
@ResponseBody
@RequestMapping(value = "/wechat", method = RequestMethod.POST)
public void wechatServicePost(PrintWriter out, HttpServletRequest request, HttpServletResponse response) {
String responseMessage = wechatService.processRequest(request);
out.print(responseMessage);
out.flush();
}
@Service
public class WechatService {
private static Logger log = Logger.getLogger(WechatService.class);
public String processRequest(HttpServletRequest request) {
Map<String, String> map = WechatMessageUtil.xmlToMap(request);
log.info(map);
// 发送方帐号(一个OpenID)
String fromUserName = map.get("FromUserName");
// 开发者微信号
String toUserName = map.get("ToUserName");
// 消息类型
String msgType = map.get("MsgType");
// 默认回复一个"success"
String responseMessage = "success";
// 对消息进行处理
if (WechatMessageUtil.MESSAGE_TEXT.equals(msgType)) {// 文本消息
TextMessage textMessage = new TextMessage();
textMessage.setMsgType(WechatMessageUtil.MESSAGE_TEXT);
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(System.currentTimeMillis());
textMessage.setContent("Of all the gin joints in all the towns in all the world,she walks into mine.");
responseMessage = WechatMessageUtil.textMessageToXml(textMessage);
}
log.info(responseMessage);
return responseMessage;
}
}
好了,剩下的就是SpringMVC的配置文件了,对了,还有TextMessage的实体类,里边只有set,get方法,不作赘述
运行一下没问题打包放到服务器上,启动tomcat
这里再进行URL和token的提交,就会提示配置成功!
进入测试公众号,发个信息看看
如上,最后我乱码的问题还是没有解决,web.xml统一编码UTF-8还有服务器上的tomcat配置都改了也没用,还是中文乱码。。
明天计划的事情:
小课堂
遇到的问题:
用户进入回调页面这个东西还是要前端先搞一个点击事件出来,获取到code给后端才能做,暂时无解
评论