记录公众号对接API过程
查看文档,关于签名的代码:
代码抄好了,上传脚本,发请求看效果:
得到返回有异常,查看错误码含义:https://ai.qq.com/doc/returncode.shtml 显示参数非法:
检查请求数据,查看文档,关于请求参数部分的描述:
对比请求参数:
sign为空,这个参数会在后面根据鉴权规则计算后赋值。
应该是session没赋值导致。填上再试:
请求结果:
继续分析原因:16389 缺失API权限 请检查应用是否勾选当前API所属接口的权限
显示已经接入。继续分析原因
分析可能是请求的时间有问题,参照式例文档中方法实时获取秒级时间再试
请求结果:
处理成功。
至此处,调用API获得回复信息成功。
继续整合公众号,实现从公众号中发送请求,通过服务器转发到API,得到回复后,返回消息给微信用户。
根据官方demo中的初步整合:
结果发现行不通,打出来的请求参数都是一样的:从前端发出来的消息:
请求的参数 3514a26b23b27211e99e0518b1add51f2aa16730,1596707262,499998321,o-v1Zs56dcH9woG6o0Ne3CrV8HZk
请求的参数 b59910976912aed87201d6500e0c02710d7456a0,789,456,sJkR5lA8zjVhbe3ROpuE2g29SKjzSWbY8CCPfleGYYs
请求的参数 d192485d68afbf123fb78112e7c551d0d07cac16,1596707466,1070380582,o-v1Zs56dcH9woG6o0Ne3CrV8HZk
请求的参数 b59910976912aed87201d6500e0c02710d7456a0,789,456,sJkR5lA8zjVhbe3ROpuE2g29SKjzSWbY8CCPfleGYYs
请求的参数 494bb4870265748793ca26df3da5ba0f9ae03ea5,1596707778,767276111,o-v1Zs56dcH9woG6o0Ne3CrV8HZk
原本以为除了配置的时候会发signature,想用signature来判断是鉴定权消息还是用户发的消息,结果行不通
网上找到了别人的示例代码参考。
<?php
define("TOKEN", "weixin");//自己定义的token 就是个通信的私钥
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
//$wechatObj->responseMsg();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if(checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0<FuncFlag></xml>"
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = '你好啊!';
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo '咋不说哈呢';
}
}else {
echo '咋不说哈呢';
exit;
}
}
}
?>
将其放置于服务器,发现发了消息能返回'你好啊!'
说明基本的消息调用也通了。
接着将回复的文本内容替换成API返回的消息即可以。
最后整合后的代码:chatbot.php
<?php
include_once "checkSignature.php";
include_once "AI.php";
define("TOKEN", "wxdc13e0862c0eafbf");//自己定义的token 就是个通信的私钥
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid(); //在第一次接口鉴权的时候使用
$wechatObj->responseMsg(); //鉴定权通过后,使用该方法
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if(checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
file_put_contents("./chatBot.log","signature " . $_GET['signature'] . "\n",FILE_APPEND);
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
file_put_contents("./chatBot.log","收到请求 \n" . $postStr . "\n",FILE_APPEND);
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$msgType = $postObj->MsgType;
$content = trim($postObj->Content);
$time = time();
$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0<FuncFlag></xml>";
if(!empty($content))
{
$this->msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
// 设置请求数据(应用密钥、接口请求参数)
$appkey = 'aMRn56I4DFs8McnP'; //APPKEY,每个APP不同,在控制台基本信息中查看
$params = array(
'app_id' => '2155378192', //应用标识(AppId)
'time_stamp' => $time, //请求时间戳(秒级)
'nonce_str' => '20e3408a79', //随机字符串
'sign' => '', //签名信息,https://ai.qq.com/doc/auth.shtml
'session' => '0000000001', //会话标识(应用内唯一)
'question' => $content, //用户输入的内容
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat';
$response = doHttpPost($url, $params);
$responseJson = json_decode($response, true); //返回值是json。取出需要的那部分内容
$contentStr = $responseJson['data']['answer'];
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo '咋不说话呢';
}
}else {
echo '咋不说话呢';
exit;
}
}
}
?>