热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

腾讯微信公众平台开发教程(二)–简单的聊天机器人

登录微信公众平台,选择高级功能-进入开发模式,成为开发者。需要做如下图配置。URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理。Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统。

一、设置成为开发者模式

登录微信公众平台,选择高级功能-进入开发模式,成为开发者。需要做如下图配置。URL配置的信息是指,微信的后台服务器把您的用户消息发送到该URL处理。Token是你和微信之间的一个密码,用来验证消息是否是从微信的服务发送而来,而不是其他来攻击你的系统。

现在你还不能设置,在设置时微信会GET请求你设置的URL,已检测接口是否可以使用。只有等你准备好GET方法之后才可以进行设置。

腾讯微信公众开发教程


二、实现GET方法

从文档中知道,我们需要实现POST和GET方法,GET方法用于验证微信和你的通讯验证,POST用于消息处理。
新建Servlet HelloWeChat,先实现其中的GET方法

1
2
3
4
5
6
7
8
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO 为了简单起见,先不对消息来源进行校验
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter pw = response.getWriter();
                String echo = request.getParameter("echostr");
                echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8");
                pw.println(echo);
        }

可以在本地使用http://localhost:8080/web/HelloWeChat?echostr=hello中文(这里请注意你自己的本地环境路径问题),先进行测试,如果没有问题,可以部署到服务器上,然后在微信公众平台进行设置了。

三、实现POST方法

POST方法首先接收到微信公众平台传送过来的XML,从中提取消息发送人和消息内容。更加消息发送内容,你可以增加自己的处理逻辑,最后拼装成回复消息XML,返回给微信公众平台。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter pw = response.getWriter();
                String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8");
                WeChatTextMessage textMsg = null;
                try {
                        textMsg = getWeChatTextMessage(wxMsgXml);
                } catch (Exception e) {
                        e.printStackTrace();
                }
                StringBuffer replyMsg = new StringBuffer();
                if(textMsg != null){
                        //增加你所需要的处理逻辑,这里只是简单重复消息
                        replyMsg.append("您给我的消息是:");
                        replyMsg.append(textMsg.getContent());
                }
                else{
                        replyMsg.append(":)不是文本的消息,我暂时看不懂");
                }
                String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
                pw.println(returnXml);
        }

关于调试,这里推荐一个工具Fiddler,你可以模拟微信的POST消息到你的本地,而不必每次部署到服务器上进行调试。关于Fiddler的POST数据使用方法,可以参考下图标注内容。

微信公众平台开发教程

四、部署并测试

完成第一步,并和你的公众帐号好进行对话,回复消息没有问题的话,那就恭喜你了

微信公众平台开发教程

五、依赖库

使用maven的同学,添加以下依赖即可。非maven用户,找到这些库添加到buider path中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>
                >joda-time>
                >joda-time>
                >2.2>
        >
        >
                >org.apache.commons>
                >commons-io>
                >1.3.2>
        >
        >
                >com.thoughtworks.xstream>
                >xstream>
                >1.4.3>
        >

总结:以下是本文教程完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.qiyadeng.wechat;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
* Servlet implementation class HelloWeChat
*/

public class HelloWeChat extends HttpServlet {
        private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */

    public HelloWeChat() {
        super();
    }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO 为了简单起见,先不对消息来源进行校验
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter pw = response.getWriter();
                String echo = request.getParameter("echostr");
                echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8");
                pw.println(echo);
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter pw = response.getWriter();
                String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8");
                WeChatTextMessage textMsg = null;
                try {
                        textMsg = getWeChatTextMessage(wxMsgXml);
                } catch (Exception e) {
                        e.printStackTrace();
                }
                StringBuffer replyMsg = new StringBuffer();
                if(textMsg != null){
                        //增加你所需要的处理逻辑,这里只是简单重复消息
                        replyMsg.append("您给我的消息是:");
                        replyMsg.append(textMsg.getContent());
                }
                else{
                        replyMsg.append(":)不是文本的消息,我暂时看不懂");
                }
                String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
                pw.println(returnXml);
        }
       
        private WeChatTextMessage getWeChatTextMessage(String xml){
                XStream xstream = new XStream(new DomDriver());
                xstream.alias("xml", WeChatTextMessage.class);
                xstream.aliasField("ToUserName", WeChatTextMessage.class, "toUserName");
                xstream.aliasField("FromUserName", WeChatTextMessage.class, "fromUserName");
                xstream.aliasField("CreateTime", WeChatTextMessage.class, "createTime");
                xstream.aliasField("MsgType", WeChatTextMessage.class, "messageType");
                xstream.aliasField("Content", WeChatTextMessage.class, "content");
                xstream.aliasField("MsgId", WeChatTextMessage.class, "msgId");
                WeChatTextMessage wechatTextMessage = (WeChatTextMessage)xstream.fromXML(xml);
                return wechatTextMessage;
        }
       
        private String getReplyTextMessage(String content, String weChatUser){
                WeChatReplyTextMessage we = new WeChatReplyTextMessage();
                we.setMessageType("text");
                we.setFuncFlag("0");
                we.setCreateTime(new Long(new Date().getTime()).toString());
                we.setContent(content);
                we.setToUserName(weChatUser);
                we.setFromUserName("shanghaiweather");//TODO 你的公众帐号微信号
                XStream xstream = new XStream(new DomDriver());
                xstream.alias("xml", WeChatReplyTextMessage.class);
                xstream.aliasField("ToUserName", WeChatReplyTextMessage.class, "toUserName");
                xstream.aliasField("FromUserName", WeChatReplyTextMessage.class, "fromUserName");
                xstream.aliasField("CreateTime", WeChatReplyTextMessage.class, "createTime");
                xstream.aliasField("MsgType", WeChatReplyTextMessage.class, "messageType");
                xstream.aliasField("Content", WeChatReplyTextMessage.class, "content");
                xstream.aliasField("FuncFlag", WeChatReplyTextMessage.class, "funcFlag");
                String xml =xstream.toXML(we);
                return xml;
        }

}
 

推荐阅读
author-avatar
建哥2502897913
这个家伙很懒,什么也没留下!