Handle* 类最好继承AbstractHandle
Handle*类 必须实现Handle方法
在Handle* 类中要实现的业务有:
保存微信消息
获取用户所在场景
匹配关键词
生成XML回复消息
exit退出
什么是用户所在场景?
比如文章列表 有上一页下一页,不能一次输出全部内容
比如公众号有多种功能,机器人聊天和自已的关键词,通过场景判断当前用户消息是要触发自已的关键词还是和机器人在聊天?
用户场景参数可以保存在redis,mysql,file等当中,保存场景业务需要自已实现。
为什么要exit限出?
框架执行完控制器类的业务一般会执行一些其他业务,比如ThinkPHP会输出debug消息,导致微信服务器不能接收到正常的XML消息,导致公众号暂不可提供服务。
下面列出HandleText类,其他类不再做文档说明,基本就是实现功能业务,实现Handle方法
~~~
<?php
namespace app\exwechat\controller;
use youwen\exwechat\exLog;
/**
* 微信事件消息-控制器
*
*/
class HandleText extends AbstractHandle
{
private $msg;
public function handle($arrayMsg='')
{
$this->msg = empty($arrayMsg) ? $this->exRequest->getMsg() : $arrayMsg;
//获取用户聊天场景
$scene = $this->getScene();
if(false !== $scene){
// to do
}
// 优先关键词
$ret1 = $this->_priorityKeyword($this->msg['Content']);
if(!$ret1){
// 数据库关键词
$ret2 = $this->_dbKeyword($this->msg['Content']);
if(!$ret2){
// 默认消息
$this->_defaultReply();
}
}
exit; //阻止DEBUG信息输出
}
private function _priorityKeyword($keyWord='')
{
switch ($keyWord) {
//部分自定义优先关键字
case 'subscribe':$this->response('subscribe');
break;
case 'openid':$this->response($this->msg['FromUserName']);
break;
default:
return false;
}
return true;
}
private function _dbKeyword($keyWord='')
{
return false;
}
private function _defaultReply()
{
$this->response($this->msg['Content']);
}
}
~~~