微信公众号之自定义菜单

自定义菜单,很嗨皮!

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);

是关键!!!

很有意思!!!

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

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

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

猜你喜欢

转载自www.cnblogs.com/jiqing9006/p/9338677.html