最近在作微信公衆平臺開發,一口氣寫了二十幾個功能,挺有意思的~
今天來分享一下開發經驗~
微信公衆平臺提供的接口很簡單,先看看消息交互流程:
說的通俗一些,用戶使用微信發送消息 -> 微信將數據發送給開發者 -> 開發者處理消息並返回數據至微信 -> 微信把返回數據發送給用戶,期間數據交互經過XML完成,就這麼簡單。
下面寫個實例,開發微信智能聊天機器人:
1. 註冊微信公衆平臺帳號php
微信公衆平臺:
https://mp.weixin.qq.com/json
注: 目前一張身份證只能註冊兩個帳號,帳號名稱關乎加V認證,請慎重註冊。
2. 申請服務器/虛擬主機
沒有服務器/虛擬主機的童鞋可使用BAE和SAE,很少介紹。
3. 開啓開發者模式
微信公衆平臺有兩個模式,一個是編輯模式(傻瓜模式),簡單但功能單一。另外一個是開發者模式,能夠經過開發實現複雜功能。兩個模式互斥,顯而易見,登陸微信公衆平臺並經過「高級功能」菜單開啓開發者模式。
4. 填寫接口配置信息
一樣是在「高級功能」菜單中配置,須要配置兩項參數:
URL: 開發者應用訪問地址,目前僅支持80端口,以「http://www.1990c.com/weixin/index.php」爲例。
TOKEN: 隨意填寫,用於生成簽名,以「1990c」爲例。
填寫完把下面代碼保存爲index.php並上傳至http://www.1990c.com/weixin/目錄,最後點擊「提交」完成驗證。服務器
01 <?php 02 define("TOKEN", "1990c"); //TOKEN值 03 $wechatObj = new wechat(); 04 $wechatObj->valid(); 05 class wechat { 06 public function valid() { 07 $echoStr = $_GET["echostr"]; 08 if($this->checkSignature()){ 09 echo $echoStr; 10 exit; 11 } 12 } 13 14 private function checkSignature() { 15 $signature = $_GET["signature"]; 16 $timestamp = $_GET["timestamp"]; 17 $nonce = $_GET["nonce"]; 18 $token = TOKEN; 19 $tmpArr = array($token, $timestamp, $nonce); 20 sort($tmpArr); 21 $tmpStr = implode( $tmpArr ); 22 $tmpStr = sha1( $tmpStr ); 23 if( $tmpStr == $signature ) { 24 return true; 25 } else { 26 return false; 27 } 28 } 29 } 30 ?>
這玩意兒就是微信公衆平臺校驗URL是否正確接入,研究代碼沒有實質性意義,驗證完便可刪除文件,就不詳細說明了,有興趣的童鞋能夠查看官方文檔。微信
微信公衆平臺API文檔:
http://mp.weixin.qq.com/wiki/index.phpcookie
5. 開發微信公衆平臺功能
OK,上面提到了,微信公衆平臺與開發者之間的數據交互是經過XML完成的,既然用到XML,固然得遵循規範,因此在着手開發以前先看看官方接口文檔提供的XML規範,以文本消息爲例:
當用戶向微信公衆帳號發送消息時,微信服務器會POST給開發者一些數據:微信公衆平臺
1 <xml> 2 02 3 <!--開發者微信號--> 4 03 5 <ToUserName><![CDATA[toUser]]></ToUserName> 6 04 7 <!--發送方賬號(OpenID)--> 8 05 9 <FromUserName><![CDATA[fromUser]]></FromUserName> 10 06 11 <!--消息建立時間 (整型)--> 12 07 13 <CreateTime>12345678</CreateTime> 14 08 15 <!--消息類別 (text文本消息)--> 16 09 17 <MsgType><![CDATA1]></MsgType> 18 10 19 <!--消息內容--> 20 11 21 <Content><![CDATA[content]]></Content> 22 12 23 <!--消息ID (64位整型)--> 24 13 25 <MsgId>1234567890123456</MsgId> 26 14 27 </xml>
開發者在處理完消息後須要返回數據給微信服務器:curl
<xml> 02 <!--接收方賬號(OpenID)--> 03 <ToUserName><![CDATA[toUser]]></ToUserName> 04 <!--開發者微信號--> 05 <FromUserName><![CDATA[fromUser]]></FromUserName> 06 <!--消息建立時間 (整型)--> 07 <CreateTime>12345678</CreateTime> 08 <!--消息類別 (text文本消息)--> 09 <MsgType><![CDATA1]></MsgType> 10 <!--回覆消息內容--> 11 <Content><![CDATA[content]]></Content> 12 <!--星標操做(位0x0001被標誌時 星標剛收到的消息)--> 13 <FuncFlag>0</FuncFlag> 14 </xml>
除文本消息外,微信公衆平臺還支持用戶發送圖片消息、地理位置消息、連接消息、事件推送,而開發者還能夠向微信公衆平臺回覆音樂消息和圖文消息,各種消息XML規範也能夠參見官方文檔。
來看看官方提供的一個PHP示例,我作了一些精簡:post
<?php 02 $wechatObj = new wechat(); 03 $wechatObj->responseMsg(); 04 class wechat { 05 public function responseMsg() { 06 07 //---------- 接 收 數 據 ---------- // 08 09 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //獲取POST數據 10 11 //用SimpleXML解析POST過來的XML數據 12 $postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); 13 14 $fromUsername = $postObj->FromUserName; //獲取發送方賬號(OpenID) 15 $toUsername = $postObj->ToUserName; //獲取接收方帳號 16 $keyword = trim($postObj->Content); //獲取消息內容 17 $time = time(); //獲取當前時間戳 18 19 20 //---------- 返 回 數 據 ---------- // 21 22 //返回消息模板 23 $textTpl = "<xml> 24 <ToUserName><![CDATA[%s]]></ToUserName> 25 <FromUserName><![CDATA[%s]]></FromUserName> 26 <CreateTime>%s</CreateTime> 27 <MsgType><![CDATA[%s]]></MsgType> 28 <Content><![CDATA[%s]]></Content> 29 <FuncFlag>0</FuncFlag> 30 </xml>"; 31 32 $msgType = "text"; //消息類型 33 $contentStr = 'http://www.1990c.com'; //返回消息內容 34 35 //格式化消息模板 36 $resultStr = sprintf($textTpl,$fromUsername,$toUsername, 37 $time,$msgType,$contentStr); 38 echo $resultStr; //輸出結果 39 } 40 } 41 ?>
把代碼保存爲index.php並上傳至http://www.1990c.com/weixin/目錄,若是剛纔沒刪除該文件,則直接覆蓋。
如今用戶經過微信公衆平臺發送任何消息公衆帳號均會返回一條內容爲「http://www.1990c.com」的消息。
接下來須要作的就是根據用戶消息動態返回結果~
SimSimi(小黃雞)是目前比較火的聊天機器人,我用CURL開發了一個免費的SimSimi(小黃雞)接口,傳入關鍵詞會返回文本回復,這部分不是本文重點,就很少說明,直接上代碼:this
<?php 02 function SimSimi($keyword) { 03 04 //----------- 獲取COOKIE ----------// 05 $url = "http://www.simsimi.com/"; 06 $ch = curl_init($url); 07 curl_setopt($ch, CURLOPT_HEADER,1); 08 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 09 $content = curl_exec($ch); 10 list($header, $body) = explode("\r\n\r\n", $content); 11 preg_match("/set\-cookie:([^\r\n]*);/iU", $header, $matches); 12 $cookie = $matches[1]; 13 curl_close($ch); 14 15 //----------- 抓 取 回 復 ----------// 16 $url = "http://www.simsimi.com/func/req?lc=ch&msg=$keyword"; 17 $ch = curl_init($url); 18 curl_setopt($ch, CURLOPT_REFERER, "http://www.simsimi.com/talk.htm?lc=ch"); 19 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 20 curl_setopt($ch, CURLOPT_COOKIE, $cookie); 21 $content = json_decode(curl_exec($ch),1); 22 curl_close($ch); 23 24 if($content['result']=='100') { 25 $content['response']; 26 return $content['response']; 27 } else { 28 return '我還不會回答這個問題...'; 29 } 30 } 31 ?>
把上面兩段代碼整合在一塊兒就大功告成了,須要說明一點,微信服務器在5秒內收不到響應會斷掉鏈接,經過此接口有可能會超時,且SimSimi已經屏蔽了BAE和SAE上的抓取請求,推薦使用SimSimi官方收費API,速度比較快~
最後附上微信公衆平臺智能聊天機器人源碼:url