打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

一、简介

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

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

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

二、思路分析

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

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

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

三、判断消息类型

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

  3. switch($RX_TYPE)
  4. {
  5.     case "text":
  6.         $resultStr = $this->handleText($postObj);
  7.         break;
  8.     case "event":
  9.         $resultStr = $this->handleEvent($postObj);
  10.         break;
  11.     default:
  12.         $resultStr = "Unknow msg type: ".$RX_TYPE;
  13.         break;
  14. }
复制代码

说明:

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

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

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

四、判断事件类型

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

说明:

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

五、完整代码

  1. <?php
  2. /**
  3.   * wechat php test
  4.   */

  5. //define your token
  6. define("TOKEN", "zhuojin");
  7. $wechatObj = new wechatCallbackapiTest();
  8. $wechatObj->responseMsg();
  9. //$wechatObj->valid();

  10. class wechatCallbackapiTest
  11. {
  12.     /*public function valid()
  13.     {
  14.         $echoStr = $_GET["echostr"];

  15.         //valid signature , option
  16.         if($this->checkSignature()){
  17.             echo $echoStr;
  18.             exit;
  19.         }
  20.     }*/

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

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

  30.                 switch($RX_TYPE)
  31.                 {
  32.                     case "text":
  33.                         $resultStr = $this->handleText($postObj);
  34.                         break;
  35.                     case "event":
  36.                         $resultStr = $this->handleEvent($postObj);
  37.                         break;
  38.                     default:
  39.                         $resultStr = "Unknow msg type: ".$RX_TYPE;
  40.                         break;
  41.                 }
  42.                 echo $resultStr;
  43.         }else {
  44.             echo "";
  45.             exit;
  46.         }
  47.     }

  48.     public function handleText($postObj)
  49.     {
  50.         $fromUsername = $postObj->FromUserName;
  51.         $toUsername = $postObj->ToUserName;
  52.         $keyword = trim($postObj->Content);
  53.         $time = time();
  54.         $textTpl = "<xml>
  55.                     <ToUserName><![CDATA[%s]]></ToUserName>
  56.                     <FromUserName><![CDATA[%s]]></FromUserName>
  57.                     <CreateTime>%s</CreateTime>
  58.                     <MsgType><![CDATA[%s]]></MsgType>
  59.                     <Content><![CDATA[%s]]></Content>
  60.                     <FuncFlag>0</FuncFlag>
  61.                     </xml>";             
  62.         if(!empty( $keyword ))
  63.         {
  64.             $msgType = "text";
  65.             $contentStr = "Welcome to wechat world!";
  66.             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
  67.             echo $resultStr;
  68.         }else{
  69.             echo "Input something...";
  70.         }
  71.     }

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

  101.     private function checkSignature()
  102.     {
  103.         $signature = $_GET["signature"];
  104.         $timestamp = $_GET["timestamp"];
  105.         $nonce = $_GET["nonce"];    
  106.                 
  107.         $token = TOKEN;
  108.         $tmpArr = array($token, $timestamp, $nonce);
  109.         sort($tmpArr);
  110.         $tmpStr = implode( $tmpArr );
  111.         $tmpStr = sha1( $tmpStr );
  112.         
  113.         if( $tmpStr == $signature ){
  114.             return true;
  115.         }else{
  116.             return false;
  117.         }
  118.     }
  119. }

  120. ?>
复制代码
源码:<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");
$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 zhuzhipeng 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;
        }
    }
}

?>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
微信公众平台开发(四) 简单回复功能开发
微信扫描带参数 被动推送事件
php微信推送消息接口的实现方式
微信公众平台开发入门教程
三、微信开发:自定义菜单
使用PHP在微信公共平台实现24点游戏
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服