处理事件类型消息(MsgType是event)与处理文本类型消息类大同小异,不过是事件类型(event)比较多而已,包括订阅、取消订阅、菜单点击、扫描带参数二维码等等。
同样,首先我们先建立一个
handle_event.class.php 文件:
-
<?php
-
class handleMessage
-
{
-
// todo here.
-
}
同样有个
handle()公共方法:
-
/*
-
* 处理接收的事件消息;
-
* 订阅、扫描、自定义菜单的点击等
-
* 可以用文本方式或图文方式自动回复给订阅者;
-
*/
-
public function handle($obj)
-
{
-
switch($obj->Event)
-
{
-
case 'subscribe': // 订阅事件,注意:此事件还包含未订阅者扫描推广二维码订阅事件;
-
$re = $this->handleSubscribe($obj);
-
return $re;
-
break;
-
case 'unsubscribe': // 取消订阅
-
return '';
-
break;
-
case 'YIXINSCAN': // 扫描二维码事件;
-
return '';
-
break;
-
case 'CLICK': // 点击自定义菜单 EventKey 即你设置的菜单key
-
return $this->handleClick($obj);
-
break;
-
case 'LOCATION' : // 获取订阅者地理位置信息,需用户同意;
-
return '';
-
break;
-
default :
-
return '';
-
break;
-
}
-
}
在处理这些对应事件时,你可能也需要 echoText()、echoNews()方法,请参考第4节中的描述,本节就不做赘述。
订阅事件要单独拿出处理,是因为当 $obj->EventKey 和 $obj->Ticket 参数存在时,代表用户是通过扫描你的推广二维码(含场景值)而关注你的。
-
/*
-
* 处理订阅事件;
-
* 包括普通订阅和扫描推广二维码订阅
-
*/
-
private function handleSubscribe($obj)
-
{
-
if($obj->EventKey)
-
{
-
// 该行为是扫描推广二维码订阅
-
// 可以将该用户的openid和二维码参数值一同保存到数据库;
-
$aryKey = explode('_', $obj->Eventkey); // 分解;
-
if(!empty($aryKey))
-
{
-
if($aryKey[1])
-
{
-
// 处理推广码;
-
}
-
}
-
}
-
else {
-
// 返回欢迎消息;
-
$re = "欢迎关注我们的公众账号\n查看功能帮助请输入\"?\"";
-
return $this->echoText($obj, $re);
-
}
-
}
当然还有处理自定义菜单的响应方法:
-
/*
-
* 处理自定义菜单点击事件;
-
* 根据你设置菜单Key来处理不同的点击事件
-
*/
-
private function handleClick($obj)
-
{
-
switch($obj->EventKey)
-
{
-
case 'c_order':
-
return $this->echoText($obj, '你点击了"我的订单"菜单');
-
break;
-
case 'c_bind':
-
return $this->echoText($obj, '你点击了"账号绑定"菜单');
-
break;
-
default :
-
return '';
-
break;
-
}
-
}
至于用户扫描二维码、获取用户地理位置信息就可以据一反三了,我就不做范例了。
阅读(1090) | 评论(0) | 转发(0) |