微信公众号-开发者-自定义菜单-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"
            }]
       }]
 }

菜单生成好了以后,如何处理“赞一下我们”相应事件呢?

引用方倍工作室的代码修改如下:

<?php
/*
    方倍工作室
    CopyRight 2014 All Rights Reserved
*/

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET[‘echostr‘])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    //验证签名
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        $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){
            echo $echoStr;
            exit;
        }
        $siteURL=‘http://210.14.148.180/kdjy/‘;
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            $result = "";
            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

    private function receiveEvent($object)
    {
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注方倍工作室 ";

            //------------------- 赞一下 start ------------------------
            case "CLICK":   //这里是大写‘CLICK’

                $content = $object->EventKey; // 获取key

                if($content==‘V1001_GOOD‘){

                    $content = ‘谢谢支持!!!‘;

                }
            //------------------- 赞一下 end ------------------------

                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

    private function receiveText($object)
    {
        $keyword = trim($object->Content);

            $url = "http://apix.sinaapp.com/weather/?appkey=".$object->ToUserName."&city=".urlencode($keyword);
            $output = file_get_contents($url);
            $content = json_decode($output, true);

            $result = $this->transmitNews($object, $content);

        return $result;
    }

    private function transmitText($object, $content)
    {
        if (!isset($content) || empty($content)){
            return "";
        }
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return "";
        }
        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item[‘Title‘], $item[‘Description‘], $item[‘PicUrl‘], $item[‘Url‘]);
        }
        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }

    private function logger($log_content)
    {

    }
}
?>

加入如下代码,注意CLICK是大写。

微信api:http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html#.E7.82.B9.E5.87.BB.E8.8F.9C.E5.8D.95.E6.8B.89.E5.8F.96.E6.B6.88.E6.81.AF.E6.97.B6.E7.9A.84.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81

PS:为找这个key,找了半天,我是小学生,官方不能写个demo吗?

时间: 2024-11-04 19:10:58

微信公众号-开发者-自定义菜单-CLICK事件处理的相关文章

微信公众号-开发者-自定义菜单

我是个初学者,网上找了看了好多,都是第三方实现的,考虑到安全问题,不敢用! 今天终于摸索出了实现方法. 官方api:http://mp.weixin.qq.com/wiki/13/43de8269be54a0a6f64413e4dfa94f39.html 步骤1:选到“开发者中心”. 2.显示AppSecret,完整显示(要微信扫一下). 3. 去“微信公众平台接口调试工具”, a.选到“基础支持”- “获取access_token接口/token”, b.填写“appid”和“secret”(

微信公众号的自定义菜单事件推送

1.创建自定义菜单 2.组装自定义菜单(JSON格式数据) 微网站:可以实现跳转到微信响应式页面 产品中心:可以实时获取服务器端产品信息,并以图文形式返回 关于我们:可以返回相关的文本信息 微网站:跳转链接 产品中心与关于我们:内部请求 请求代码,请参menu.php页面,创建成功,请取消关注微信公众账号并再次关注,效果如图 3.自定义菜单事件推送 A.接收相关参数(Event和EventKey) 在之前的api.php之中添加代码 B.对参数进行判断与操作 上传代码,效果如下图所示

微信公众平台开放自定义菜单

?自面向开发者和第三方平台开放微信内网页开发工具包(JS-SDK),允许接入微信小店.微信支付等多达11 类的接口集,并且向认证的服务号和订阅号开放公众平台的客服功能,以及帮助公众号把客服系统搬到微信上后,微信公众平台进一步放开基础能力,将对所有公众号开放“自定义菜单”功能.平台管理者在后台点击“添加功能插件”后,选择右下角的“自定义菜单”卡片即可申请开通插件.根据微信平台提供的消息,与之前开发的“自定义菜单”功能相似,平台管理者在编辑自定义菜单功能时,可选择“跳转到网页”和“发送消息”两种动作

微信公众号接口添加菜单时错误(errcode":40017 invalid button type)

POST提交时总是报错: {"errcode":40017,"errmsg":"invalid button type"} 最后查出来是由于数据中有中文引起的 解决: data = {"button":[ {"name": u"会员服务", "sub_button":[ {"type":"click","name&qu

微信公众平台对所有公众号开放自定义菜单

据统计,微信公众号已达1000多万了,但大多数没有微信认证,且没有开发能力,为此微信公众平台开放了自定义菜单功能给所有公众号,这是微信团队年前给广大自媒体送的大礼,期待微信越来越开放 公众帐号运营者点击“添加功能插件”后选择右下角的“自定义菜单”卡片可申请开通自定义菜单插件. 编辑自定义菜单功能时可选择“跳转到网页”和“发送消息”两种动作. 1.自定义菜单支持“跳转到网页”.所有公众帐号均可在自定义菜单中直接选择素材库中的图文消息作为跳转到网页的对象. 认证订阅号和服务号还可直接输入网址. 2.

关于微信公众平台的自定义菜单

在微信公众平台中,菜单是可以配置的,分为两种,登陆微信公众平台账号,在后台管理界面,可以进行手动配置,登陆地址:https://mp.weixin.qq.com/ 温馨提示:服务号开通即带自定义菜单,而订阅号要花钱才能开通的哦. 手动配置的东西很多的,这样不用写后台,就可以让公众号工作了,但功能有限,成为开发者就不同了,可以做随心所欲的开发. 说说成为开发者后的自定义菜单配置,首先进入开发者中心,在上面有开发者ID,复制AppID,和AppSecret(应用密钥),一会有用.向下拉,点击开发者工

成为微信公众号开发者

1申请微信公众号(企业号,服务号,订阅号):根据不同需求申请不同的账号 注册链接:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=register/step1_tmpl&lang=zh_CN 目前腾讯提供测试账号,申请链接:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2填写服务器配置 无论是申请的正式账号还是测试账号都需要填写一些服务器配置 (1)URL:服务器地址(也

微信公众号开发者模式自定义菜单

纯属分享 var config = require('./admin/wx/config/config'); var API = require('wechat-api'); var api = new API(config.appid, config.appsecret); api.getAccessToken(function (err, token) { console.log(err); console.log(token); //accessToken }); var menu = J

.net MVC 微信公众号 点击菜单拉取消息时的事件推送

官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141016&token=&lang=zh_CN 业务描述:点击菜单,推送消息,消息内容为自定义的读取数据库信息之后,为用户推送的动态消息. 首先需要用代码实现自定义菜单,为对应的菜单指定click事件. 关于自定义菜单的创建及事件指定,请看上一篇文章,本篇主要介绍事件响应的实现. MVC controller 中的代码如下: public void Me