一、实验目的
1、掌握微信ThinkPHP5.0机器人自动回复;
2、掌握微信ThinkPHP5.0自定义回复内容。
3、掌握ThinkPHP5.0的路由方法。
二、实验内容
1、微信后台ThinkPHP5.0接收用户输入,实现自己的回复内容。
2、微信后台ThinkPHP5.0调用机器人接口,实现机器人自动回复。
三、实验步骤及过程
实验八已经实现了微信后台PHP发送智能机器人的消息以及自定义消息,可以接收文本信息和语音信息,但通常系统是基于某种框架开发的,因此,本次实验将基于ThinkPHP5.0框架下,实现智能机器人回复与用户自定义回复。
微信收发文本消息和语音消息过程可以参考实验八,本次实验注重ThinkPHP5.0框架的介绍。微信收发信息流程如实验八(微信ThinkPHP5.0机器人自动回复及源码下载),在“瑞昌快来订”公众号里面可以有如下测试,图示如下:
1、ThinkPHP主程序入口index.php编辑
在ThinkPHP中,按照缺省的设置,编辑应用程序入口文件,包括定义应用程序入口和加载框架引导文件,注意文件的目录结构。当前index.php文件在public目录下,如下所示。
// [应用入口文件]
//定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
如果要放到其它地方,只需要修改对应的目录结构。应用目录文件在application文件夹下,框架引导文件是/thinkphp/start.php。
2、ThinkPHP控制器Index.php验证与回复消息
1)接收微信服务器发送数据的缺省方法index()
接收微信服务器发送数据的缺省方法为index(),说明如下:
ThinkPHP缺省的控制器入口文件为/application/index/Index.php。该文件名必须是大写字母开头,文件名为Index.php,该文件里面的方法index()属性为public,为缺省的控制器入口文件,即通过http://你的域名/ThinkPHP/public/能够直接访问到Index.php文件的index()方法。
namespace app\index\controller;
use think\Controller;
define("TOKEN", "weixin");//与服务器设置的要一致
//class Index extends Controller
class Index extends Controller
{
public function index()
{
if (!isset($_GET['echostr'])) {
$this->responseMsg();
} else {
$echoStr = $_GET['echostr'];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
}
//名称:valid()
//功能:验证微信服务器发送的消息,并发送给$echoStr
//返回:从微信服务器发送过来的echostr
public function valid()
{
$echoStr = $_GET["echostr"];//从微信服务器得到echostr
if($this->checkSignature()){//验证通过,则返回$echoStr
echo $echoStr;
exit;
}
}
//名称:checkSignature()
//功能:验证微信服务器发送过来的signature与加密数据是否一致
//返回:true:验证通过;false:验证失败
private function checkSignature()
{
$signature = $_GET["signature"];//从微信服务器得到signature
$timestamp = $_GET["timestamp"];//从微信服务器得到timestamp
$nonce = $_GET["nonce"];//从微信服务器得到nonce
$token = TOKEN;//从微信管理员设置的TOKEN
$tmpArr = array($token, $timestamp, $nonce);//建立数组tmpArr
sort($tmpArr);//字典序排序;
$tmpStr = implode($tmpArr); //将数组的内容连接成一个字符串
$tmpStr = sha1($tmpStr);// sha1加密;
if($tmpStr == $signature){ //验证
return true;
}else{
return false;
}
}
2)接收微信服务器发送数据的其它方法index()
index()方法通常作为网页的入口文件,通常可以采用其他的方法来接收微信服务器发送过来的数据,我们只需要增加一个方法即可,例如receiveWeixin(),如下所示。
public function receiveWeixin()
{
if (!isset($_GET['echostr'])) {
$this->responseMsg();
} else {
$echoStr = $_GET['echostr'];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
}
3)接收和向微信服务器发送数据的其它方法
与微信服务器通信的其它方法,如接收和发送数据,可以参考实验八,主要区别在于,机器人的回复消息:
//名称:receiveVoice()
//功能:接收语音消息
//返回:回发消息
private function receiveVoice($object)
{
$mystring = (string)$object->Recognition;
$mystring = ' '.$mystring;
$findme= '薛之谦';
if(($pos = stripos($mystring,$findme))){//播放薛之谦动物世界
//发送语音消息
$content = array();
$content = array("Title"=>"动物世界", "Description"=>"歌手:薛之谦", "MusicUrl"=>"https://你的域名/sinacloud/doud/animalWorld-xuezhiqian.mp3", "HQMusicUrl"=>"https://78976932.pagekite.me/sinacloud/doud/animalWorld-xuezhiqian.mp3");
$result = $this->transmitMusic($object, $content);
} else {
$apiKey="…"; //你的appkey
$INFO = $object->Recognition;$apiURL="http://www.tuling123.com/openapi/api?key=$apiKey&info=$INFO";//appkey地址
$cmd=file_get_contents($apiURL);
$tmp=json_decode($cmd,1);
if(substr($tmp['code'],0,1)!="4")
{
$result= $this->transmitText($object, $tmp['text']);
}else{
$content = "出错了!";
$result = "";
}
}
return $result;
}
3、ThinkPHP其它路由方法
ThinkPHP5.0可以采用其他的路由方法,即可以采用其他的入口文件,例如我们定义了admin.php入口文件,以及其它的模块test和方法index()。
注意的是admin.php入口文件通常需要做些设置功能,例如定义应用目录、加载框架文件、绑定模块、加载日志文件、关闭缺省路由、执行应用等,内容如下:
// [应用入口文件]
//定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//加载框架引导文件
require __DIR__ . '/../thinkphp/base.php';
//绑定当前入口文件到test模块
\think\Route::bind('test');
require 'phplog.php';//日志文件
//关闭admin模块的路由
\think\App::route(false);
//执行应用
\think\App::run()->send();
具体的ThinkPHP5.0源代码见“豆豆咨询”公众号输入彩蛋号1206,即可获得。
四、技术服务
1、如果有疑问或者需要帮助,请加入QQ群(群名称:豆豆咨询,群号:625686304);或者公众号douAsk,公众号名称为“豆豆咨询”。扫描以下二维码,关注“豆豆咨询”。
技术QQ群名称:豆豆咨询,群号:625686304
微信公众号名称:豆豆咨询,微信公众号:douAsk
彩蛋号:1206。