微信公衆平臺開發(二)--簡單的聊天機器人

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/

本文鏈接地址: 微信公衆平臺開發(二)–簡單的聊天機器人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章