微信公众平台开发(二)--简单的聊天机器人

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/

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值