微擎processor.php使用
//framework/class/account/account.class.php官方示例:
class We7_testModuleProcessor extends WeModuleProcessor {
public function respond() {
global $_W;
$rid = $this->rule;
//这里是一些处理逻辑
//这里可以回复多种结构,调取对应方法即可:
// 文字(respText)
// 图片(respImage)
// 语音(respVoice)
// 视频(respVideo)
// 音乐(respMusic)
// 图文(respNews)
// 转接多客服(respCustom)
return $this->respText('这里的例子是回复文字');
}
}我们来详细剖析一下:
class BloodTestModuleProcessor extends WeModuleProcessor {
//void: 所有处理程序必须实现虚函数 respond. 用以响应消息
public function respond() {
if(!$this->inContext) {
$reply = '请输入你的血型(A, B, O, AB), 来分析你今年的运程. ';
$this->beginContext();
// 如果是按照规则触发到本模块, 那么先输出提示问题语句, 并启动上下文来锁定会话, 以保证下次回复依然执行到本模块
} else {
$btypes = array('a', 'b', 'o', 'ab');
$b = strtolower($this->message['content']);
// 如果当前会话在上下文中, 那么表示当前回复是用户回答提示问题的答案.
if(in_array($b, $btypes)) {
switch($b) {
case 'a':
$reply = 'A型血今年.....';
break;
case 'b':
$reply = 'B型血今年.....';
break;
case 'o':
$reply = 'O型血今年.....';
break;
case 'ab':
$reply = 'AB型血今年.....';
break;
}
$this->endContext();
// 如果当前回答符合答案格式, 那么进行保存并进行下一个问题. (可以保存至 SESSION 中)
// 直到最后一个问题回答完成, 输出测试结果给用户, 并结束对话锁定. 以保证用户其他对话能正常路由.
// 本示例只有一个问题, 因此不保存答案, 直接输出测试结果.
// 如果对话默认的超时不够, 那么可以在每次提出下一个问题的时候重新调用 beginContext 来顺延超时.
} else {
$reply = '请输入正确的血型(A, B, O, AB). ';
// 回答不符合答案格式, 那么重新显示当前问题.
}
}
return $this->respText($reply);
}
}使用$this->inContext来判断是否锁定了一个会话,在调用$this->beginContext()方法前其值为false,当用户使用规则触发了模块,那么我们调用$this->beginContext()来锁定用户与当前模块的会话,可以给$this->beginContext()方法传入一个会话超时秒数,默认是1800秒。
$message => array(
// 此部分数据结构为**全局共有的结构**, 其他消息类型为此结构的**补充**.
'from'=> 'fromUser', //string: 发送消息方, 代表一个粉丝用户(使用OpenID表示)
'to' => 'toUser', //string: 消息接收方, 对应当前的公众号(使用OpenID表示)
'time'=> '12345678', //int: 消息发送时间, 使用Unix时间戳表示
'type'=> 'text', //string: 消息类型, 用于区分不同类型的消息, 请参阅下文
'content' => '你好!', //string:消息内容
'msgid' => ''//int: 消息ID, 公众平台系统用于唯一标识一条请求消息
);我们使用$this->message['content']来接收用户的消息,然后进行分析,并使用return $this->respText($reply)来给用户返回会话内容,当然我们需要定义回复会话内容变量$reply。
可以处理的回复类型包括:
$this->respText($text);//接收一个文本类型参数,$text是空的则返回错误;
$this->respVoice($mid);//接收一个媒体id参数,$mid是空的则返回错误;
$this->respImage($mid);//接收一个媒体id参数,$mid是空的则返回错误;
$this->respVideo(array $video);//接收一个视频数组参数,$video是空的则返回错误,$video = array('MediaId'=>'视频媒体id', 'Title'=>'视频标题', 'Description'=>'视频描述');
$this->respMusic(array $music);//接收一个音频数组参数,$music是空的返回错误,$music = array('title'=>'音乐标题', 'description'=>'音乐描述', 'musicurl'=>'音乐文件链接');
$this->respNews(array $news);//接收一个新闻列表数组参数,count($news)>10或者$news是空的返回错误,$news = array(array('title'=>'新闻标题', 'description'=>'新闻描述', 'picurl'=>'新闻图片', 'url'=>'新闻链接'));
$this->respCustom(array $message = array());//我们使用这个方法来处理用户与公众号客服的交互,原型函数如下代码:protected function respCustom(array $message = array()) {
$response = array();
$response['FromUserName'] = $this->message['to'];
$response['ToUserName'] = $this->message['from'];
$response['MsgType'] = 'transfer_customer_service';
if (!empty($message['TransInfo']['KfAccount'])) {
$response['TransInfo']['KfAccount'] = $message['TransInfo']['KfAccount'];
}
return $response;
}
$this->message包含的信息如下:=8072d89aa878363b24377d9fef3d665b0447c7f6×tamp=1589520790&nonce=2091485634&openid=oNgkJ5xodEvXT0W1dKp-zYa1dXN4&encrypt_type=aes&msg_signature=f90f1a536df13c85790fb45f8ee1a860fd3f24b4 tousername=gh_c52cc4432454; fromusername=oNgkJ5xodEvXT0W1dKp-zYa1dXN4; createtime=1589520790; msgtype=text; content=小白兔; msgid=22756463730346259; from=oNgkJ5xodEvXT0W1dKp-zYa1dXN4; to=gh_c52cc4432454; time=1589520790; type=text; event=; redirection=; source=;
页:
[1]