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 相关文章推荐
基于mysql的bbs设计(二)
Oct 09 PHP
PHP中一个控制字符串输出的函数
Oct 09 PHP
PHP获取当前文件所在目录 getcwd()函数
May 13 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
Apr 01 PHP
php自定义apk安装包实例
Oct 20 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
PHP打印输出函数汇总
Aug 28 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
WAF的正确bypass
Jan 05 PHP
Redis在Laravel项目中的应用实例详解
Aug 11 PHP
PHP高并发和大流量解决方案整理
Mar 09 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
虫族 ZERG 概述
2020/03/14 星际争霸
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
jQuery右下角悬浮广告实例
2016/10/17 Javascript
three.js绘制地球、飞机与轨迹的效果示例
2017/02/28 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python中的localtime()方法使用详解
2015/05/22 Python
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
详解Python3中字符串中的数字提取方法
2017/01/14 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
枚举与#define宏的区别
2014/04/30 面试题
开学季活动策划方案
2014/02/28 职场文书
学生党员公开承诺书
2014/05/28 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书