千家信息网

微信开发之如何处理微信客户端发来的消息

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍微信开发之如何处理微信客户端发来的消息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在开启微信开发者模式时,我们配置了一个URL地址,当我们提交开启微信开发者模
千家信息网最后更新 2025年01月18日微信开发之如何处理微信客户端发来的消息

这篇文章主要介绍微信开发之如何处理微信客户端发来的消息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

在开启微信开发者模式时,我们配置了一个URL地址,当我们提交开启微信开发者模式,腾讯的微信服务器会向该URL地址发送一个get请求,并且携带一些参数,让我们来验证。说到get请求,就必须说到post请求,关注我们公众号的微信粉丝发来的消息,触发的事件,腾讯的微信服务器则会像该URL地址发送一个post请求,请求的内容就是以xml文档形式的字符串。

所以该URL地址的get请求的处理方法,专门用于开启微信开发者模式;而post请求则用于处理微信粉丝发给我们的消息,或者触发的事件,所以我们后面的微信开发工作的起点就是该URL地址的post处理方法。

下面我们处理一个最简单的例子:粉丝发送任意一个文本信息给我们,我们给他回复一个消息:"你好,+ 他微信的openId"

下面直接贴代码:

URL对应的处理servlet:

public class CoreServlet extends HttpServlet {        private static final long serialVersionUID = 4440739483644821986L;        /**         * 请求校验(确认请求来自微信服务器)         */        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException         {                // 微信服务端发来的加密签名                String signature = request.getParameter("signature");                // 时间戳                String timestamp = request.getParameter("timestamp");                // 随机数                String nonce = request.getParameter("nonce");                // 随机字符串                String echostr = request.getParameter("echostr");                                PrintWriter out = response.getWriter();                // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败                if (SignUtil.checkSignature(signature, timestamp, nonce)) {                        out.print(echostr);                }                out.close();                out = null;        }        /**         * 请求校验与处理         */        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException         {                // 将请求、响应的编码均设置为UTF-8(防止中文乱码)                request.setCharacterEncoding("UTF-8");                response.setCharacterEncoding("UTF-8");                                // 接收参数微信加密签名、 时间戳、随机数                String signature = request.getParameter("signature");                String timestamp = request.getParameter("timestamp");                String nonce = request.getParameter("nonce");                PrintWriter out = response.getWriter();                // 请求校验                if (SignUtil.checkSignature(signature, timestamp, nonce)) {                        Message msgObj = XMLUtil.getMessageObject(request);      // 读取微信客户端发来的消息(xml字符串),并将其转换为消息对象                        if(msgObj != null){                                String xml = "" +                                                 "" +  // 接收方帐号(收到的OpenID)                                                 "" +        // 开发者微信号                                                 "12345678" +                                                 "" +                                                 "" +                                                 "";                                out.write(xml); // 回复微信客户端的消息(xml字符串)                                out.close();                                return;                        }                }                out.write("");                out.close();        }}

xml字符串的处理工具类,实现xml消息到消息对象的转换:

public class XMLUtil {        /**         * 从request中读取用户发给公众号的消息内容         * @param request         * @return 用户发给公众号的消息内容         * @throws IOException         */        public static String readRequestContent(HttpServletRequest request) throws IOException        {                // 从输入流读取返回内容                InputStream inputStream = request.getInputStream();                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);                String str = null;                StringBuilder buffer = new StringBuilder();                                while ((str = bufferedReader.readLine()) != null) {                        buffer.append(str);                }                                // 释放资源                bufferedReader.close();                inputStreamReader.close();                inputStream.close();                                return buffer.toString();        }                /**         * 将xml文档的内容转换成map         * @param xmlDoc         * @return map         */        public static Map xmlToMap(String xmlDoc)        {                //创建一个新的字符串        StringReader read = new StringReader(xmlDoc);        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入        InputSource source = new InputSource(read);        //创建一个新的SAXBuilder        SAXBuilder sb = new SAXBuilder();                Map xmlMap = new HashMap();        try {            Document doc = sb.build(source); //通过输入源构造一个Document            Element root = doc.getRootElement();     //取的根元素                        List cNodes = root.getChildren(); //得到根元素所有子元素的集合(根元素的子节点,不包括孙子节点)            Element et = null;            for(int i=0;i map)        {                if(map != null){                        String MsgType = map.get("MsgType");                                                // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video,                         // 地理位置消息:location, 链接消息:link)                        if("text".equals(MsgType)){                                TextMessage msg = new TextMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setContent(map.get("Content"));                                return msg;                        }                        if("ImageMessage".equals(MsgType)){                                ImageMessage msg = new ImageMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setPicUrl(map.get("PicUrl"));                                msg.setMediaId(map.get("MediaId"));                                return msg;                        }                        if("video".equals(MsgType)){                                VideoMessage msg = new VideoMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setMediaId(map.get("MediaId"));                                msg.setThumbMediaId(map.get("ThumbMediaId"));                                return msg;                        }                        if("voice".equals(MsgType)){                                VoiceMessage msg = new VoiceMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setMediaId(map.get("MediaId"));                                msg.setFormat(map.get("Format"));                                return msg;                        }                        if("location".equals(MsgType)){                                LocationMessage msg = new LocationMessage();                                msg.setLocation_X(map.get("Location_X"));                                msg.setLocation_Y(map.get("Location_Y"));                                msg.setScale(map.get("Scale"));                                msg.setLabel(map.get("Label"));                                return msg;                        }                        if("link".equals(MsgType)){                                LinkMessage msg = new LinkMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setTitle(map.get("Title"));                                msg.setDescription(map.get("Description"));                                msg.setUrl(map.get("Url"));                                return msg;                        }                }                return null;        }                /**         * 将保存xml内容的map转换成对象         * @param map         * @return         * @throws IOException          */        public static Message getMessageObject(HttpServletRequest request) throws IOException        {                String xmlDoc = XMLUtil.readRequestContent(request);     // 读取微信客户端发了的消息(xml)                Map map = XMLUtil.xmlToMap(xmlDoc);           // 将客户端发来的xml转换成Map                if(map != null){                        String MsgType = map.get("MsgType");                                                // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video,                         // 地理位置消息:location, 链接消息:link)                        if("text".equals(MsgType)){                                TextMessage msg = new TextMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setContent(map.get("Content"));                                return msg;                        }                        /*if("ImageMessage".equals(MsgType)){                                ImageMessage msg = new ImageMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setPicUrl(map.get("PicUrl"));                                msg.setMediaId(map.get("MediaId"));                                return msg;                        }                        if("video".equals(MsgType)){                                VideoMessage msg = new VideoMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setMediaId(map.get("MediaId"));                                msg.setThumbMediaId(map.get("ThumbMediaId"));                                return msg;                        }                        if("voice".equals(MsgType)){                                VoiceMessage msg = new VoiceMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setMediaId(map.get("MediaId"));                                msg.setFormat(map.get("Format"));                                return msg;                        }                        if("location".equals(MsgType)){                                LocationMessage msg = new LocationMessage();                                msg.setLocation_X(map.get("Location_X"));                                msg.setLocation_Y(map.get("Location_Y"));                                msg.setScale(map.get("Scale"));                                msg.setLabel(map.get("Label"));                                return msg;                        }                        if("link".equals(MsgType)){                                LinkMessage msg = new LinkMessage();                                XMLUtil.initCommonMsg(msg, map);                                                                msg.setTitle(map.get("Title"));                                msg.setDescription(map.get("Description"));                                msg.setUrl(map.get("Url"));                                return msg;                        }*/                }                return null;        }                public static void initCommonMsg(Message msg, Map map)        {                msg.setMsgId(map.get("MsgId"));                msg.setMsgType(map.get("MsgType"));                msg.setToUserName(map.get("ToUserName"));                msg.setFromUserName(map.get("FromUserName"));                msg.setCreateTime(map.get("CreateTime"));        }}

粉丝发来的消息分为了6中类型(文本消息, 图片消息, 语音消息, 视频消息, 地理位置消息, 链接消息):

/** * 微信消息基类 * @author yuanfang * @date 2015-03-23 */public class Message {        private String MsgId; // 消息id,64位整型        private String MsgType;       // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, 地理位置消息:location, 链接消息:link)        private String ToUserName;    //开发者微信号        private String FromUserName; // 发送方帐号(一个OpenID)        private String CreateTime;    // 消息创建时间 (整型)                public String getToUserName() {                return ToUserName;        }        public void setToUserName(String toUserName) {                ToUserName = toUserName;        }        public String getFromUserName() {                return FromUserName;        }        public void setFromUserName(String fromUserName) {                FromUserName = fromUserName;        }        public String getCreateTime() {                return CreateTime;        }        public void setCreateTime(String createTime) {                CreateTime = createTime;        }        public String getMsgType() {                return MsgType;        }        public void setMsgType(String msgType) {                MsgType = msgType;        }        public String getMsgId() {                return MsgId;        }        public void setMsgId(String msgId) {                MsgId = msgId;        }        }

文本消息类:

package com.sinaapp.wx.msg;public class TextMessage extends Message {        private String Content;       // 文本消息内容        public String getContent() {                return Content;        }        public void setContent(String content) {                Content = content;        }        }

以上是"微信开发之如何处理微信客户端发来的消息"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0