微信公眾平臺(tái)開發(fā)(二)簡單的聊天機(jī)器人
1.設(shè)置成為開發(fā)者模式
登錄微信工作平臺(tái),選擇高級(jí)功能-進(jìn)入開發(fā)模式,成為開發(fā)者。需要做如下圖配置。URL配置的信息是指,微信的后臺(tái)服務(wù)器把您的用戶消息發(fā)送到該URL處理。Token是你和微信之間的一個(gè)密碼,用來驗(yàn)證消息是否是從微信的服務(wù)發(fā)送而來,而不是其他來攻擊你的系統(tǒng)。
現(xiàn)在你還不能設(shè)置,在設(shè)置時(shí)微信會(huì)GET請求你設(shè)置的URL,已檢測接口是否可以使用。只有等你準(zhǔn)備好GET方法之后才可以進(jìn)行設(shè)置。
2.實(shí)現(xiàn)GET方法
從文檔中知道,我們需要實(shí)現(xiàn)POST和GET方法,GET方法用于驗(yàn)證微信和你的通訊驗(yàn)證,POST用于消息處理。
新建Servlet HelloWeChat,先實(shí)現(xiàn)其中的GET方法
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO 為了簡單起見,先不對消息來源進(jìn)行校驗(yàn)
- 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中文,先進(jìn)行測試,如果沒有問題,可以部署到服務(wù)器上,然后在微信公眾平臺(tái)進(jìn)行設(shè)置了。
3.實(shí)現(xiàn)POST方法
POST方法首先接收到微信公眾平臺(tái)傳送過來的XML,從中提取消息發(fā)送人和消息內(nèi)容。更加消息發(fā)送內(nèi)容,你可以增加自己的處理邏輯,最后拼裝成回復(fù)消息XML,返回給微信公眾平臺(tái)。
- 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){
- //增加你所需要的處理邏輯,這里只是簡單重復(fù)消息
- replyMsg.append("您給我的消息是:");
- replyMsg.append(textMsg.getContent());
- }
- else{
- replyMsg.append(":)不是文本的消息,我暫時(shí)看不懂");
- }
- String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName());
- pw.println(returnXml);
- }
關(guān)于調(diào)試,這里推薦一個(gè)工具Fiddler,你可以模擬微信的POST消息到你的本地,而不必每次部署到服務(wù)器上進(jìn)行調(diào)試。關(guān)于Fiddler的POST數(shù)據(jù)使用方法,可以參考下圖標(biāo)注內(nèi)容。
4.部署并測試
完成第一步,并和你的公眾帳號(hào)好進(jìn)行對話,回復(fù)消息沒有問題的話,那就恭喜你了
。
5.依賴庫
使用maven的同學(xué),添加以下依賴即可。非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 為了簡單起見,先不對消息來源進(jìn)行校驗(yàn)
- 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){
- //增加你所需要的處理邏輯,這里只是簡單重復(fù)消息
- replyMsg.append("您給我的消息是:");
- replyMsg.append(textMsg.getContent());
- }
- else{
- replyMsg.append(":)不是文本的消息,我暫時(shí)看不懂");
- }
- 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 你的公眾帳號(hào)微信號(hào)
- 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;
- }
- }
閱讀第三篇:微信公眾平臺(tái)開發(fā)(三)位置信息的識(shí)別
閱讀第一篇:微信公眾平臺(tái)開發(fā)(一)平臺(tái)綜述
轉(zhuǎn)載自http://www.qiyadeng.com/