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+MYSQL开发工具及资源收藏
Jan 02 PHP
php学习笔记之 函数声明
Jun 09 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
Apr 26 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
Sep 06 PHP
php面向对象编程self和static的区别
May 08 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
PHP实现的回溯算法示例
Aug 15 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 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 中执行排序与 MySQL 中排序
2009/04/21 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
jquery+html仿翻页相册功能
2016/12/20 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
python list转dict示例分享
2014/01/28 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python实现图书管理系统
2018/03/12 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
Python 3 判断2个字典相同
2019/08/06 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
Python中如何定义一个函数
2016/09/06 面试题
求职自荐信
2013/12/14 职场文书
廉政文化进校园广播稿
2014/10/20 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技