php微信公众平台开发(三)订阅事件处理


Posted in PHP onDecember 06, 2016

一、简介

新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理。

在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台,通俗一点讲就是该平台的“使用说明书”。

本文将详细讲述对subscribe事件的处理过程,回复相应信息提升交互性。

二、思路分析

微信目前提供了五种消息类型,分别为:

  • 文本消息(text);
  • 图片消息(image);
  • 地理位置消息(location);
  • 链接消息(link);
  • 事件推送(event);

接收到消息后,首先需要对消息类型做出判断,然后再针对不同类型的消息做出处理。在事件推送中,事件类型又分为三种,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件),还需要再加一次判断;判断为subscribe事件后,根据设定好的欢迎消息,回复给用户。

三、判断消息类型

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);

switch($RX_TYPE)
{
  case "text":
    $resultStr = $this->handleText($postObj);
    break;
  case "event":
    $resultStr = $this->handleEvent($postObj);
    break;
  default:
    $resultStr = "Unknow msg type: ".$RX_TYPE;
    break;
}

说明:

$RX_TYPE = trim($postObj->MsgType); 
得到消息类型;

case "text":
$resultStr = $this->handleText($postObj); 
使用handleText() 函数处理文本消息;

case "event":
$resultStr = $this->handleEvent($postObj); 
使用handleEvent() 函数处理事件推送;

四、判断事件类型

switch ($object->Event)
{
  case "subscribe":
    $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";
    break;
  default :
    $contentStr = "Unknow Event: ".$object->Event;
    break;
}

说明:

如果是subscribe事件,设定回复内容为“感谢您关注【卓锦苏州】...”;

五、完整代码

<?php
/**
 * wechat php test
 */

//define your token
define("TOKEN", "zhuojin");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();
//$wechatObj->valid();

class wechatCallbackapiTest
{
  /*public function valid()
  {
    $echoStr = $_GET["echostr"];

    //valid signature , option
    if($this->checkSignature()){
      echo $echoStr;
      exit;
    }
  }*/

  public function responseMsg()
  {
    //get post data, May be due to the different environments
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

    //extract post data
    if (!empty($postStr)){
        
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $RX_TYPE = trim($postObj->MsgType);

        switch($RX_TYPE)
        {
          case "text":
            $resultStr = $this->handleText($postObj);
            break;
          case "event":
            $resultStr = $this->handleEvent($postObj);
            break;
          default:
            $resultStr = "Unknow msg type: ".$RX_TYPE;
            break;
        }
        echo $resultStr;
    }else {
      echo "";
      exit;
    }
  }

  public function handleText($postObj)
  {
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $keyword = trim($postObj->Content);
    $time = time();
    $textTpl = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[%s]]></MsgType>
          <Content><![CDATA[%s]]></Content>
          <FuncFlag>0</FuncFlag>
          </xml>";       
    if(!empty( $keyword ))
    {
      $msgType = "text";
      $contentStr = "Welcome to wechat world!";
      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
      echo $resultStr;
    }else{
      echo "Input something...";
    }
  }

  public function handleEvent($object)
  {
    $contentStr = "";
    switch ($object->Event)
    {
      case "subscribe":
        $contentStr = "感谢您关注【卓锦苏州】"."\n"."微信号:zhuojinsz"."\n"."卓越锦绣,名城苏州,我们为您提供苏州本地生活指南,苏州相关信息查询,做最好的苏州微信平台。"."\n"."目前平台功能如下:"."\n"."【1】 查天气,如输入:苏州天气"."\n"."【2】 查公交,如输入:苏州公交178"."\n"."【3】 翻译,如输入:翻译I love you"."\n"."【4】 苏州信息查询,如输入:苏州观前街"."\n"."更多内容,敬请期待...";
        break;
      default :
        $contentStr = "Unknow Event: ".$object->Event;
        break;
    }
    $resultStr = $this->responseText($object, $contentStr);
    return $resultStr;
  }
  
  public function responseText($object, $content, $flag=0)
  {
    $textTpl = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[%s]]></Content>
          <FuncFlag>%d</FuncFlag>
          </xml>";
    $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);
    return $resultStr;
  }

  private function checkSignature()
  {
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];  
        
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    
    if( $tmpStr == $signature ){
      return true;
    }else{
      return false;
    }
  }
}

?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
使用PHP和XSL stylesheets转换XML文档
Oct 09 PHP
PHP5 安装方法
Jan 15 PHP
java EJB 加密与解密原理的一个例子
Jan 11 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
PHP查询MySQL大量数据的时候内存占用分析
Jul 22 PHP
PHP中header和session_start前不能有输出原因分析
Jan 11 PHP
PHP输出缓冲控制Output Control系列函数详解
Jul 02 PHP
smarty中常用方法实例总结
Aug 07 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
PHP安全下载文件的方法
Apr 07 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
laravel解决迁移文件一次删除创建字段报错的问题
Oct 24 PHP
php微信公众平台示例代码分析(二)
Dec 06 #PHP
php微信公众平台开发(一) 配置接口
Dec 06 #PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 #PHP
php简单实现文件或图片强制下载的方法
Dec 06 #PHP
php+ajax无刷新上传图片的实现方法
Dec 06 #PHP
php解析base64数据生成图片的方法
Dec 06 #PHP
php rsa 加密,解密,签名,验签详解
Dec 06 #PHP
You might like
Apache设置虚拟WEB
2006/10/09 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
2019/04/02 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
arguments对象
2006/11/20 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
关于ligerui子页面关闭后,父页面刷新,重新加载的方法
2019/09/27 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python读取xlsx的方法
2018/12/25 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
SQL Server笔试题
2012/01/10 面试题
网站编辑求职信
2013/10/17 职场文书
表彰会主持词
2014/03/26 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
倡议书格式
2014/08/30 职场文书
电子商务实训报告总结
2014/11/05 职场文书
大连星海广场导游词
2015/02/10 职场文书
导游词之介休绵山
2019/12/31 职场文书
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js