微信公众平台开发初探(一)WeiPHP与它调用插件的过程

0 WeiPHP介绍

笔者使用的WeiPHP版本是艾逗乐园维护的WeiPHP3.0,coding.net上fork地址如下——
https://coding.net/u/Emptyset/p/weiphp3.0/git

WeiPHP是基于OneThink开发的,而OneThink是基于ThinkPHP的,所以它的架构和OneThink是相同的。笔者在接触WeiPHP前使用过ThinkPHP,但是不熟悉OneThink,因此此文prerequisite假定读者也是不了解OneThink的。

微信公众平台的应用场景其实是很少的,一些基本的功能基本是:客户端发送一个消息,例如:“上海天气”,然后程序对用户发送的消息进行处理,如果刚好触碰到“天气”这个关键词,就可以触发一些消息处理,比如调用一些天气预报API,把天气数据用消息方式返回给客户端。(这个消息可以是文本消息,也可以是图文消息,绝大部分应用场景都是如此实现的)。另外一些情况下,我们可以通过点击微信公众平台的自定义菜单来实现触发事件的功能,打开一些外部的网页等等。

综上,微信公众平台的应用场景其实很大程度上受限于微信的,而我们在WeiPHP上开发微信公众平台,其实是做一些实用,轻便,好玩的小功能——而WeiPHP二次开发的思路也是如此——通过开发插件的方式来开发微信公众平台。

1 WeiPHP的架构介绍

熟悉TP的MVC架构的人会对WeiPHP的架构感觉到一些疑惑(主要是Controller与Model各自承担的功能),这件事情让我纠结了许久,并且至今耿耿于怀。当然,作为开发攻略,我觉得介绍一下它的目录结构是非常有必要的,以下摘自WeiPHP官方Vote插件的目录介绍。

├─Addons 插件库(包括微信插件和原oneThink插件在里面)
└──Vote 投票插件标识
       ├─Controller 插件控制器目录
           └──VoteController.class.php 投票处理主程序 投票列表,增,删,改和手机端投票的功能都在这个文件里实现
       ├─Model 插件模型目录
           ├──VoteModel.class.php 投票选项模型
           ├──VoteOptionModel.class.php 投票选项模型
           └──WeixinAddonModel.class.php 投票与微信交互的模型文件
       ├─View 插件视图文件目录
           └──default 视图默认风格
                  └──Vote 对应着上面VoteController.class.php方法里的模板
                        ├──add.html 增加投票模板
                        ├──edit.html 编辑投票模板
                        ├──lists.html 投票管理列表模板
                        └──show.html 手机端投票模板
       ├─config.php 插件配置文件
       └─VoteAddon.class.php  插件文件

从这里可以看出来插件Vote目录中有一层MVC,插件根目录下的config.php是插件的配置文件,VoteAddon.class.php这个文件是插件Vote的主体文件,它继承自Common\Controller\Addon\Addon.class.php所以它需要实现install和uninstall两个方法。
View层里有几个视图,这里页面其实有几种,一个是微信管理员在后台的页面,一个是用户在微信端用微信浏览器打开看到的用户界面,都放在view里。
Controller层与我们原先理解的Controller也是差不多的,对于投票插件,它需要实现一些控制层逻辑。但是有一点要强调,这个Controller层并不负责处理微信端口的消息处理与消息返回,这是笔者起初最最困惑的一点。它的命名空间是Home\Controller\AddonsController,继承自AddonsController类,并不是Think\Controller,所以它和TP里熟悉的继承自Controller类的控制层作用并不相同,感兴趣的可以去翻看AddonsController深入了解。
Model层里大家会注意到有一个叫WeixinAddonModel.class.php,任何一个插件都有这样一个类,它是真正负责处理用户消息(接收与返回)的。它继承自Home\Model的WeixinModel类。而另外两个Model文件则是传统意义上的数据表的对象实例化,继承自Think的Model类,熟悉TP的就都懂了。

2 图灵机器人聊天插件

这个插件原本是WeiPHP2.0中的,原插件采用的是图灵机器人提供的API,艾逗乐园版本采用了curl模拟请求的方式,但是由于图灵官方的API做了一些更改导致二者都无法正常使用了。本小节通过分析修改WeiPHP2.0的图灵机器人插件的bug,并且将它作为我们学习插件开发的第一个例子。
要使用图灵机器人,首先我们需要去他们的官网注册一个账号并获取一个API Key 官网地址http://www.tuling123.com/
API文档地址:http://www.tuling123.com/html/doc/api.html
我们分析一下这个插件的实现方式——

  • 用户从微信客户端发送一条消息,
  • WeiPHP通过关键词遍历插件,搜索这条消息是否触发某个插件
  • 如果没有触发,那么它会把这个消息分发给自动回复插件处理
  • 如果自动回复插件里没有这条信息的关键词记录,最后的最后,这条消息就会被分发给Chat插件(这里消息处理的顺序可以查看Home\Controller\WeixinController.class.php,注意到248-250行)
require_once ONETHINK_ADDON_PATH . $addons [$key] . '/Model/WeixinAddonModel.class.php';
$model = D ( 'Addons://' . $addons [$key] . '/WeixinAddon' );
$model->reply ( $data, $keywordArr );

所以其实它就是执行了插件Model目录下WeixinAddonModel.class.php的reply方法。
我们首先在管理员管理插件的页面点击“快速创建”(如图)
微信公众平台开发初探(一)WeiPHP与它调用插件的过程_第1张图片
然后我们会发现WeiPHP帮我们在Addons\Chat目录下搭建好一个插件的基本结构了。我们这时候主要观察WeixinAddonModel.class.php代码中的reply()方法(并且只关注图灵机器人API的调用,其他几个只能聊天机器人因为已经开始收费了,所以暂时放弃使用)。
可以注意到传入reply方法有两个数组,一个是 dataArr dataArr[‘Content’]就是用户向微信客户端发送的消息内容;另一个是$keywordArr,这个参数在下一篇文章介绍“猜数字”游戏的时候会介绍。其他地方代码有注释的,我就不强调了。

    function reply($dataArr, $keywordArr = array()) {
        $this->config = getAddonConfig ( 'Chat' ); // 获取后台插件的配置参数      
        $content = $this -> turingAPI($dataArr['Content']);
        if ($content) {
            exit ();
        }

        // TODO 此处可继续增加其它API接口

        // 最后只能随机回复了
        if (empty ( $content )) {
            $content = $this -> _rand ();
        }

        // 增加积分,每隔5分钟才加一次,5分钟内只记一次积分
        add_credit ( 'chat', 300 );

        $res = $this -> replyText($content);
        return $res;
    }

turingApi方法的作用是向图灵Api发送get请求,获取返回的聊天内容 内容,代码结构很简单,对返回各种状态码进行不同的处理,在这里就不贴完整代码了,其中关键是file_get_contents用于get请求。源代码中对错误码的判断有一点小错误,只需要把其中的
if ($result ['code']>40000)改成if ($result ['code']>40000 && $result['code']<40008)就可以了。
【聊天机器人插件源码请从这里下载http://pan.baidu.com/s/1kTgwzkF
解压后把Chat放到Addons目录下即可】

你可能感兴趣的:(微信平台开发)