weiphp在线开发手册

作为开发者,最关心莫过于在WeiPHP框架里是如何调用在众多的插件中选择并调用(统称定位,下同)其中的一个插件的。首先我们来梳理下微信的用户情景:

场景一

假设管理员提前创建了一个投票,并设置这个投票的关键词是“大会投票”。
当用户在微信里输入“大会投票”时,微信就返回上面的投票的图文信息。用户点击这图文信息就可以进入投票的页面

总结:这个一种关键词完全匹配的场景,一个关键词对应一条具体的信息。

场景二

假如有一个天气的插件
用户输入“北京天气”
微信回复当天北京具体的天气信息
用户输入“深圳天气”
微信回复当天深圳具体的天气信息

或者

有一个上墙的功能,要求输入 “##+聊天内容”就可以在大屏幕上显示
用户输入“##我觉得WeiPHP入门比较简单”
大屏幕上就显示用户名和这句话“我觉得WeiPHP入门比较简单”

总结:这是一种关键词模糊匹配的场景,关键词包含在其中(当然关键词也可能在中间或者最后),除去关键词的内容作为具体的业务数据。先是关键词负责定位到插件,然后插件再利用业务数据处理并返回相应的内容

场景三

假设有一个活动需要报名,报名入口的关键词设置为“报名”
用户输入“报名”
微信回复“欢迎您报名XX活动,请回复姓名+手机号码完成报名,如: 李某某 18688969945”
用户输入:“韦小宝 15011253000”
微信回复:"报名成功”

或者

假设有一个机器人学习的插件
用户输入:“机器人学习时间”
微信回复:“你的问题是?”
用户输入:“这个世界上谁最美?”
微信回复: “你的答案是?”
用户回复: “当然是你啦!”
微信回复:“我明白啊,不信你可以问问我”
用户回复:“这个世界上谁最美?”
微信回复:“当然是你啦!”

总结:这是一种关键词加引导输入的场景,用户两次输入的内容是有关联关系的。

场景四

用户关注公众号
用户取消关注公众号
用户扫描带参数二维码
用户上报地理位置
用户点击自定义菜单

总结:这是微信固定的用户事件,提前可以预知

架构分析和开发实例

通过上面四种场景总结分析,WeiPHP关于每个场景的实现方案如下

场景一
这是关键词完全匹配的场景,在WeiPHP里,完全匹配的关键词(也叫精准关键词,下同)有两种,一种是由所有安装过的插件标识名(英文名)和插件名(中文名)组成的插件关键词组,另一种是由数据库里的关键词表(wp_keyword 且 type=0)里的关键词组成业务关键词组。而在定位过程中先定位前者,前者不匹配再取后者。值得注意的是,关键词表里的type是关键词类型,值默认为0,表示是精准关键词;值为1是表示模糊关键词

精准关键词的匹配算法:


场景二
这是关键词模糊匹配的场景,在WeiPHP中,模糊关键词保存在关键词表里(wp_keyword 且 type=1)。它有两种类型,一种是token=0的插件初始化模糊关键词,所有的公众号都可以使用,如上面的天气插件,就可以设置“天气”的关键词,并把token值设置为0即可;另一种是公众号在运营过程中产生的模糊关键词,具体的使用就由开发者自己发挥了

模糊关键词的匹配算法:



场景三
这是一种关键词加引导输入的场景,在WeiPHP中,第一次输入关键词词(可以是精准关键词也可以是模糊关键词)定位到插件后,在插件的具体处理中可以设置一个用户状态,也就是把当前的插件名,具体业务参数缓存过来,当用户再次回复信息时,优先判断这个用户状态是否存在,如存在就直接读取缓存里的插件信息,并再次进入该插件继续之前的业务处理,值得注意的是,用户状态只能用一次,用完就失效,要连接多次使用是(如上面 的机器人学习插件),就需要在每次回复前都设置一次用户状态。

在WeiPHP核心里的引导代码:


其中用户状态变量是 user_status_uid 这个uid就是当前用户的ID,第个用户都不一样
用户状态是使用S函数进行缓存的,因此开发者在插件里设置状态也需要使用S函数进行设置
用户状态缓存的数据结构是:

  array (
    'addon' => '插件标识名',
    'keywordArr' => array ('插件需要的各种参数集合组成的数组,如不需要为空即可')
  );


场景四
这个比较简单,就是用户在执行这个操作时,WeiPHP会循环全部安装的插件,如果插件里的WeixinAddonModel.class.php文件实现了该事件的方法,就直接调用实现。
微信的事件对应的方法有:

   * subscribe : 关注公众号
   * unsubscribe : 取消关注公众号
   * scan : 扫描带参数二维码事件
   * location : 上报地理位置事件
   * click : 自定义菜单事件

开发者只要在插件的WeixinAddonModel.class.php里实现上面的方法,当用户触发相关事件时,就能启用所有插件里关于这个事件的处理方法。

如在微信用户中心插件里实现的用户关注时自动初始化一个用户信息:



©2014 WeiPHP文档中心 weiphp.cn