热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章详解微信个性化菜单开发模式
最近一个礼拜搞了一个微信自定义菜单的开发,总的来说蛮郁闷的。

先给几个接口做下分析:

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

}

}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,之后的操作就要简便很多了。

以上就是详解微信个性化菜单开发模式的详细内容,更多请关注php中文网其它相关文章!


推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
rui1大姑娘_939
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有