Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26013
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 19:22
个人简介

live a easy life.

文章分类

全部博文(4)

文章存档

2014年(4)

我的朋友

分类: PHP

2014-03-31 14:27:59

说“监听”只是形象点,实际上我们是通过“监听”方法来分类、分配收到的消息类型,然后再确定我们要做什么处理。
同样,我们在易信处理类 yixin.class.php 文件的YixinAccess类中添加监听方法(以下方法都是案例,可自行扩展): 
  1.     /*
  2.      * 响应易信平台推送消息
  3.      * 可以根据消息类型处理不同的消息
  4.      * 除了验证开发者、创建推广二维码等,其余基本需要该函数来统一调度;
  5.      */
  6.     public function listen()
  7.     {
  8.         // 易信平台post数据给你时,同时会以get方式发送给你 timestamp、nonce、signature参数,

            // 在处理消息前,要先判断是否来自易信平台,以防非法来源;

            if(!$this->checkSignature()) exit; // 签名校验失败则终止;


  9.         // 接收易信post方式推送来的消息;
  10.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  11.         // 写入日志;
  12.         $this->log('收到易信平台推送的消息:' . $postStr);
  13.         if (!empty($postStr))
  14.         {        
  15.             // 将推送的XML消息解析为对象;
  16.             $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  17.             // MsgType类型为:text(文本消息)image(图片消息)audio(语音消息)video(视频消息)
  18.             // event location(地理位置消息)
  19.             // event(事件消息):subscribe(订阅) unsubscribe(取消订阅)YIXINSCAN(扫描推广二维码)CLICK(自定义菜单点击)    
  20.             $msgType = trim($postObj->MsgType); // 消息类型;文本、菜单点击等
  21.             // 可以直接调用 handleMessage()函数,switch一下是为了清晰明了;
  22.             switch($msgType)
  23.             {
  24.                 case 'text': // 文本消息类型;
  25.                     $this->handleMessage($postObj, $msgType);
  26.                     break;
  27.                 case 'event': // 事件消息类型 包括关注、取消关注、自定义菜单点击等;
  28.                     $this->handleMessage($postObj, $msgType);
  29.                     break;
  30.                 case 'image': // 图片消息类型;
  31.                     $this->handleMessage($postObj, $msgType);
  32.                     break;
  33.                 case 'location': // 地理位置信息(用户主动);
  34.                     $this->handleMessage($postObj, $msgType);
  35.                     break;
  36.                 default:
  37.                     $resultStr = "未处理事件: " . $msgType;
  38.                     $this->log($resultStr);
  39.                     break;
  40.             }
  41.         }
  42.         else
  43.         {
  44.             echo ''; // 收到的推送内容为空,直接响应空值给易信平台;
  45.         }
  46.     }
可以看到,根据各种消息类型MsgType,我们可以调用不同的处理方法来进行回应。
当然,我这里全部调用 handleMessage()方法来处理(以前是不同的方法,放到一个类里太麻烦)
handleMessage()方法会根据不同的消息类型,再决定载入对应的处理类:
  1.     // 处理消息
  2.     private function handleMessage($obj,$msgType)
  3.     {
  4.         $clsFile = './handle_' . $msgType . '.class.php';
  5.         if(file_exists($clsFile))
  6.         {
  7.             // 载入响应的处理类;
  8.             $this->log('加载消息处理文件:' . $clsFile);
  9.             include_once($clsFile);
  10.             $handle = new handleMessage();
  11.             $re = $handle->handle($obj);
  12.             $this->log($re);
  13.             if($re) echo $re; // 将消息返回给用户;
  14.         }
  15.         else echo '';// 如果没有响应的处理类,则向易信平台返回空值;
  16.     }

最后,在我们的接口文件 echo.php 中开启“监听”即可:
  1. <?php
  2. require_once('./yixin.class.php');
  3. ini_set('date.timezone','Asia/Shanghai'); // 设置本地时区;

  4. // 定义TOKEN常量;
  5. define('TOKEN','yxTest');
  6. // 开发者凭据;
  7. define('APPID','Your APP_ID');
  8. define('SECRET','Your APP_SECRET');
  9. // 实例化一个易信接口对象;
  10. $yx = new YixinAccess();
  11. // 开发者验证;
  12. // $yx->valid();

  13. // 监听易信平台推送消息包括文字、点击事件、地理信息上传等一系列事件;
  14. $yx->listen();




阅读(1629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~