查看: 837|回复: 0

微擎processor.php使用

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2024-5-26 13:10:12 | 显示全部楼层 |阅读模式
//framework/class/account/account.class.php
官方示例:
  1. class We7_testModuleProcessor extends WeModuleProcessor {
  2.         public function respond() {
  3.                 global $_W;
  4.                 $rid = $this->rule;
  5.                 //这里是一些处理逻辑
  6.                 //这里可以回复多种结构,调取对应方法即可:
  7.                 //        文字(respText)
  8.                 //        图片(respImage)
  9.                 //        语音(respVoice)
  10.                 //        视频(respVideo)
  11.                 //        音乐(respMusic)
  12.                 //        图文(respNews)
  13.                 //        转接多客服(respCustom)
  14.                 return $this->respText('这里的例子是回复文字');
  15.         }
  16. }
复制代码
我们来详细剖析一下:
  1. class BloodTestModuleProcessor extends WeModuleProcessor {
  2.         //void: 所有处理程序必须实现虚函数 respond. 用以响应消息
  3.         public function respond() {
  4.                 if(!$this->inContext) {
  5.                         $reply = '请输入你的血型(A, B, O, AB), 来分析你今年的运程. ';
  6.                         $this->beginContext();
  7.                         // 如果是按照规则触发到本模块, 那么先输出提示问题语句, 并启动上下文来锁定会话, 以保证下次回复依然执行到本模块
  8.                 } else {
  9.                         $btypes = array('a', 'b', 'o', 'ab');
  10.                         $b = strtolower($this->message['content']);
  11.                         // 如果当前会话在上下文中, 那么表示当前回复是用户回答提示问题的答案.
  12.                         if(in_array($b, $btypes)) {
  13.                                 switch($b) {
  14.                                         case 'a':
  15.                                            $reply = 'A型血今年.....';
  16.                                            break;
  17.                                         case 'b':
  18.                                            $reply = 'B型血今年.....';
  19.                                            break;
  20.                                         case 'o':
  21.                                            $reply = 'O型血今年.....';
  22.                                            break;
  23.                                         case 'ab':
  24.                                            $reply = 'AB型血今年.....';
  25.                                            break;
  26.                                 }
  27.                                 $this->endContext();
  28.                                 // 如果当前回答符合答案格式, 那么进行保存并进行下一个问题. (可以保存至 SESSION 中)
  29.                                 // 直到最后一个问题回答完成, 输出测试结果给用户, 并结束对话锁定. 以保证用户其他对话能正常路由.
  30.                                 // 本示例只有一个问题, 因此不保存答案, 直接输出测试结果.
  31.                                 // 如果对话默认的超时不够, 那么可以在每次提出下一个问题的时候重新调用 beginContext 来顺延超时.
  32.                         } else {
  33.                                 $reply = '请输入正确的血型(A, B, O, AB). ';
  34.                                 // 回答不符合答案格式, 那么重新显示当前问题.
  35.                         }
  36.                 }

  37.                 return $this->respText($reply);
  38.         }
  39. }
复制代码
使用$this->inContext来判断是否锁定了一个会话,在调用$this->beginContext()方法前其值为false,当用户使用规则触发了模块,那么我们调用$this->beginContext()来锁定用户与当前模块的会话,可以给$this->beginContext()方法传入一个会话超时秒数,默认是1800秒。

  1. $message => array(
  2.         // 此部分数据结构为**全局共有的结构**, 其他消息类型为此结构的**补充**.
  3.         'from'  => 'fromUser', //string: 发送消息方,   代表一个粉丝用户(使用OpenID表示)
  4.         'to'    => 'toUser', //string: 消息接收方,   对应当前的公众号(使用OpenID表示)
  5.         'time'  => '12345678', //int:    消息发送时间, 使用Unix时间戳表示
  6.         'type'  => 'text', //string: 消息类型,     用于区分不同类型的消息, 请参阅下文
  7.     'content' => '你好!', //string:消息内容
  8.         'msgid' => ''  //int:    消息ID, 公众平台系统用于唯一标识一条请求消息
  9. );
复制代码
我们使用$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());//我们使用这个方法来处理用户与公众号客服的交互,原型函数如下代码:
  1. protected function respCustom(array $message = array()) {
  2.                 $response = array();
  3.                 $response['FromUserName'] = $this->message['to'];
  4.                 $response['ToUserName'] = $this->message['from'];
  5.                 $response['MsgType'] = 'transfer_customer_service';
  6.                 if (!empty($message['TransInfo']['KfAccount'])) {
  7.                         $response['TransInfo']['KfAccount'] = $message['TransInfo']['KfAccount'];
  8.                 }

  9.                 return $response;
  10.         }
复制代码

$this->message包含的信息如下:
  1. =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=;
复制代码



道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部