一、在哪里接收这些消息
从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息、处理消息和响应消息。
/** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信服务器POST消息时用的是UTF-8编码,在接收时也要用同样的编码,否则中文会乱码; request.setCharacterEncoding("UTF-8"); //在响应消息(回复消息给用户)时,也将编码方式设置为UTF-8,原理同上; response.setCharacterEncoding("UTF-8"); // 调用CoreService类的processRequest方法接收、处理消息,并得到处理结果; String respMessage = CoreService.processRequest(request); // 调用response.getWriter().write()方法将消息的处理结果返回给用户 PrintWriter out = response.getWriter(); out.print(respMessage); out.close(); }
二、怎么接收和响应这些消息
package com.souvc.weixin.service; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.souvc.weixin.message.resp.TextMessage; import com.souvc.weixin.util.MessageUtil; /** * * @ClassName: CoreService * @Description: 业务核心类 * @author: souvc * @date Jun 15, 2015 4:49:10 PM */ public class CoreService { /** * 处理微信发来的请求 * * @param request * @return */ public static String processRequest(HttpServletRequest request) { String respMessage = null; try { // 默认返回的文本消息内容 String respContent = "请求处理异常,请稍候尝试!"; // 调用消息工具类MessageUtil解析微信发来的xml格式的消息,解析的结果放在HashMap里; Map<String, String> requestMap = MessageUtil.parseXml(request); // 从HashMap中取出消息中的FromUserName,ToUserName,MsgType字段; // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 消息类型 String msgType = requestMap.get("MsgType"); // 回复文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setFuncFlag(0); // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { respContent = "您发送的是文本消息!"; } // 图片消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { respContent = "您发送的是图片消息!"; } // 地理位置消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { respContent = "您发送的是地理位置消息!"; } // 链接消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { respContent = "您发送的是链接消息!"; } // 音频消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { respContent = "您发送的是音频消息!"; } // 事件推送 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { // 事件类型 String eventType = requestMap.get("Event"); // 订阅 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { respContent = "谢谢您的关注!"; } // 取消订阅 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息 } // 自定义菜单点击事件 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) { // TODO 自定义菜单权没有开放,暂不处理该类消息 } } textMessage.setContent(respContent); // 调用消息工具类MessageUtil将要返回的文本消息对象TextMessage转化成xml格式的字符串; respMessage = MessageUtil.textMessageToXml(textMessage); } catch (Exception e) { e.printStackTrace(); } return respMessage; } }
微信服务器发送过来的消息,我们服务器回应响应的消息。
完整的源码: http://yunpan.cn/cQyvhABdhNVR9 访问密码 2336
时间: 2024-10-12 19:27:54