qiyadeng

          專注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34
          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/

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

          Feedback

          # re: 微信公眾平臺開發(二)--簡單的聊天機器人[未登錄]  回復  更多評論   

          2013-03-19 12:49 by 大海
          正在學習javaweb的內容,感覺作者寫的這個不錯.既有趣還可以練習所學內容.不知道作者還會不會繼續去寫微信開放平臺的代碼.我好繼續向博主學習

          # re: 微信公眾平臺開發(二)--簡單的聊天機器人  回復  更多評論   

          2013-04-27 09:16 by 微信公眾平臺開發者
          微信公眾平臺開發者 qq群127860053

          # re: 微信公眾平臺開發(二)--簡單的聊天機器人  回復  更多評論   

          2013-06-19 18:13 by 河南銳騎
          微信借助LBS可以開發出公眾平臺的一些本地化便民服務。如:利用LBS,我可以讓用戶發送一個位置,然后查詢附近的酒店,然后通過微信預定酒店。也可以通過LBS顯示附近的店鋪,娛樂優惠信息,用戶憑借綁定微信號后,可以到這些店里面享受購物娛樂優惠活動。這些功能不僅為用戶提供了極大的便利,還可以讓用戶感受到良好的體驗。這樣,用戶就會對您們的店鋪產生更好的印象,無形之中,就做到了宣傳的作用。

          http://www.weixindev.com

          # re: 微信公眾平臺開發(二)--簡單的聊天機器人  回復  更多評論   

          2013-07-25 15:05 by bokix
          post請求里面不用做校驗了?如果是其他網站post過來的虛假消息呢?

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 蒙山县| 湖南省| 涡阳县| 襄樊市| 久治县| 泰和县| 湖南省| 定远县| 南丰县| 定兴县| 靖远县| 平定县| 安龙县| 柘城县| 盘山县| 伊吾县| 弋阳县| 海淀区| 马龙县| 芦溪县| 三都| 望城县| 从江县| 合阳县| 三河市| 贵阳市| 灵丘县| 宁化县| 射洪县| 尼勒克县| 定南县| 都昌县| 莲花县| 上高县| 蛟河市| 霍州市| 平罗县| 潜江市| 张家港市| 宁化县| 凤山市|