微信公众号开发之创建自定义菜单数据拼接

在开启微信公众号开发者模式以后,在微信公众号平台设置的自动回复和自定义菜单会失效,所以我们要进行自定义

当然, 产品会让你将这个功能开发成后台功能,想什么时候更改就什么时候更改,多酸爽 

自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单,自定义菜单的接口还包括了可实现10种类型按钮

我们项目基本用于跳转页面,不做推送啥的,所以只用view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL

微信的文档也很酸爽,到底用json还是数组,奇葩啊

{
    "button":[
     {
         "type":"view",
          "name":"官方网站",
          "url":"https://qq52o.me"
      },
      {
          "name":"技术笔记",
           "sub_button":[
           {
               "type":"view",
               "name":"PHP",
               "url":"https://qq52o.me/category/php"
            },
           {
               "type":"view",
               "name":"Python",
               "url":"https://qq52o.me/category/python"
            },
           {
               "type":"view",
               "name":"Linux",
               "url":"https://qq52o.me/category/linux"
            }]
       }]
 }

将就看吧,二级菜单的一级菜单只需要显示名称,多了一个sub_button数组

跳转页面的参数也是唯一的:typenameurl

后台给设置一个CRUD操作就行,添加需要显示的名称,URL,如果是二级的话,还要选择关联一级菜单

// 0 表示为一级菜单
$data = WechatMenu::find()->where(['first_id' => 0])->asArray()->all();
$secMenuData = [];
foreach ($data as $key => $val){
        $secMenuData[$key]['name'] = $val['name'];
        // 有二级菜单的时候 一级不需要链接 留空
        if(empty($val['url'])) {
            // 找二级菜单的信息
            $son = WechatMenu::find()->where(['first_id' => $val['id']])->asArray()->all();
            if(!empty($son)){
                foreach ($son as $k =>  $value) {
                    $secMenuData[$key]['sub_button'][] = [
                        'type' => 'view',
                        'url' => $value['url'],
                        'name' => $value['name'],
                    ];
                }
            }
        }else{
            $secMenuData[$key]['type'] = 'view';
            $secMenuData[$key]['url'] = $val['url'];
        }
}

得到数据以后,转一下json格式,这里要注意一下的是

需要加上json_encode的第二个参数JSON_UNESCAPED_UNICODE

不然会提示errcode":40033,"errmsg":"invalid charset. please check your request, if include \\uxxxx will create错误

原因是把中文自动进行了unicode编码

还要注意外面还有一个button,我们再进行拼接

rsort($secMenuData);
$secMenuData = ['button'=>$secMenuData];
$menuJson = json_encode($secMenuData,JSON_UNESCAPED_UNICODE);
//$menuJson = "{\"button\":".$secMenuData."}";
$wechat = new WeChat(['appId'=>$appid,'appSecret' => $appKey]);
$data = $wechat->setWeChatMenu($menuJson);
if($data['errcode'] == 0){
    Yii::$app->session->setFlash('success','应用微信成功!');
    return $this->redirect(['index']);
}else{
    Yii::$app->session->setFlash('error',$data['errmsg'].'请截图联系技术人员!');
    return $this->redirect(['index']);
}

转义是因为我之前用的单引号,他提示我{"errcode":40016,"errmsg":"invalid button size"},转义之后就正常了

不想拼接的话就在之前拼接为数组,一起进行json_encode就ok了

然后就调用定义的设置微信自定义菜单的方法就ok了

沈唁志|一个PHPer的成长之路! 原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:微信公众号开发之创建自定义菜单数据拼接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DeveWork

通过多说服务器缓存加速Gravatar 头像,解决被墙问题

由于大中华局域网的关系,Gravatar 头像所在的域名gravatar.com 及其二级域常常被墙,就算没有被墙,访问速度也非常慢。之前曾经分享过通过《Wor...

23910
来自专栏Modeng的专栏

Vue CLI 3.0脚手架如何配置mock数据

前后端分离的开发模式已经是目前前端的主流模式,至于为什么会前后端分离的开发我们就不做过多的阐述,既然是前后端分离的模式开发肯定是离不开前端的数据模拟阶段。

2320
来自专栏数据和云

5分钟速成Oracle 12.2 RAC 专家(附ppt下载)

Oracle 12c 在RAC方面提出了很多新的解决方案和特性。这些方案和特性使得Oracle 集群在云和大数据的时代环境下,帮助企业用户上云更具优势。今天我们...

4075
来自专栏jiajia_deng

用于 Windows 下的日志跟踪分析工具(Tail for Windows)

在 Linux 下做开发和调试任务的时候,有些情况会动态去跟踪一些日志的变化来调试问题。Linux 下使用 tail -f 就可以达到需求了,但 Windows...

1062
来自专栏24K纯开源

QT程序在发布的时候应注意的地方

---恢复内容开始---     我们用QT开发好的应用程序,如果要发布到其他计算机上运行怎么办呢?我们在用VC编程时,单独运行编译好的可执行文件时,经常会发现...

2775
来自专栏java一日一条

9 个使用前必须再三小心的 Linux 命令

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

751
来自专栏北京马哥教育

马哥金牌分享 | 十五分钟实现Ansible常用模块入门

本文是马哥教育特约金牌讲师、Linux运维专家魏巍的分享《Anisble常用模块入门指南》的文字整理篇。 朋友们晚上好: 今天我为大家带来的分享是 Ansibl...

4065
来自专栏娱乐心理测试

微信小程序发送模版消息(事例)

5347
来自专栏魏艾斯博客www.vpsss.net

网站目录/绝对路径/相对路径-零基础搭建wordpress教程

网站基本知识包括很多方面,网站结构、网页路径、域名、服务器、建站等等,我们已经写过域名和新手如何选择服务器了,正好最近遇到群友对网站基本知识有些疑问,魏艾斯博客...

4301
来自专栏linux系统运维

linux任务计划, chkconfig工具,systemd管理服务, unit介绍,target介绍

1935

扫码关注云+社区

领取腾讯云代金券