## 交互响应控制器
如果在创建插件的时候勾选了*是否需要响应规则*,则插件创建成功后会自动生成一个RespondController,在RespondController.class.php中会有一个自动生成的wechat方法用于接收微信端消息并进行响应。
例如*聊天机器人*插件,在创建的时候勾选了*是否需要响应规则*,然后在后台响应规则处设置了一个触发关键词*聊天*,那么当用户在微信端发送消息“聊天”的时候,用户的此条微信消息会被分发到聊天机器人插件的RespondController.class.php中的wechat方法进行响应。我们可以这样来进行响应:
~~~
<?php
namespace Addons\IdouChat\Controller;
use Mp\Controller\ApiController;
/**
* 聊天机器人响应控制器
* @author 艾逗笔
*/
class RespondController extends ApiController {
/**
* 微信交互
* @param $message array 微信消息数组
* @author 艾逗笔<765532665@qq.com>
*/
public function wechat($message = array()) {
$settings = get_addon_settings('IdouChat');
$settings['enter_tip'] || $settings['enter_tip'] = '你想聊点什么呢';
$settings['keep_time'] || $settings['keep_time'] = 300;
$settings['exit_keyword'] || $settings['exit_keyword'] = '退出';
$settings['exit_tip'] || $settings['exit_tip'] = '下次无聊的时候可以再找我聊天哦';
if (!$settings['api_url'] || !$settings['api_key']) {
reply_text('机器人聊天接口未填写,暂时不能使用此功能');
exit();
}
if ($this->message['MsgType'] == 'voice') {
if ($settings['can_voice'] == '1') {
$content = $this->message['Recognition']; // 语音识别,直接开启机器人聊天模式
$reply = $this->turingAPI($content);
if (is_array($reply)) {
return reply_news($reply);
} else {
return reply_text($reply);
}
}
} else {
$content = $this->message['Content']; // 通过消息上下文机制与机器人展开聊天
if (!$this->in_context) {
$reply = $settings['enter_tip'];
$this->begin_context($settings['keep_time']); // 开启上下文模式
} else {
if ($content == $settings['exit_keyword']) {
$reply = $settings['exit_tip'];
$this->end_context();
} else {
$reply = $this->turingAPI($content);
$this->keep_context($settings['keep_time']); // 保持消息上下文
}
}
if (is_array($reply)) {
return reply_news($reply);
} else {
return reply_text($reply);
}
}
}
// 图灵机器人
private function turingAPI($keyword) {
$settings = get_addon_settings('IdouChat');
$settings['api_url'] || $settings['api_url'] = '';
$settings['api_key'] || $settings['api_key'] = '';
$api_url = $settings['api_url'] . "?key=" . $settings['api_key'] . "&info=" . $keyword;
$result = file_get_contents ( $api_url );
$result = json_decode ( $result, true );
if ($_GET ['format'] == 'test') {
dump ( '图灵机器人结果:' );
dump ( $result );
}
if ($result ['code'] > 40000 && $result['code'] < 40008) {
if ($result ['code'] < 40008 && ! empty ( $result ['text'] )) {
return '图灵机器人请你注意:' . $result ['text'];
} else {
return false;
}
}
switch ($result ['code']) {
case '100000' :
return $result['text'];
break;
case '200000' :
$text = $result ['text'] . ',<a href="' . $result ['url'] . '">点击进入</a>';
return $text;
break;
case '301000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => $info ['author'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '302000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['article'],
'Description' => $info ['source'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '304000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => $info ['count'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '305000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['start'] . '--' . $info ['terminal'],
'Description' => $info ['starttime'] . '--' . $info ['endtime'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '306000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['flight'] . '--' . $info ['route'],
'Description' => $info ['starttime'] . '--' . $info ['endtime'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '307000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => $info ['info'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '308000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => $info ['info'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '309000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => '价格 : ' . $info ['price'] . ' 满意度 : ' . $info ['satisfaction'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '310000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['number'],
'Description' => $info ['info'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '311000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => '价格 : ' . $info ['price'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
case '312000' :
foreach ( $result ['list'] as $info ) {
$articles [] = array (
'Title' => $info ['name'],
'Description' => '价格 : ' . $info ['price'],
'PicUrl' => $info ['icon'],
'Url' => $info ['detailurl']
);
}
return $articles;
break;
default :
if (empty ( $result ['text'] )) {
return false;
} else {
return $result ['text'];
}
}
return true;
}
}
~~~
其中,$this->message或者$message数组里面包含了分发到wechat方法的用户消息,包含ToUserName、FromUserName、Content等信息。通过get_addon_settings可以获取插件的配置参数,通过$this->begin_context可以设置消息上下文、通过reply_text可以回复文本消息等。
总而言之。RespondController是用于接收用户通过微信发送来的消息并进行响应的控制器,如果插件的功能需要在微信对话框通过消息的收发来进行交互的话,那么在创建插件的时候就需要选择响应规则,并在微信响应控制器中设计对应的业务逻辑来对用户消息进行响应。
- 更新日志
- 入门
- 关于豆信
- 系统安装
- 功能介绍
- 公众号对接
- 小程序对接
- 系统架构
- 数据字典
- 框架目录结构
- 插件目录结构
- 运行流程
- 插件开发
- 新建插件
- info.php
- 设计数据表
- 插件控制器
- 后台管理控制器
- 移动端控制器
- 交互响应控制器
- 接口管理控制器
- 插件模型
- 插件视图
- 发布插件
- 自定义模型
- 通用增删改查
- common_lists
- common_add
- common_edit
- common_delete
- setMetaTitle
- setSubmitType
- setModel
- setListMap
- setListSearch
- setListOrder
- setListPer
- setEditMap
- setDeleteMap
- setFindMap
- addCrumb
- addNav
- addButton
- setTip
- 函数手册
- get_addon
- get_addon_settings
- tomedia
- get_fans_info
- 小程序开发专题
- 小程序对接插件.js
- 获取插件配置
- 获取用户信息
- 更新用户资料
- 公众号开发专题
- 获取粉丝信息
- 自定义分享
- 消息上下文
- 微信支付
- 企业付款
- 发送现金红包
- 发送模板消息
- 发送客服消息
- 引入前端资源
- 限制页面仅在微信浏览器访问
- 在插件页面中引入样式文件
- 在插件中创建跳转链接
- 数据预处理
- 插件开发实例
- 聊天机器人
- 留言板
- 常见问题解答