0

0

详解微信个性化菜单开发模式

高洛峰

高洛峰

发布时间:2017-03-22 16:15:06

|

1764人浏览过

|

来源于php中文网

原创

    最近一个礼拜搞了一个微信自定义菜单的开发,总的来说蛮郁闷的。

    先给几个接口做下分析:

    1:查询接口;查询接口分为两个,一个是开发模式下的普通查询接口,他只会查询出你通过添加接口创建出来的菜单和个性化的菜单(让公众号的不同用户群体看到不一样的自定义菜单),而不能获取到你通过微信管理平台添加的菜单。还有一个是可以查询全部菜单的接口,这个接口有点蛋疼,如果你先在平台上添加一个菜单,然后后台调用这个接口就可以获取到这个菜单,但调用这个接口的返回的json跟添加时的格式是不一样的(就是说你把它发回给你的json原模原样传给微信去创建菜单是创建不了的),而且微信平台上添加的菜单有很多种,每一种返回的json格式都是不一样的,如果要解析的话是很麻烦的一件事,所以个人觉得既然选择了开发者模式那么还是使用普通的那个查询接口比较好。

    2:创建接口;这个接口的作用,顾名思义就是创建接口,但是这个接口不是在原来的基础上创建,而是把全部的菜单全部重新创建,每次调用都是把你需要留下来的菜单加工成固定格式的json然后去传给微信,所以如果你想单个删除,那你就把想要删除的那个菜单去掉,把剩下的重新变成一个json,修改也一样,把你需要改的数据替换掉,然后把全部菜单变成一个json传给微信。

    3:删除接口;这个接口是用来删除全部菜单时候用的,不过不会立即生效,调用以后,貌似要到第二天才能看到效果,而且这段时间内你还是能够查询到你之前创建了的菜单。

    我的任务是把菜单的增删改查整合到后台管理中去,这里只说下自己的后台的出来方式,请求微信的接口返回的是一个json字符串,我的做法是把这个字符串解析出来,按一定的规则写成一个对象然后添加到list中,增删改的时候都去操作这个list,然后在把list转换回微信要求的格式的json,调用微信的接口去创建菜单(增删改都调用创建接口)。对象部分我的属性分别是id(把list的下标设置为id方便操作),name(菜单名称),type(菜单类型,微信自定义菜单的种类有10种貌似),parent(父级菜单名称),SecendLvMenu(二级菜单个数),url(链接型菜单需要),key(调用推送功能),mediaid(

调用素材时都要设置madia_id),sort(排序号)。

以下为json转list的代码,此处的json包是阿里的fastjson包,相当好用:

public static List jsonToList(JSONObject obj){

List menulist=new ArrayList();

obj=obj.getJSONObject("menu");

JSONObject a=new JSONObject();

int num=0;

if(obj!=null){

//获取button的json数组

JSONArray array=obj.getJSONArray("button");

if(array!=null){

for(int i=0;i

a=array.getJSONObject(i);

//没有类型说明是带二级菜单类型的一级菜单

if(a.get("type")==null){

weixinMenu menu=new weixinMenu();

menu.setId(num);

menu.setSort(num);

num++;

menu.setName(a.getString("name"));//设置下标设置排序号存入list 

//获取该一级菜单下的二级菜单

JSONArray sub=a.getJSONArray("sub_button");

//二级菜单的个数,由于二级菜单上限为5个,加一个个数添加时候容易判断

menu.setSecendLvMenuNum(sub.size());

menulist.add(menu);

JSONObject b=new JSONObject();

for(int j=0;j

weixinMenu menu2=new weixinMenu();

b=sub.getJSONObject(j);

menu2.setId(num);

menu2.setSort(num);

num++;

menu2.setName(b.getString("name"));

menu2.setParent(a.getString("name"));//父级菜单就是刚才的一级菜单名称

menu2.setType(b.getString("type"));

menu2.setUrl(b.getString("url"));

menu2.setKey(b.getString("key"));

menu2.setMediaId(b.getString("media_id"));

menulist.add(menu2);

}

网亚Net!B2B
网亚Net!B2B

网亚Net!B2B从企业信息化服务的整体解决方案上提供了实用性的电子商务建站部署,企业无需进行复杂的网站开发,直接使用Net!B2B系列,就能轻松构建具有竞争力的行业门户网站,如果您有特殊需要,系统内置的模板体系和接口体系,让网站可以按照自己的个性要求衍生出庞大的门户服务需求,网亚Net!B2B电子商务建站系统可以让您以希望的方式开展网上服务,无论是为您的客户提供信息服务,新闻服务,产品展示与产品

下载

}else{//否则为无二级菜单的一级菜单,点击直接跳转或触发相应事件

weixinMenu menu=new weixinMenu();

menu.setId(num);

menu.setSort(num);

num++;

menu.setName(a.getString("name"));

menu.setParent(null);

menu.setSecendLvMenuNum(0);

menu.setType(a.getString("type"));

menu.setUrl(a.getString("url"));

menu.setKey(a.getString("key"));

menu.setMediaId(a.getString("media_id"));

menulist.add(menu);

}

}

}

}

return menulist;

}

然后是list转weixinJson,上传微信的json只需要button部分:

public static JSONObject listToWxJson(List list){

JSONArray array=new JSONArray();

weixinMenu menu=new weixinMenu();

int size=list.size();

for(int i=0;i

menu=list.get(i);

//无二级菜单,无父级菜单,则为无二级类型一级菜单

if(menu.getSecendLvMenuNum()==0&&menu.getParent()==null){

Map map=new HashMap();

map.put("name", menu.getName());

map.put("type", menu.getType());

if(menu.getUrl()!=null){

map.put("url", menu.getUrl());

}

if(menu.getKey()!=null){

map.put("key", menu.getKey());

}

if(menu.getMediaId()!=null){

map.put("media_id", menu.getMediaId());

}

array.add(map);

}else if(menu.getParent()==null){无父级菜单则为带二级一级菜单

JSONObject obj=new JSONObject();

JSONArray sub=new JSONArray();

obj.put("name",menu.getName());

weixinMenu submenu=new weixinMenu();

//循环遍历整个list用name匹配查找该一级菜单下的二级菜单

for(int j=0;j

submenu=list.get(j);

Map map=null;

if((menu.getName()).equals(submenu.getParent())){

map=new HashMap();

map.put("name", submenu.getName());

map.put("type", submenu.getType());

if(submenu.getUrl()!=null){

map.put("url", submenu.getUrl());

}

if(submenu.getKey()!=null){

map.put("key", submenu.getKey());

}

if(submenu.getMediaId()!=null){

map.put("media_id", submenu.getMediaId());

}

sub.add(map);

}

}

obj.put("sub_button",sub);

array.add(obj);

}

}

Map map=new HashMap();

map.put("button",array);

//最后直接把map转换成json

return (JSONObject)JSONObject.toJSON(map);

}

这一套基本算的固定的了,微信菜单返回过来都可以解析成list,操作完后在转换json,之后的操作就要简便很多了。

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.9万人学习

Rust 教程
Rust 教程

共28课时 | 5.1万人学习

Vue 教程
Vue 教程

共42课时 | 7.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号