记录公众号对接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;
        }
    }
}
?>

posted @ 2022-09-14 17:39  三点一圆  阅读(510)  评论(0编辑  收藏  举报