上一篇教程中我们提供了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>

最新文章

  1. c语言-&gt;和 .
  2. Java 并发编程 Executor
  3. angular2自学笔记---官网项目(一)
  4. Java---网络编程(3)-TCP-互传文件和图片
  5. iOS7 StatusBar 使用小结
  6. cocos2dx中关于Action动作的相关API的具体介绍
  7. Q:记学习枚举过程中的一个小问题
  8. RTMP规范协议
  9. java并发包java.util.concurrent详解
  10. 解构赋值 Destructuring Assignment
  11. Java 骚操作--生成二维码
  12. SAP发布REST/HTTP接口
  13. WPF 依赖属性&amp;附加属性
  14. python工具 - alert弹框输出姓名年龄、求和
  15. C/C++笔试题(基础题)
  16. [Java初探07]__关于面向对象的简单认识
  17. .NET(C#)如何遍历Dictionary
  18. block(八)作用域
  19. JSON转换的原创工具类
  20. MySQL &quot;java.lang.IllegalArgumentException: HOUR_OF_DAY: 2 -&gt; 3&quot; 问题解析

热门文章

  1. Application Request Route实现IIS Server Farms集群负载详解
  2. 基于DotNetOpenAuth的OAuth实现示例代码: 获取access token
  3. 判断CPU是大端还是小端模式
  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)
  5. PhoneGap/cordvoa如何添加Media插件
  6. objC与js通信实现--WebViewJavascriptBridge
  7. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
  8. 给jquery-validation插件添加控件的验证回调方法
  9. deb包的安装及dpkg命令小结
  10. c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】