讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 24.1.2 自動聊天開發實現 >

24.1.2 自動聊天開發實現

微信公眾號在收到文本消息之後,即調用小i機器人自動回復,需要將用戶ID及用戶的內容都傳給小i機器人。其相關代碼如下。


1 private function receiveText($object)
2 {
3     $keyword = trim($object->Content);
4     include("xiaoi.php");
5     $content = getXiaoiInfo($object->FromUserName, $keyword);
6     $result = $this->transmitText($object, $content);
7     return $result;
8 }
  

小i機器人的邏輯實現比較複雜,其智能問答的實現代碼如下。


 1 function getXiaoiInfo($openid, $content)
 2 {
 3     // 定義APP
 4     $app_key="************";
 5     $app_secret="********************";
 6 
 7     // 簽名算法
 8     $realm = "xiaoi.com";
 9     $method = "POST";
10     $uri = "/robot/ask.do";
11     $nonce = "";
12     $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
13     for ($i = 0; $i < 40; $i++) {
14         $nonce .= $chars[ mt_rand(0, strlen($chars) - 1) ];
15     }
16     $HA1 = sha1($app_key.":".$realm.":".$app_secret);
17     $HA2 = sha1($method.":".$uri);
18     $sign = sha1($HA1.":".$nonce.":".$HA2);
19 
20     // 接口調用
21     $url = "http:// nlp.xiaoi.com/robot/ask.do";
22     $ch = curl_init;
23     curl_setopt($ch, CURLOPT_URL, $url);
24     curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Auth:    app_key="'.$app_key.'", 
       nonce="'.$nonce.'", signature="'.$sign.'"'));
25     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
26     curl_setopt($ch, CURLOPT_POST, 1);
27     curl_setopt($ch, CURLOPT_POSTFIELDS, "question=".urlencode($content)."&userId=".
       $openid."&platform=custom&type=0");
28     $output = curl_exec($ch);
29     if ($output === FALSE){
30         return "cURL Error: ". curl_error($ch);
31     }
32     return trim($output);
  

上述代碼解讀如下。

第3~5行:定義API接口,即申請到的接口。

第7~18行:這一段為簽名算法的實現。小i機器人API需要通過簽名來訪問,簽名的過程是將APP的Key和Secret以及隨機數等參數根據一定簽名算法生成的簽名值,作為新的請求頭中的一部分,以此提高訪問過程中的防篡改性。

簽名算法如下。

1)sha1加密(app_key:realm:app_secret),其中realm為"xiaoi.com"。

2)sha1加密(method:uri),其中method為請求方法,如"POST",uri為"/robot/ask.do"。

3)sha1加密(HA1:nonce:HA2),其中HA1為步驟1的值,HA2為步驟2的值,nonce為40位隨機數。

第20~31行:使用curl獲取調用智能問答的結果。

小i機器人API的有效訪問都必須包含簽名請求頭,在第24行中定義了一個簽名請求頭字符串。其中,app_key為API接口的key,nonce為上面過程中生成的40位隨機數,signature為簽名算法步驟3的值。最後為該字符串添加請求頭:"X-Auth"。

第27行中將請求參數連接成字符串,通過POST提交給接口。

第32行:返回接口的內容。

小i機器人的運行效果如圖24-2所示。

圖24-2 小i機器人智能聊天