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 相关文章推荐
如何分别全角和半角以避免乱码
Oct 09 PHP
Ajax PHP分页演示
Jan 02 PHP
一个简单的php实现的MySQL数据浏览器
Mar 11 PHP
使用PHP编写的SVN类
Jul 18 PHP
php使用curl获取https请求的方法
Feb 11 PHP
Mac OS下配置PHP+MySql环境
Feb 25 PHP
PHP+MYSQL实现用户的增删改查
Mar 24 PHP
PHP实现简单爬虫的方法
Jul 29 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
Mar 13 PHP
php自定义函数实现统计中文字符串长度的方法小结
Apr 15 PHP
django中的ajax组件教程详解
Oct 18 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
深入php self与$this的详解
2013/06/08 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
php常用文件操作函数汇总
2014/11/22 PHP
php递归json类实例
2014/12/02 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
JS面向对象编程——ES6 中class的继承用法详解
2020/03/03 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
python梯度下降法的简单示例
2018/08/31 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
小学开学典礼主持词
2014/03/19 职场文书
项目经理任命书范本
2014/06/05 职场文书
幼儿园标语大全
2014/06/19 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
自荐信格式范文
2015/03/04 职场文书
iPhone13再次曝光
2021/04/15 数码科技
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技