第 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解析微信发来的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

 

你可能感兴趣的:(微信开发)