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']);
}
}
~~~