上一篇教程中我们提供了wechat的php的库,
这里我们简要介绍一个这个库的源码和使用.

这个库的主文件为`Wechat.php`,
其余的几个文件都是为这个文件服务的,
提供加解密,消息拼接等功能.

`Wechat.php`中的一个主要类为`Wechat`,
这个类提供了接收到各种微信消息的回调函数,
例如用户关注本公众号的时候会调用到`Wechat`类的`onSubscribe`函数,
我们就可以继承`Wechat`类,然后复写`onSubscribe`函数,实现自己的回复了.

我们在使用`Wechat`这个类的时候,需要继承`Wechat`实现自己的子类,
以便使用这个类提供的各种消息回调函数.
然后创建这个子类的实例,用于对request请求的处理.

例如:

<font size="4">// 继承Wechat
class TestWechat extends Wechat {
}
// step 1: 创建TestWechat类的实例
$wechat = new TestWechat(array(
'token' => 'weixin',
'aeskey' => 'xxx',
'appid' => 'wx5d1fb434a1652ae8',
'debug' => true
));
// setp 2: 检测消息
$wechat->run();</font>

在创建`TestWechat`实例过程中会调用父类`Wechat`的构造函数,
这里完成了token的验证,以及请求数据的解析和暂存.
下面是对Wechat构造函数的说明.

<font size="4">public function __construct($config=array('token'=>'', 'aeskey'=>'', 'appid'=>'', 'debug' => FALSE)) {
// 获取创建实例时传进来的阐述
$token = $config['token'];
$aeskey = $config['aeskey'];
$appid = $config['appid'];
$debug = $config['debug']; // 调用token验证函数,如果失败直接退出
// 无论是验证token还是用户发送消息都会检测token,已提高程序的安全性
if (!$this->validateSignature($token)) {
exit('签名验证失败');
} // 检测是否是单纯的token验证请求
// 如果是 返回echostr并退出
if ($this->isValidateIncomingConn()) {
// 网址接入验证
exit($_GET['echostr']);
} // 如果是用户发送的信息请求,需要验证'HTTP_RAW_POST_DATA'数据
if (!isset($GLOBALS['HTTP_RAW_POST_DATA'])) {
exit('缺少数据');
} $this->debug = $debug;
set_error_handler(array(&$this, 'errorHandler'));
// 设置错误处理函数,将错误通过文本消息回复显示 // 检测消息是否加密
if (isset($_GET['encrypt_type'])) {
$this->encrypted = $_GET['encrypt_type'] == 'aes';
} // 如果消息加密了,调用函数对消息进行解密
if ($this->encrypted) {
$this->msgCryptor = new wxBizMsgCrypt($token, $aeskey, $appid);
} // 将请求消息储存起来备用
$this->savePostData();
}</font>

之后会调用run()函数,
run函数会检测微信服务器发送过来的消息类型,
然后根据不同的类型,调用Wechat中的对应函数进行处理.
因为我们使用的`TestWechat`集成了`Wechat`,
我们只需要在`TestWechat`中复写一下用到的函数,
就会在接收到相应的消息时调用到我们复写的函数.
这也是我们再上一个帖子中复写`onText`函数的原因.

<font size="4">public function run() {
switch ($this->getRequest('msgtype')) {
// 如果消息类型为 event
case 'event':
switch ($this->getRequest('event')) {
// 订阅消息
case 'subscribe':
$this->onSubscribe();
break;
// 退订消息
case 'unsubscribe':
$this->onUnsubscribe();
break;
//
case 'SCAN':
$this->onScan();
break; case 'LOCATION':
$this->onEventLocation();
break; case 'CLICK':
$this->onClick();
break; } break;
// 文本消息
case 'text':
$this->onText();
break;
// 图片消息
case 'image':
$this->onImage();
break;
// 位置消息
case 'location':
$this->onLocation();
break;
// 链接消息
case 'link':
$this->onLink();
break;
// 语音消息
case 'voice':
$this->onVoice();
break; default:
$this->onUnknown();
break; }
}</font>

教程三:Wechat库的使用的更多相关文章

  1. 中文翻译:pjsip教程(三)之ICE stream transport的使用

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  2. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...

  4. Fastify 系列教程三 (验证、序列化和生命周期)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) 验证 Fast ...

  5. webpack4 系列教程(三): 多页面解决方案--提取公共代码

    这节课讲解webpack4打包多页面应用过程中的提取公共代码部分.相比于webpack3,4.0版本用optimization.splitChunks配置替换了3.0版本的CommonsChunkPl ...

  6. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  7. electron教程(三): 使用ffi-napi引入C++的dll

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...

  8. Elasticsearch入门教程(三):Elasticsearch索引&映射

    原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...

  9. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  10. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)

    前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...

随机推荐

  1. html5中canvas的使用 获取鼠标点击页面上某点的RGB

    1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...

  2. awk命令简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入

    系列目录 前言 为了符合后面更新后的重构系统,文章于2016-11-1日重写 本节重构一下代码,采用IOC控制反转,也就是依赖注入 您可以访问http://unity.codeplex.com/rel ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码

    系列目录 我们上一节建了数据库的表,但我发现很多东西还未完善起来,比如验证码,我们先做好验证码吧,验证码我们再熟悉不过了,为了防止恶意的登录,我们必须在登录页面加入验证码,下面我将分享一个验证码,这个 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统-分配角色给用户

    系列目录 由于之前做了将权限赋给角色,还需要做将角色组赋给用户,和将用户赋给角色组,一个用户可以拥有多个角色组,一个角色组包含多个用户,打开模块管理,添加一个分配的操作码 并在 角色权限设置授权给他 ...

  6. IDDD 实现领域驱动设计-理解限界上下文

    上一篇:<IDDD 实现领域驱动设计-理解领域和子域> <实现领域驱动设计>前两章内容,基本上读完了,和<领域驱动设计>不同的是,它把很多的概念都放在前面进行讲述了 ...

  7. 学会用bootstrap的modal和carousel

    bootstrap框架提供了很多好用的javascript组件,可以很方便的实现常用的js效果,比如点击弹出一个div(modal).下拉菜单.旋转木马(carousel或slider),非常适合前端 ...

  8. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  9. 剖析 HTTP 协议

    HTTP 概述 HTTP 是什么? HTTP(HyperText Transfer Protocol,超文本传输协议)是WWW (World Wide Web)实现数据通信的基石. HTTP是由IET ...

  10. 《JavaScript 代码优化指南》

      ~~教你向老鸟一样敲代码~~. 1. 将脚本放在页面的底部 ... <script src="./jquery.min.js"></script> &l ...