发表于: 2017-11-02 20:22:53

1 733


今天完成的事情:

申请的测试号,自带appid和appsecret

URL是一个公网地址,只能接收80端口的(http默认端口)
这样填http://公网地址/项目名称/请求路径

然后呢,如果照我前天那样配置在服务器上配置过项目和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();
}
Controller调用Service的方法(给用户返回消息,也是一个xml格式的字符串)

@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;

   }
}

在Service里将xml格式的消息转换成map,拼接一下信息,再转回xml形式

好了,剩下的就是SpringMVC的配置文件了,对了,还有TextMessage的实体类,里边只有set,get方法,不作赘述

运行一下没问题打包放到服务器上,启动tomcat

这里再进行URL和token的提交,就会提示配置成功!

进入测试公众号,发个信息看看

如上,最后我乱码的问题还是没有解决,web.xml统一编码UTF-8还有服务器上的tomcat配置都改了也没用,还是中文乱码。。

明天计划的事情:

小课堂

遇到的问题:

用户进入回调页面这个东西还是要前端先搞一个点击事件出来,获取到code给后端才能做,暂时无解


返回列表 返回列表
评论

    分享到