首页 /

微信订阅号

/ 微信自定义菜单的click事件推送开发

微信自定义菜单的click事件推送开发

  在创建微信公众号的菜单时,微信给我们提供了10类不同的事件推送类型,这些不同的类型代表着不同的功能,这些事件推送可以大大地丰富菜单的功能,这是编辑模式下创建的菜单无法实现的,本教程将讲解当用户点击某一菜单时返回某些内容的click事件推送功能开发。

  例如我们在微信公众号里面创建如下菜单:

 {
     "button":[
     {    
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
               "type":"view",
               "name":"视频",
               "url":"http://v.qq.com/"
            },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }


  我们看到在这个菜单里面有两个点击事件“今日歌曲”和"赞一下我们",我们就以点击“今日歌曲”为例子进行开发。当用户关注这个微信公众号后点击歌曲就返回一首歌曲或其它内容,当然,这里到底是返回什么,您可以自己根据自己业务需要进行开发,这就是“开发模式”下创建的菜单的灵活性,也体现出其功能之强大来。

  您可以通过让用户点击“今日歌曲”来返回一个小视频、返回一首歌曲、返回一段文本、返回其它内容等。

  请注意:我们进行click事件推送开发是已经在公众号里面创建了菜单的基础上进行的开发,也就是说click事件推送开发是在微信用户关注公众号后,点击“今日歌曲”(以这个按扭为例子)后,把这个点击事件推送给开发者,开发者就接收到这个腾讯服务器推送来的click事件,根据自己的需要进行开发处理。

  click事件推送的xml代码包为:

  <xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[CLICK]]></Event>
<EventKey><![CDATA[EVENTKEY]]></EventKey>
</xml>

参数说明:


参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,CLICK
EventKey 事件KEY值,与自定义菜单接口中KEY值对应



  上面就是用户点击“今日歌曲”后,通过讯服务器发送给“开发者”的xml代码,只要根据前面学过的微信开发知识,获取发送过来的事件类型和事件KEY值,就可以返回您想返回的内容了。这里的KEY值指的是在创建菜单时我们填写好的KEY值。

  “今日歌曲”的KEY值是:"key":"V1001_TODAY_MUSIC"

  "赞一下我们"的KEY值是:"key":"V1001_GOOD"


开发要求

  下面我们将开发:当用户点击“今日歌曲”后,本来应当返回一首歌曲,但是,现在我们让其返回一个网址“微信连www.phpos.net”。

  这样做的目的让大家明白,类似点击事件推送可以根据自己需要灵活使用,微信用户点击某一按扭后可以返回开发者想返回的任何可以返回的内容。

程序开发开始

  1)对推送过来的xml数据包,先获取消息类型MsgType是不是event,即if($postObj->MsgType=='event'),当然,您可以使用switch结构语句,我这里使用if条件语句来判断。

  如果条件成立也就是开发者接收到的消息类型是event类型,那么,再判断这个事件类型是不是向应用户的点击事件,即if($postObj->Event == 'CLICK' )条件成立是否成立。

  如果是一个"CLICK"事件(注意这个CLICK要大写),再判断一下这个事件的KEY值是不是“今日歌曲”的key值"V1001_TODAY_MUSIC",即条件if($postObj->EventKey == 'V1001_TODAY_MUSIC')是不是成立。

  2)当上面三个条件都成立,说明是一个微信用户(即这个公众号的粉丝)做了click点击,并且,点击的是“今日歌曲”,接下来我们就要编写返回代码。

  因为,我们要返回的是一段文本,所以,用到的返回的xml代码是文本的xml,编写后的代码是:

 
   public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        if (!empty($postStr)){
                libxml_disable_entity_loader(true);
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $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[text]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";             
if($postObj->MsgType=='event'){
  if($postObj->Event == 'CLICK'){
    if($postObj->EventKey == 'V1001_TODAY_MUSIC'){

 $contentStr = "微信连,www.phpos.net";
 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
 echo $resultStr;
   }
  }
}

        }else {
            echo "success";
            exit;
        }
    }


  把这段内容加入到类wechatCallbackapiTest中,然后,这个文件wx_sample.php(这里以官方提供的这个演示文件为例子)上传到服务器,重新关注一下测试公众号,点击“今日歌曲”后,就把$contentStr内容弹调取出来了,如下图所示:

click点击事件