qiyadeng

          專(zhuān)注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34
          1.設(shè)置成為開(kāi)發(fā)者模式

          登錄微信工作平臺(tái),選擇高級(jí)功能-進(jìn)入開(kāi)發(fā)模式,成為開(kāi)發(fā)者。需要做如下圖配置。URL配置的信息是指,微信的后臺(tái)服務(wù)器把您的用戶消息發(fā)送到該URL處理。Token是你和微信之間的一個(gè)密碼,用來(lái)驗(yàn)證消息是否是從微信的服務(wù)發(fā)送而來(lái),而不是其他來(lái)攻擊你的系統(tǒng)。


          現(xiàn)在你還不能設(shè)置,在設(shè)置時(shí)微信會(huì)GET請(qǐng)求你設(shè)置的URL,已檢測(cè)接口是否可以使用。只有等你準(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 為了簡(jiǎn)單起見(jiàn),先不對(duì)消息來(lái)源進(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)行測(cè)試,如果沒(méi)有問(wèn)題,可以部署到服務(wù)器上,然后在微信公眾平臺(tái)進(jìn)行設(shè)置了。

          3.實(shí)現(xiàn)POST方法

          POST方法首先接收到微信公眾平臺(tái)傳送過(guò)來(lá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){
                      
          //增加你所需要的處理邏輯,這里只是簡(jiǎn)單重復(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.部署并測(cè)試

          完成第一步,并和你的公眾帳號(hào)好進(jìn)行對(duì)話,回復(fù)消息沒(méi)有問(wèn)題的話,那就恭喜你了

          5.依賴庫(kù)

          使用maven的同學(xué),添加以下依賴即可。非maven用戶,找到這些庫(kù)添加到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 為了簡(jiǎn)單起見(jiàn),先不對(duì)消息來(lái)源進(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){
                      
          //增加你所需要的處理邏輯,這里只是簡(jiǎn)單重復(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;
              }

          }

          原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自http://www.qiyadeng.com/

          本文鏈接地址: 微信公眾平臺(tái)開(kāi)發(fā)(二)–簡(jiǎn)單的聊天機(jī)器人

          Feedback

          # re: 微信公眾平臺(tái)開(kāi)發(fā)(二)--簡(jiǎn)單的聊天機(jī)器人[未登錄](méi)  回復(fù)  更多評(píng)論   

          2013-03-19 12:49 by 大海
          正在學(xué)習(xí)javaweb的內(nèi)容,感覺(jué)作者寫(xiě)的這個(gè)不錯(cuò).既有趣還可以練習(xí)所學(xué)內(nèi)容.不知道作者還會(huì)不會(huì)繼續(xù)去寫(xiě)微信開(kāi)放平臺(tái)的代碼.我好繼續(xù)向博主學(xué)習(xí)

          # re: 微信公眾平臺(tái)開(kāi)發(fā)(二)--簡(jiǎn)單的聊天機(jī)器人  回復(fù)  更多評(píng)論   

          2013-04-27 09:16 by 微信公眾平臺(tái)開(kāi)發(fā)者
          微信公眾平臺(tái)開(kāi)發(fā)者 qq群127860053

          # re: 微信公眾平臺(tái)開(kāi)發(fā)(二)--簡(jiǎn)單的聊天機(jī)器人  回復(fù)  更多評(píng)論   

          2013-06-19 18:13 by 河南銳騎
          微信借助LBS可以開(kāi)發(fā)出公眾平臺(tái)的一些本地化便民服務(wù)。如:利用LBS,我可以讓用戶發(fā)送一個(gè)位置,然后查詢附近的酒店,然后通過(guò)微信預(yù)定酒店。也可以通過(guò)LBS顯示附近的店鋪,娛樂(lè)優(yōu)惠信息,用戶憑借綁定微信號(hào)后,可以到這些店里面享受購(gòu)物娛樂(lè)優(yōu)惠活動(dòng)。這些功能不僅為用戶提供了極大的便利,還可以讓用戶感受到良好的體驗(yàn)。這樣,用戶就會(huì)對(duì)您們的店鋪產(chǎn)生更好的印象,無(wú)形之中,就做到了宣傳的作用。

          http://www.weixindev.com

          # re: 微信公眾平臺(tái)開(kāi)發(fā)(二)--簡(jiǎn)單的聊天機(jī)器人  回復(fù)  更多評(píng)論   

          2013-07-25 15:05 by bokix
          post請(qǐng)求里面不用做校驗(yàn)了?如果是其他網(wǎng)站post過(guò)來(lái)的虛假消息呢?

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 珲春市| 普安县| 湾仔区| 洪江市| 荥阳市| 临湘市| 牟定县| 星座| 承德县| 萨嘎县| 利川市| 淄博市| 西贡区| 阿克陶县| 宜良县| 华安县| 光泽县| 两当县| 宜春市| 曲水县| 遂川县| 息烽县| 房产| 衢州市| 小金县| 天长市| 开封县| 东源县| 聂荣县| 永宁县| 台东市| 新河县| 大同市| 育儿| 玛沁县| 永登县| 西昌市| 开平市| 阜南县| 温宿县| 剑阁县|