php实现微信公众平台账号自定义菜单类


Posted in PHP onDecember 02, 2014

本文实例讲述了php实现微信公众平台账号自定义菜单类的方法。分享给大家供大家参考。具体分析如下:

微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数。

申请自定义菜单

服务号可以申请自定义菜单,使用QQ登录的公众号,可以升级为邮箱登录,使用邮箱登录的公众号,可以修改登录邮箱,群发消息可以同步到腾讯微博.

微信公众平台账号api程序

<?php 

//define your token 

define("TOKEN", "chenxiang");//改成自己的TOKEN 

define('APP_ID', '');//改成自己的APPID 

define('APP_SECRET', '');//改成自己的APPSECRET 

 

$wechatObj = new wechatCallbackapiTest(APP_ID,APP_SECRET); 

$wechatObj->Run(); 

 

class wechatCallbackapiTest 

{ 

    private $fromUsername; 

    private $toUsername; 

    private $times; 

    private $keyword; 

    private $app_id; 

    private $app_secret; 

     

    public function __construct($appid,$appsecret) 

    { 

        # code... 

        $this->app_id = $appid; 

        $this->app_secret = $appsecret; 

    } 

    public function valid() 

    { 

        $echoStr = $_GET["echostr"]; 

        if($this->checkSignature()){ 

            echo $echoStr; 

            exit; 

        } 

    } 

    /** 

     * 运行程序 

     * @param string $value [description] 

     */ 

    public function Run() 

    { 

        $this->responseMsg(); 

        $arr[]= "您好,这是自动回复,我现在不在,有事请留言,我会尽快回复你的^_^"; 

        echo $this->make_xml("text",$arr); 

    } 

    public function responseMsg() 

    {    

        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//返回回复数据 

        if (!emptyempty($postStr)){ 

                $access_token = $this->get_access_token();//获取access_token 

                $this->createmenu($access_token);//创建菜单 

                //$this->delmenu($access_token);//删除菜单 

                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 

                $this->fromUsername = $postObj->FromUserName;//发送消息方ID 

                $this->toUsername = $postObj->ToUserName;//接收消息方ID 

                $this->keyword = trim($postObj->Content);//用户发送的消息 

                $this->times = time();//发送时间 

                $MsgType = $postObj->MsgType;//消息类型 

                if($MsgType=='event'){ 

                    $MsgEvent = $postObj->Event;//获取事件类型 

                    if ($MsgEvent=='subscribe') {//订阅事件 

                        $arr[] = "你好,我是xxx,现在我们是好友咯![愉快][玫瑰]"; 

                        echo $this->make_xml("text",$arr); 

                        exit; 

                    }elseif ($MsgEvent=='CLICK') {//点击事件 

                        $EventKey = $postObj->EventKey;//菜单的自定义的key值,可以根据此值判断用户点击了什么内容,从而推送不同信息 

                        $arr[] = $EventKey; 

                        echo $this->make_xml("text",$arr); 

                        exit; 

                    } 

                } 

        }else { 

            echo "this a file for weixin API!"; 

            exit; 

        } 

    } 

    /** 

     * 获取access_token 

     */ 

    private function get_access_token() 

    { 

        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->app_id."&secret=".$this->app_secret; 

        $data = json_decode(file_get_contents($url),true); 

        if($data['access_token']){ 

            return $data['access_token']; 

        }else{ 

            return "获取access_token错误"; 

        } 

    } 

    /** 

     * 创建菜单 

     * @param $access_token 已获取的ACCESS_TOKEN 

     */ 

    public function createmenu($access_token) 

    { 

        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token; 

        $arr = array(  

            'button' =>array( 

                array( 

                    'name'=>urlencode("生活查询"), 

                    'sub_button'=>array( 

                        array( 

                            'name'=>urlencode("天气查询"), 

                            'type'=>'click', 

                            'key'=>'VCX_WEATHER' 

                        ), 

                        array( 

                            'name'=>urlencode("身份证查询"), 

                            'type'=>'click', 

                            'key'=>'VCX_IDENT' 

                        ) 

                    ) 

                ), 

                array( 

                    'name'=>urlencode("轻松娱乐"), 

                    'sub_button'=>array( 

                        array( 

                            'name'=>urlencode("刮刮乐"), 

                            'type'=>'click', 

                            'key'=>'VCX_GUAHAPPY' 

                        ), 

                        array( 

                            'name'=>urlencode("幸运大转盘"), 

                            'type'=>'click', 

                            'key'=>'VCX_LUCKPAN' 

                        ) 

                    ) 

                ), 

                array( 

                    'name'=>urlencode("我的信息"), 

                    'sub_button'=>array( 

                        array( 

                            'name'=>urlencode("关于我"), 

                            'type'=>'click', 

                            'key'=>'VCX_ABOUTME' 

                        ), 

                        array( 

                            'name'=>urlencode("工作信息"), 

                            'type'=>'click', 

                            'key'=>'VCX_JOBINFORMATION' 

                        ) 

                    ) 

                ) 

            ) 

        ); 

        $jsondata = urldecode(json_encode($arr)); 

        $ch = curl_init(); 

        curl_setopt($ch,CURLOPT_URL,$url); 

        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 

        curl_setopt($ch,CURLOPT_POST,1); 

        curl_setopt($ch,CURLOPT_POSTFIELDS,$jsondata); 

        curl_exec($ch); 

        curl_close($ch); 

    } 

