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 输出简单动态WAP页面
Jun 09 PHP
PHP 命名空间实例说明
Jan 27 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
php使用curl存储cookie的示例
Mar 31 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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学习之数组的定义和填充
2011/04/17 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
php生成微信红包数组的方法
2019/09/05 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
javascript CSS画图之基础篇
2009/07/29 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
2017/03/30 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
关于python中导入文件到list的问题
2020/10/31 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
创业计划书中要认真思考的问题
2013/12/28 职场文书
班级学习计划书
2014/04/27 职场文书
伏羲庙导游词
2015/02/09 职场文书