微信个性化菜单开发模式

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

先给几个接口做下分析:

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<weixinMenu> jsonToList(JSONObject obj){

List<weixinMenu> menulist=new ArrayList<weixinMenu>();

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<array.size();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<sub.size();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<weixinMenu> list){

JSONArray array=new JSONArray();

weixinMenu menu=new weixinMenu();

int size=list.size();

for(int i=0;i<size;i++){

menu=list.get(i);

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

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

Map<String,Object> map=new HashMap<String, Object>();

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<size;j++){

submenu=list.get(j);

Map<String,Object> map=null;

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

map=new HashMap<String, Object>();

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<String,Object> map=new HashMap<String, Object>();

map.put("button",array);

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

return (JSONObject)JSONObject.toJSON(map);

}

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

时间: 2024-12-29 09:20:08

微信个性化菜单开发模式的相关文章

微信公众平台开发模式详解图文教程

这部分主要讲解微信公众平台的开发模式,首先说明一下我不是程序员,所以本篇并非讲编程代码之类的,但是由于我们正在开发微信POP营销系统,所以我对开发模式有一定了解,这些了解应该会对准备尝试做微信开发的朋友会有一定帮助,少走部分弯路吧.如果对本篇教程有任何疑问或错漏之处欢迎留言或直接联系我进行更正修改. 微信公众平台开发模式 首先我们要明确开发模式什么可以做,什么不可以做: 一.开发模式可以实现的功能 可以接收用户发送过来的消息,通过你自己开发的系统把对应内容反馈回去.可以接收用户发送过来的地理位置

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

微信公众号开发模式开启总结

一直没想过要开个微信公众号,想到经营公众号估计跟经营微博一样,像我这种素质的,肯定没有这种基因. 师兄推荐了一个学经济的妹纸过来请教我微信公众号开发者模式如何开启,妹纸请教,那必须上刀山下火海哇. 稍作研究了一下,其实并不复杂,妹纸被卡到的地方是输入URL和Token的地方,其实这个URL和Token想明白了还是很容易理解的.微信的开发者模式的意义在于,当订阅者通过菜单栏或者发送消息等方式向公众号发送请求的时候,请求会首先到达微信服务器,然后微信服务器需要把这个请求再转发给开发者自己的网站服务器

微信公众平台-开发模式配置 URL Token

微信公众平台-开发模式配置需要拥有自己的服务器,配置页面有明文:"请填写接口配置信息,此信息需要你拥有自己的服务器资源."  这句话就是说有自己的服务器,独立ip,80端口开放的.并且这台服务器要能提供服务,就是说要能够被微信后台的服务器访问到.这需要服务器有一个外网IP.我们的Web Server监听外网IP的80端口之后就能收到微信后台的请求了. 可能很多读者希望能在自己的PC机上做接入的测试,但是笔者建议不要这么做,因为这可能会遇到很多的麻烦.如果你的确想这么做,请注意以下事情:

微信公众平台开发模式

微信公众平台提供了开发者模式,开启开发者模式的方法入下图 在右侧的工具栏最后一项“开发者中心”.点击进入“开发者中心”,需要配置服务器路径URL,和表示符Token.之后完成申请接入: (1)将微信提供的php文件放到服务器上,下载地址:http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip; (2)确认文件名和配置URL中的文件名一致; (3)修改php文件中define("TOKEN", "weixin&qu

C#开发微信门户及应用(29)--微信个性化菜单的实现

有一段时间没有接着微信的主题继续介绍里面的功能模块了,这段时间来,微信也做了不少的变化改动,针对这些特性我全面核对了一下相关的微信公众号和企业号的接口,对原有的微信API和系统管理做了全面的更新,本随笔以及后面的随笔就是基于这个工作上的总结,以期把微信涉及的功能模块,都使用C#实现的方式来介绍.本随笔主要介绍微信公众号的个性化菜单的实现,虽然目前微信公众号和企业号已经在功能上接近一致,不过在企业号上还没有个性化菜单的相关接口. 1.个性化菜单介绍 我们先了解一下个性化菜单的介绍,根据官方的资料,

php微信自定义菜单开发

微信自定义菜单需要有一个微信服务号,在开发之前需要获取access_token,获取方法很简单,登陆微信公众账号,进入开发者模式,就可以看到{开发者凭据}:下面AppId和AppSecret,开发者文档说明 : 接口调用请求说明 http请求方式: GEThttps://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 参数说明 参数 是否必须 说明 grant

微信个性化菜单

为了帮助公众号实现灵活的业务运营,微信公众平台新增了个性化菜单接口,开发者可以通过该接口,让公众号的不同用户群体看到不一样的自定义菜单.该接口开放给已认证订阅号和已认证服务号.创建个性化菜单的接口如下所示: https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=ACCESS_TOKEN 创建菜单时,需要将菜单内容组织成如下结构,以POST的方式向微信服务器提交. { "button":[ { "t

微信公众平台开发模式 自定义菜单 指南与菜单新建错误代码分析

简介 开发者获取使用凭证(如何获取凭证)后,可以使用该凭证对公众账号的自定义菜单进行创建.查询和删除等操作. 自定义菜单接口可实现以下类型按钮: click(点击事件): 用户点击click类型按钮后,微信服务器会通过消息接口(event类型)推送点击事件给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值进行消息回复. 创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来.建议测试时可以尝试取消关注公众账号后,再次关注,则可以看到创建后的效果. 菜单