    /** 

     * 查询菜单 

     * @param $access_token 已获取的ACCESS_TOKEN 

     */ 

     

    private function getmenu($access_token) 

    { 

        # code... 

        $url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=".$access_token; 

        $data = file_get_contents($url); 

        return $data; 

    } 

    /** 

     * 删除菜单 

     * @param $access_token 已获取的ACCESS_TOKEN 

     */ 

     

    private function delmenu($access_token) 

    { 

        # code... 

        $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$access_token; 

        $data = json_decode(file_get_contents($url),true); 

        if ($data['errcode']==0) { 

            # code... 

            return true; 

        }else{ 

            return false; 

        } 

    } 

         

    /** 

     *@param type: text 文本类型, news 图文类型 

     *@param value_arr array(内容),array(ID) 

     *@param o_arr array(array(标题,介绍,图片,超链接),...小于10条),array(条数,ID) 

     */ 

     

    private function make_xml($type,$value_arr,$o_arr=array(0)){ 

        //=================xml header============ 

        $con="<xml> 

                    <ToUserName><![CDATA[{$this->fromUsername}]]></ToUserName> 

                    <FromUserName><![CDATA[{$this->toUsername}]]></FromUserName> 

                    <CreateTime>{$this->times}</CreateTime> 

                    <MsgType><![CDATA[{$type}]]></MsgType>"; 

                     

          //=================type content============ 

        switch($type){ 

           

            case "text" :  

                $con.="<Content><![CDATA[{$value_arr[0]}]]></Content> 

                    <FuncFlag>{$o_arr}</FuncFlag>";   

            break; 

             

            case "news" :  

                $con.="<ArticleCount>{$o_arr[0]}</ArticleCount> 

                     <Articles>"; 

                foreach($value_arr as $id=>$v){ 

                    if($id>=$o_arr[0]) break; else null; //判断数组数不超过设置数 

                    $con.="<item> 

                         <Title><![CDATA[{$v[0]}]]></Title>  

                         <Description><![CDATA[{$v[1]}]]></Description> 

                         <PicUrl><![CDATA[{$v[2]}]]></PicUrl> 

                         <Url><![CDATA[{$v[3]}]]></Url> 

                         </item>"; 

                } 

                $con.="</Articles> 

                     <FuncFlag>{$o_arr[1]}</FuncFlag>";   

            break; 

        } //end switch 

         //=================end return============ 

        $con.="</xml>"; 

        return $con; 

    } 

  

    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 相关文章推荐
PHP文本操作类
Nov 25 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php max_execution_time执行时间问题
Jul 17 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
CI框架网页缓存简单用法分析
Dec 26 PHP
php实现的PDO异常处理操作分析
Dec 27 PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 #PHP
PHP间隔一段时间执行代码的方法
Dec 02 #PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 #PHP
php面象对象数据库操作类实例
Dec 02 #PHP
PHP实现的比较完善的购物车类
Dec 02 #PHP
Yii框架关联查询with用法分析
Dec 02 #PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 #PHP
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
Prototype源码浅析 Number部分
2012/01/16 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
Vue下路由History模式打包后页面空白的解决方法
2018/06/29 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
安装Python的web.py框架并从hello world开始编程
2015/04/25 Python
详解Python Socket网络编程
2016/01/05 Python
Python3学习笔记之列表方法示例详解
2017/10/06 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
python opencv读mp4视频的实例
2018/12/07 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
小学国庆节活动方案
2014/02/11 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
三严三实心得体会范文
2014/10/13 职场文书
校园安全学习心得体会
2016/01/18 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
新手必备Python开发环境搭建教程
2021/05/28 Python