微信公众号在收到文本消息之后,即调用小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机器人智能聊天