上一篇教程中我们提供了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. TSQL 字符串函数:截断和查找

    字符串截断函数是指:Stuff 和 SubString,字符串查找函数是:CharIndex 和 PatIndex 一,SubString 截取子串 最常用的字符串函数,用于截取特定长度的子串. SU ...

  2. C#制作、打包、签名、发布Activex全过程

    一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠HTML是无法实现了,因此必须借用Activex来实现.由于本人主要擅长C#,自然本文给出了用C#实现的范例 ...

  3. SQL Server 进制转换函数

    一.背景 前段时间群里的朋友问了一个问题:“在查询时增加一个递增序列,如:0x00000001,即每一个都是36进位(0—9,A--Z),0x0000000Z后面将是0x00000010,生成一个像下 ...

  4. IL指令详细表

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  5. 1. 使用Filter 作为控制器

    最近整理一下学习笔记,并且准备放到自己的博客上.也顺便把Struts2 复习一遍 1. MVC 设计模式概览 实现 MVC(Model.View.Controller) 模式的应用程序由 3 大部分构 ...

  6. 在 Windows Phone 中,为 Grid 添加 Tilt 效果

    在 Windows Phone 中,Tilt 效果是比较经典的效果,我们可以很简单的为按钮等控件添加这样的效果(使用 Windows Phone Toolkit 的Tilt 效果),但是,如果我们想要 ...

  7. 关于xml加载提示: Error on line 1 of document : 前言中不允许有内容

    我是在java中做的相关测试, 首先粘贴下报错: 读取xml配置文件:xmls\property.xml org.dom4j.DocumentException: Error on line 1 of ...

  8. No.004:Median of Two Sorted Arrays

    问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...

  9. JS 传播事件、取消事件默认行为、阻止事件传播

    1.事件处理程序的返回值 通常情况下,返回值false就是告诉浏览器不要执行这个事件相关的默认操作.例如,表单提交按钮的onclick事件处理程序能通过返回false阻止浏览器提交表单,再如a标签的o ...

  10. js—模糊查询

    首先要明白什么是模糊查询(废话又来了),就是根据关键字把列表中符合关键字的一项或某项罗列出来,也就是要检查列表的每一项中是否含有关键字,因此抽象一下就是一个字符串中是否含有某个字符或者字符串. 以下例 ...