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自动更新新闻DIY
Oct 09 PHP
discuz Passport 通行证 整合笔记
Jun 30 PHP
使用PHP批量生成随机用户名
Jul 10 PHP
PHP 日期加减的类,很不错
Oct 10 PHP
php错误、异常处理机制(补充)
May 07 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
php基于双向循环队列实现历史记录的前进后退等功能
Aug 08 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
php验证身份证号码正确性的函数
Jul 20 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
Laravel中错误与异常处理的用法示例
Sep 16 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的简易冒泡法代码分享
2012/08/28 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php数组键名技巧小结
2015/02/17 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python实现用户登陆邮件通知的方法
2015/07/09 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
django url到views参数传递的实例
2019/07/19 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
python绘制封闭多边形教程
2020/02/18 Python
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
毕业生简单求职信
2013/11/19 职场文书
浙大毕业生自荐信
2014/01/26 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
2015年科普工作总结
2015/07/23 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers