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 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
PHP中Session的概念
Oct 09 PHP
PHP4实际应用经验篇(8)
Oct 09 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
Destoon实现多表查询示例
Aug 21 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
Jan 22 PHP
PHP实现动态web服务器方法
Jul 29 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
Mar 22 PHP
php similar_text()函数的定义和用法
May 12 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
php引用传递
Apr 01 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的QRcode类与大家分享
2011/11/13 PHP
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
浅谈js中的闭包
2015/03/16 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
微信小程序入门之指南针
2020/10/22 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python在不同条件下的输入与输出
2020/02/13 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
python入门教程之基本算术运算符
2020/11/13 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
《大禹治水》教学反思
2014/04/27 职场文书
会计专业自荐信
2014/06/03 职场文书
土地转让协议书
2014/09/27 职场文书
特岗教师个人总结
2015/02/10 职场文书
nginx对http请求处理的各个阶段详析
2021/03/31 Servers
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL
Python人工智能之混合高斯模型运动目标检测详解分析
2021/11/07 Python
Java设计模式之代理模式
2022/04/22 Java/Android
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技