第 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

时间: 2024-10-12 19:27:54

第 6 章 微信开发之各种消息的接收与响应的相关文章

C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题

不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有兴趣可以关注看看:zyjsoft) 第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口): //认证接口 public ActionResult WeiXin(string signature, string timestamp, string nonce, st

[029] 微信公众帐号开发教程第5篇-各种消息的接收与响应

前一篇文章里我们已经把微信公众平台接口中消息及相关操作都进行了封装,本章节将主要介绍如何接收微信服务器发送的消息并做出响应. 明确在哪接收消息 从微信公众平台接口消息指南中可以了解到,当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类CoreServlet的doPost方法中接收消息.处理消息和响应消息.   接收.处理.响应消息 下面先来看我已经写好的CoreServlet的完整代码: [java] vie

《C#微信开发系列(4)-接收 / 返回文本消息》

4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息微信开发文档,对微信的这种消息处理机制有一定了解之后再着手开发(微信开发接收普通消息开发文档) 注意点: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不

第 5 章 微信开发之解析微信服务器传来的消息以及将响应消息转换成xml返回给微信服务器

/** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO 消息的接收.处理.响应 } doPost方法有两个参数: 1.request中封装了请求相关的所有内容,可以从request中取出微信服务器发来的消息: 2.response我们可以对接收到的消息进行响应,即

夺命雷公狗---微信开发23----客服消息接口基础和推送文本

我们这边课程里面一共用到了三个文件,分别是WeChat.class.php和common.php以及index.php 我们在写这个功能之前也要学会查手册,手册我们可以在微信开发这里找到,如下所示: 点击进去后我们将会看到客服接口,我们可以点击下进去看看里面有什么动动 这里有一个发送文本消息的,我们点击进去看下 这里很明显就看到文本消息是通过一个json数据来进行实现的,废话不多说,开工 这里我们先来写一个WeChat.php的文件,这里作用主要适用于封装一个CURL上传类的,代码如下所示: <

微信开发第二篇----消息应答

接上篇,看ResponseXML(postString);方法如下 /// <summary>        /// 获取用户发送的消息        /// </summary>        /// <param name="postString"></param>        private void ResponseXML(string postString)        {            //使用XMLDocumen

微信开发系列----02:实现POST请求响应

继续昨天的,现在我们的微信测试成功了,可以开发实现微信的各种功能,今天主要实现微信的简单交互,比如发送语音,图片,文本等请求,网站服务器发送对应的响应. 项目GitHub地址:  https://github.com/Andyahui/xgyxsh_WeiXin 一:微信XML的POST请求处理 昨天我们已经成为了开发者,说明get请求时可以到底,且是得到了相应的处理,下面是我们通过浏览器我们配置的URL浏览到的. 我们可以发现在get请求中设置的返回值在这里出现了,说明我们的测试是成功的.下面

夺命雷公狗---微信开发27----客服消息接口基础和推送图文消息

按照25课的套路在改下index.php即可实现,代码如下所示: <?php /** * wechat php test */ //define your token require_once "common.php"; //这里是引入curl发送函数的类 require_once 'WeChat.class.php'; define("TOKEN", "twgdh"); //这里让这个类继承了curl发送参数的类 class wechat

微信公众号开发教程[003]-消息管理-接收消息

当微信用户向公众号发送消息时,微信服务器会向公众号配置的服务器URL地址发送请求,并将相关内容包装成一定格式的xml发送到这个服务器;响应时,这个服务器只要回复特定格式的xml字符串给微信服务器,微信服务器即可向微信用户的客户端转发这条回复消息.(假设公众号开发模式已开启,以后的教程,如果没有特别说明,都是如此).如下图: 例如,文本消息的xml结构如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> &