你的位置:首页 > Java教程

[Java教程]第 6 章 微信开发之各种消息的接收与响应


一、在哪里接收这些消息

从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过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解析微信发来的      Map<String, String> requestMap = MessageUtil.parse// 从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转化成      respMessage = MessageUtil.textMessageTocatch (Exception e) {      e.printStackTrace();    }    return respMessage;  }}

 

微信服务器发送过来的消息,我们服务器回应响应的消息。

完整的源码: http://yunpan.cn/cQyvhABdhNVR9  访问密码 2336