说“监听”只是形象点,实际上我们是通过“监听”方法来分类、分配收到的消息类型,然后再确定我们要做什么处理。
同样,我们在易信处理类
yixin.class.php 文件的
YixinAccess类中添加监听方法(以下方法都是案例,可自行扩展):
-
/*
-
* 响应易信平台推送消息
-
* 可以根据消息类型处理不同的消息
-
* 除了验证开发者、创建推广二维码等,其余基本需要该函数来统一调度;
-
*/
-
public function listen()
-
{
-
// 易信平台post数据给你时,同时会以get方式发送给你 timestamp、nonce、signature参数,
// 在处理消息前,要先判断是否来自易信平台,以防非法来源;
if(!$this->checkSignature()) exit; // 签名校验失败则终止;
-
// 接收易信post方式推送来的消息;
-
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
-
// 写入日志;
-
$this->log('收到易信平台推送的消息:' . $postStr);
-
if (!empty($postStr))
-
{
-
// 将推送的XML消息解析为对象;
-
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
-
// MsgType类型为:text(文本消息)image(图片消息)audio(语音消息)video(视频消息)
-
// event location(地理位置消息)
-
// event(事件消息):subscribe(订阅) unsubscribe(取消订阅)YIXINSCAN(扫描推广二维码)CLICK(自定义菜单点击)
-
$msgType = trim($postObj->MsgType); // 消息类型;文本、菜单点击等
-
// 可以直接调用 handleMessage()函数,switch一下是为了清晰明了;
-
switch($msgType)
-
{
-
case 'text': // 文本消息类型;
-
$this->handleMessage($postObj, $msgType);
-
break;
-
case 'event': // 事件消息类型 包括关注、取消关注、自定义菜单点击等;
-
$this->handleMessage($postObj, $msgType);
-
break;
-
case 'image': // 图片消息类型;
-
$this->handleMessage($postObj, $msgType);
-
break;
-
case 'location': // 地理位置信息(用户主动);
-
$this->handleMessage($postObj, $msgType);
-
break;
-
default:
-
$resultStr = "未处理事件: " . $msgType;
-
$this->log($resultStr);
-
break;
-
}
-
}
-
else
-
{
-
echo ''; // 收到的推送内容为空,直接响应空值给易信平台;
-
}
-
}
可以看到,根据各种消息类型MsgType,我们可以调用不同的处理方法来进行回应。
当然,我这里全部调用 handleMessage()方法来处理(以前是不同的方法,放到一个类里太麻烦)
handleMessage()方法会根据不同的消息类型,再决定载入对应的处理类:
-
// 处理消息
-
private function handleMessage($obj,$msgType)
-
{
-
$clsFile = './handle_' . $msgType . '.class.php';
-
if(file_exists($clsFile))
-
{
-
// 载入响应的处理类;
-
$this->log('加载消息处理文件:' . $clsFile);
-
include_once($clsFile);
-
$handle = new handleMessage();
-
$re = $handle->handle($obj);
-
$this->log($re);
-
if($re) echo $re; // 将消息返回给用户;
-
}
-
else echo '';// 如果没有响应的处理类,则向易信平台返回空值;
-
}
最后,在我们的接口文件 echo.php 中开启“监听”即可:
-
<?php
-
require_once('./yixin.class.php');
-
ini_set('date.timezone','Asia/Shanghai'); // 设置本地时区;
-
-
// 定义TOKEN常量;
-
define('TOKEN','yxTest');
-
// 开发者凭据;
-
define('APPID','Your APP_ID');
-
define('SECRET','Your APP_SECRET');
-
// 实例化一个易信接口对象;
-
$yx = new YixinAccess();
-
// 开发者验证;
-
// $yx->valid();
-
-
// 监听易信平台推送消息包括文字、点击事件、地理信息上传等一系列事件;
-
$yx->listen();
阅读(1629) | 评论(0) | 转发(0) |