ci框架微信自定义菜单

整理一下脑细胞,最近写了一个ci框架微信开发自定义菜单。

1.在微信公众号里设置基本配置

2.获取token,贴图

 

3.调用微信自定义菜单接口

//获取curl
    public function http_curl($url,$type='get',$res='json',$arr=""){
        /*
         * $url 接口urlstring
         * $type 请求类型string
         * $res   返回数据类型 string
         * $arr post请求参数
         */
        //初始化curl
        $ch=curl_init();
        // 设置参数
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        if($type == 'post'){
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$arr);
        }
        //采集
        $output = curl_exec($ch);
        if($res == 'json'){
            if(curl_errno($ch)){
                //请求失败
                return curl_error($ch);
            }else{
                //请求成功
                return json_decode($output,true);
            }
        }
        //关闭
        curl_close($ch);
    }
    
    //获取access_token 的方法
    public function getAccessToken(){
        //将access_token存在session/cookie中
    
            //如果access_token不存在或已过有效期则重新获取
            $appid = $this->settings['weixinAPPID'];
            $appsecret = $this->settings['weixinAPPSECRET'];
            
            $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
            $res=$this->http_curl($url,'get','json');
            $access_token = $res['access_token'];
            //将重新获取到的access_token 存在session中
            $_SESSION['access_token'] = $res['access_token'];
            $_SESSION['expire_time'] = time()+7200;
            return $access_token;
        
    }

4.创建栏目

public function defineItem(){
        
        
        //创建微信菜单
        //目前的微信接口的调用方式都是通过 curl post/get
        //access_token的值//这个值是有实效的,所以要封装到一个方法 里
        $access_token = $this->getAccessToken();
        
        $url="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;

        
        
        $postArr = $this->getcolumns();     //调用创建栏目的发法
        
        $postJson = urldecode(json_encode($postArr));
        
//        {"button":[{"name":"\u83dc\u5355\u4e00","type":"cilck","key":"item1"},{"name":"\u83dc\u5355\u4e8c","sub_button":[{"name":"\u6b4c\u66f2","type":"click","key":"songs"},{"name":"\u7535\u5f71","type":"view","url":"http:\/\/baidu.com\/"}]},{"name":"\u83dc\u5355\u4e09","type":"view","url":"http:\/\/qq.com"}]}
    //name中文值会转码成这样"name":"\u83dc\u5355\u4e00"
        $res=$this->http_curl($url,'post','json',$postJson);
        
    }

5.创建栏目的方法

//获取栏目名称
    public function getcolumns(){
        $this->load->model('Syscolumn_model','syscolumnModel');
        
        $param = array();
        $param['where']['parent_id']=169;
        $param['where']['publish'] = 1;
        $param['order_by'] = "position asc";
        $menu=$this->syscolumnModel->getData($param);
        
        $weixinMenu = array();
        
        
        foreach ($menu as $key => $value) {
            $m = array();
            $m['name'] = urlencode($value['column_name']);
            $param = array();
            $param['where']['syscolumn_id'] = $value['syscolumn_id'];
            $param['order_by'] = "sort asc";
            $mlist = $this->model->getData($param);
            foreach($mlist as $skey => $svl){
                $m['sub_button'][$skey]['name'] = urlencode($svl['wechartmenu_name']);
                $m['sub_button'][$skey]['type'] = 'view';
                $m['sub_button'][$skey]['url'] = $svl['wechartmenu_link'];
            }
            
            $weixinMenu['button'][] = $m;
        }
        
        return $weixinMenu;
        
    }

 

6.删除菜单

//删除菜单
    public function delete(){
        $access_token = $this->getAccessToken();
        $delete="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=".$access_token;
        $re=$this->http_curl($delete);
        
    }

 

7.最后在方法里调用创建菜单的方法

public function wechartAction(){
        
        $this->setDisplayStatus(false);
        $column_id = $this->input->get('column_id');
        $this->delete();
        $this->defineItem();
        redirect($_SERVER["HTTP_REFERER"]);//调用成功后,返回上一级地址
        exit;
        
    }

 

posted @ 2017-04-10 14:17  等一个人的咖啡  阅读(213)  评论(0)    收藏  举报