教程三:Wechat库的使用
上一篇教程中我们提供了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库的使用的更多相关文章
- 中文翻译:pjsip教程(三)之ICE stream transport的使用
1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (初级) 企业库提供了一个很强大的验证应用程序模 ...
- Fastify 系列教程三 (验证、序列化和生命周期)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) 验证 Fast ...
- webpack4 系列教程(三): 多页面解决方案--提取公共代码
这节课讲解webpack4打包多页面应用过程中的提取公共代码部分.相比于webpack3,4.0版本用optimization.splitChunks配置替换了3.0版本的CommonsChunkPl ...
- PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
- electron教程(三): 使用ffi-napi引入C++的dll
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(二): http服务器, ws服务器, 进程管理 electron教程(三): 使 ...
- Elasticsearch入门教程(三):Elasticsearch索引&映射
原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文 ...
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)
前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...
随机推荐
- mysql交互协议解析——mysql包基础数据、mysql包基本格式
mysql交互协议是开发mysql周边组件常用的协议,如JDBC,libmysql等等. 在此我们要认识到mysql交互协议其实是半双工的交互协议,至于为什么,这里就先挖个小坑,以后再填. 在探讨my ...
- Owin:“System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生
异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 这个异常我遇到两种情况,供园友参考: 第一种,权限不够,在项目运行的时候弹出== ...
- 在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token
OAuth真是一个复杂的东东,即使你把OAuth规范倒背如流,在具体实现时也会无从下手.因此,Microsoft.Owin.Security.OAuth应运而生(它的实现代码在Katana项目中),帮 ...
- PowerDesigner(数据建模)使用大全
什么是PowerDesigner 引入百度百科的说法是: power designer是能进行数据库设计的强大的软件,是一款开发人员常用的数据库建模工具.使用它可以分别从概念数据模型(Conceptu ...
- Ajax 提交KindEditor的数据
这次我是在EasyUI中使用了KindEditor的编辑器,按照官方给的代码,总是无法获取编辑器里面的值(内容),如下: KindEditor.ready(function (K) { ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- C# - Networkcomms
来自英国的用C#语言编写的开源的TCP/UDP网络通信框架,简单方便,性能稳定. 参考: NetworkComms官网: NetworkComms通信框架中文网: 介绍开源的.net通信框架: Ne ...
- C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...
- Python subprocess.Popen communicate() 和wait()使用上的区别
之所以会纠结到这个问题上是因为发现在调用Popen的wait方法之后程序一直没有返回.google发现wait是有可能产生死锁的.为了把这个问题彻底弄清楚,搜索一些资料过来看看: 原文链接:http: ...
- 【转】OpenCV 移植学习--EMCV
在Opencv论坛有好些这方面的帖子,主要看了一下几个牛人的帖子,比如论坛管理员于博士Shiqi Yu:(EMCV:可在DSP上运行的OpenCV)http://www.opencv.org.cn/f ...