首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》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机器人智能聊天