zoukankan      html  css  js  c++  java
  • 微信公众号之自定义菜单

    自定义菜单,很嗨皮!

    https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013

    需要json传递数据!

    微信提供三个接口,一个是创建菜单,一个是查看菜单,一个是删除菜单!

    <?php
    /**
     * Created by PhpStorm.
     * User: jiqing
     * Date: 18-7-19
     * Time: 下午9:15
     */
    
    class MenuAction extends BaseAction
    {
        // 创建自定义菜单
        const API_CREATE_MENU = 'https://api.weixin.qq.com/cgi-bin/menu/create';
        // 查询自定义菜单
        const API_GET_MENU = 'https://api.weixin.qq.com/cgi-bin/menu/get';
        // 删除自定义菜单
        const API_DELETE_MENU = 'https://api.weixin.qq.com/cgi-bin/menu/delete';
    
        public function create() {
            $access_token = $this->_get_access_token();
            $uri = self::API_CREATE_MENU.'?access_token='.$access_token;
    
            $params = [
                'button' => [
                    [
                       'type'=>'click',
                       'name'=>'今日歌曲',
                       'key'=>'V1001_TODAY_MUSIC'
                    ],
                    [
                        'name'=> '菜单',
                        'sub_button' => [
                            [
                                'type' => 'view',
                                'name' => '百度',
                                'url' => 'http://www.baidu.com/'
                            ],
                            [
                                'type' => 'view',
                                'name' => 'Bing',
                                'url' => 'http://www.bing.com/'
                            ],
                            [
                                'type' => 'view',
                                'name' => '搜搜',
                                'url' => 'http://www.soso.com/'
                            ],
                        ]
                    ]
                ]
            ];
    
            $res_data = Http::doPostJson($uri, $params);
            vendor("Log.Clog");
            Clog::setLog($res_data);
            $res_data = json_decode($res_data, true);
            if ($res_data['errcode'] != 0) {
                $this->ajaxReturn($this->jsonError(10001, '接口请求失败'));
            }
    
            $this->ajaxReturn($this->jsonSuccess(1, '成功', $res_data));
        }
    
        public function get() {
            $access_token = $this->_get_access_token();
            $params = [
                'access_token' => $access_token
            ];
            $res_data = Http::newDoGet(self::API_GET_MENU, $params);
            $res_data = json_decode($res_data, true);
            if ($res_data['errcode'] != 0) {
                $this->ajaxReturn($this->jsonError(10001, '接口请求失败'));
            }
    
            $this->ajaxReturn($this->jsonSuccess(1, '成功', $res_data));
        }
    
        public function delete() {
            $access_token = $this->_get_access_token();
            $params = [
                'access_token' => $access_token
            ];
            $res_data = Http::newDoGet(self::API_DELETE_MENU, $params);
            $res_data = json_decode($res_data, true);
            if ($res_data['errcode'] != 0) {
                $this->ajaxReturn($this->jsonError(10001, '接口请求失败'));
            }
    
            $this->ajaxReturn($this->jsonSuccess(1, '成功', $res_data));
        }
    
    
        private function _get_access_token() {
            vendor('Func.Http');
    
            if (preg_match('/(http://)|(https://)/i', C('SELF_HOSTNAME'))) {
                $uri = C('SELF_HOSTNAME').'/AccessToken/get';
            } else {
                $uri = 'http://'.C('SELF_HOSTNAME').'/AccessToken/get';
            }
    
            // 获取access_token
            $access_token_result = Http::doGet($uri);
            $access_token_result = json_decode($access_token_result, true);
            $access_token = $access_token_result['data']['access_token'];
    
            return $access_token;
        }
    }
    

    创建的时候会失败!

    // 通过POST方式发送json数据
    static public function doPostJson($url = '', $param = [] ,$contentType = 'json') {
            $ch = curl_init();
            // 请求地址
            curl_setopt($ch, CURLOPT_URL, $url);
            // 请求参数类型
            $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param);
            // 关闭https验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            // post提交
            if($param){
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
            }
            // 返回的数据是否自动显示
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            // 执行并接收响应结果
            $output = curl_exec($ch);
            // 关闭curl
            curl_close($ch);
            return $output !== false ? $output : false;
    }
    

    这里的

     $param = $contentType == 'json' ? urldecode(json_encode($param,JSON_UNESCAPED_UNICODE)) : http_build_query($param);
    

    是关键!!!

    很有意思!!!

    可以结合自动回复来实现更加复杂的功能!!!

    菜单还可以跳转到小程序!!!

    模板消息也可以跳转到小程序!!!

    再来一个小案例,

    $params = [
        'button' => [
            [
                'name'=> '从"新"出发',
                'sub_button' => [
                    [
                        'type' => 'view',
                        'name' => '甜蜜新品',
                        'url' => 'http://www.breadtalk.com.cn/'
                    ],
                    [
                        'type' => 'view',
                        'name' => '送!月饼券',
                        'url' => 'http://www.breadtalk.com.cn/'
                    ],
                    [
                        'type' => 'view',
                        'name' => '新语之旅',
                        'url' => 'http://www.breadtalk.com.cn/'
                    ]
                ]
            ],
            [
                'type'=>'miniprogram',
                'name'=>'甜蜜商城',
                'url'=>'http://mp.weixin.qq.com',
                'appid'=>'xxx',
                'pagepath'=>'pages/index/index'
            ],
            [
                'name'=> '我的新语',
                'sub_button' => [
                    [
                        'type'=>'miniprogram',
                        'name'=>'我的订单',
                        'url'=>'http://mp.weixin.qq.com',
                        'appid'=>'xxx',
                        'pagepath'=>'pages/order/index'
                    ],
                    [
                        'type'=>'miniprogram',
                        'name'=>'优惠券',
                        'url'=>'http://mp.weixin.qq.com',
                        'appid'=>'xxx',
                        'pagepath'=>'pages/coupon/my_coupon'
                    ],
                    [
                        'type'=>'miniprogram',
                        'name'=>'会员充值',
                        'url'=>'http://mp.weixin.qq.com',
                        'appid'=>'xxx',
                        'pagepath'=>'pages/balance/add_balance'
                    ]
                ]
            ]
        ]
    ];
    
  • 相关阅读:
    CSS浏览器兼容性问题集()两
    HTML5 Introduction
    poj 2449 Remmarguts&#39; Date 【SPFA+Astar】【古典】
    LwIP学习笔记——STM32 ENC28J60移植与入门
    在四川大学的第二个冠军游戏在线编程:Peter的X
    ArcEngine下一个TIN生成的轮廓
    精彩理发头盔
    UBUNTU如何改变mysql默认文件夹数据文件夹
    第一章 词汇陷阱
    LINUX2.4.x网络安全框架
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/9338677.html
Copyright © 2011-2022 走看看