zoukankan      html  css  js  c++  java
  • 微信公众平台开发(二)简单的聊天机器人

    1.设置成为开发者模式

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


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


    2.实现GET方法

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

    新建Servlet HelloWeChat,先实现其中的GET方法

        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/QiyadengWeb/HelloWeChat?echostr=hello中文,先进行测试,如果没有问题,可以部署到服务器上,然后在微信公众平台进行设置了。

    3.实现POST方法

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

        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数据使用方法,可以参考下图标注内容。

    4.部署并测试

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

    5.依赖库

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

          <dependency>
              
    <groupId>joda-time</groupId>
              
    <artifactId>joda-time</artifactId>
              
    <version>2.2</version>
          
    </dependency>
          
    <dependency>
              
    <groupId>org.apache.commons</groupId>
              
    <artifactId>commons-io</artifactId>
              
    <version>1.3.2</version>
          
    </dependency>
          
    <dependency>
              
    <groupId>com.thoughtworks.xstream</groupId>
              
    <artifactId>xstream</artifactId>
              
    <version>1.4.3</version>
          
    </dependency>

    6.完整的代码

    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;
        }

    }

    原创文章,转载请注明: 转载自http://www.qiyadeng.com/

    本文链接地址: 微信公众平台开发(二)–简单的聊天机器人

  • 相关阅读:
    将excel中的数据导入到oracle数据库中
    C++学习–基础篇(书籍推荐及分享)
    Spring MVC No converter found for return value of type
    jQuery>学习
    动态建立事件
    sizeof:结构体对齐问题
    次窗体修改主窗体控件属性
    资源文件的读取和使用
    小端格式和大端格式(LittleEndian&BigEndian)
    新增控件数组
  • 原文地址:https://www.cnblogs.com/qiyadeng/p/2964920.html
Copyright © 2011-2022 走看看