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