1.使用JAVA后端去自定义创建菜单,微信公众号开发文档中提供了API:
2.https://mp.weixin.qq.com/wiki?tresource/res_mainidmp1421141013,请大家认真的观看文档的中的信息,
3.创建菜单中有一些要注意的地方:
4.1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。
5.2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“…”代替。
6.3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
7.这些可以说是创建菜单中的格式或者是规则,下面是菜单的类型,每个类型代表给他创建的菜单中的功能是不一样的,请认真查看文档代码实例:HttpUtils.java(发送POST请求):
importcom.alibaba.fastjson.JSONObject;importorg.apache.http.HttpResponse;importorg.apache.http.HttpStatus;importorg.apache.http.client.HttpClient;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.net.URLDecoder;/***pUser:qrn*pDate:14-1-28*pVersion:1.0*描述:http请求的工具类*/publicclassHttpUtils{privatestaticLoggerloggerLoggerFactory.getLogger(HttpUtils.class);//日志记录/***httpPost**@paramurl路径*@paramjsonParam参数*@returnJSONObject*/publicstaticJSONObjecthttpPost(Stringurl,StringjsonParam){returnhttpPost(url,jsonParam,false);}/***post请求**@paramurlurl地址*@paramparam参数*@paramnoNeedResponse不需要返回结果*@returnJSONObject*/publicstaticJSONObjecthttpPost(Stringurl,Stringparam,booleannoNeedResponse){//post请求返回结果HttpClienthttpClientHttpClients.createDefault();JSONObjectjsonResultnull;HttpPostmethodnewHttpPost(url);try{if(null!param){//解决中文乱码问题StringEntityentitynewStringEntity(param,"utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");method.setEntity(entity);}HttpResponseresulthttpClient.execute(method);urlURLDecoder.decode(url,"UTF-8");/**请求发送成功,并得到响应**/if(result.getStatusLine().getStatusCode()200){Stringstr"";try{/**读取服务器返回过来的json字符串数据**/strEntityUtils.toString(result.getEntity());System.out.println(str);if(noNeedResponse){returnnull;}/**把json字符串转换成json对象**/jsonResultJSONObject.parseObject(str);}catch(Exceptione){logger.error("post请求提交失败:"+url,e);}}}catch(IOExceptione){logger.error("post请求提交失败:"+url,e);}returnjsonResult;}}8.创建菜单的方法(SpringMvc):
/***创建自定义菜单:*/@RequestMapping("/getAccount_txt")@ResponseBodypublicvoidgetAccount_txt(){Stringaccess_tokenaccountsService.Accountaccess_token();//这里是获取的TOken接口StringurlWeChatTools.create+access_token;//这里是创建菜单的接口和token拼接https://api.weixin.qq.com/cgi-bin/menu/create?access_tokenACCESS_TOKENSystem.out.println("发送的url"+url);Stringsun"{r"+""button":[r"+"{r"+""type":"click",r"+""name":"今日歌曲",r"+""key":"V1001_TODAY_MUSIC"r"+"},r"+"{r"+""name":"菜单",r"+""sub_button":[r"+"{r"+""type":"view",r"+""name":"搜索",r"+""url":"http://www.soso.com/"r"+"},r"+"{r"+""type":"miniprogram",r"+""name":"wxa",r"+""url":"http://mp.weixin.qq.com",r"+""appid":"wx286b93c14bbf93aa",r"+""pagepath":"pages/lunar/index"r"+"},r"+"{r"+""type":"click",r"+""name":"赞一下我们",r"+""key":"V1001_GOOD"r"+"}]r"+"}]r"+"}";JSONObjectjsonObjectsJSONObject.fromObject(sun);HttpUtils.httpPost(url,jsonObjects.toString());}9.这样根据自己所需要的去拼写相应的类型就可以实现了下面是进行了封装的创建菜单:Button.java:
/***菜单:*@authorAdministrator**/publicclassButton{/***菜单名称:*/privateStringname;publicButton(){super();}publicButton(Stringname){super();this.namename;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+((namenull)?0:name.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;Buttonother(Button)obj;if(namenull){if(other.name!null)returnfalse;}elseif(!name.equals(other.name))returnfalse;returntrue;}@OverridepublicStringtoString(){return"Button[name"+name+"]";}}10.CommonButton.java:
/***二级菜单(CLICK类型)*@authorAdministrator**/publicclassCommonButtonextendsButton{/***菜单名称:*/privateStringname;/***类型*/privateStringtype;/***响应动作类型*/privateStringkey;publicCommonButton(){super();}publicCommonButton(Stringname,Stringtype,Stringkey){super();this.namename;this.typetype;this.keykey;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.typetype;}publicStringgetKey(){returnkey;}publicvoidsetKey(Stringkey){this.keykey;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+((keynull)?0:key.hashCode());resultprime*result+((namenull)?0:name.hashCode());resultprime*result+((typenull)?0:type.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;CommonButtonother(CommonButton)obj;if(keynull){if(other.key!null)returnfalse;}elseif(!key.equals(other.key))returnfalse;if(namenull){if(other.name!null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(typenull){if(other.type!null)returnfalse;}elseif(!type.equals(other.type))returnfalse;returntrue;}@OverridepublicStringtoString(){return"CommonButton[name"+name+",type"+type+",key"+key+"]";}}11.ComplexButton.java:
importjava.util.Arrays;/***一级菜单:*@authorAdministrator**/publicclassComplexButtonextendsButton{/***菜单名称:*/privateStringname;/***子级菜单:*/privateButton[]sub_button;publicComplexButton(){super();}publicComplexButton(Stringname,Button[]sub_button){super();this.namename;this.sub_buttonsub_button;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicButton[]getSub_button(){returnsub_button;}publicvoidsetSub_button(Button[]sub_button){this.sub_buttonsub_button;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+((namenull)?0:name.hashCode());resultprime*result+Arrays.hashCode(sub_button);returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;ComplexButtonother(ComplexButton)obj;if(namenull){if(other.name!null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(!Arrays.equals(sub_button,other.sub_button))returnfalse;returntrue;}@OverridepublicStringtoString(){return"ComplexButton[name"+name+",sub_button"+Arrays.toString(sub_button)+"]";}}12.Menu.java:
importjava.util.Arrays;/***表示要创建的菜单*@authorAdministrator**/publicclassMenu{privateComplexButton[]button;publicMenu(){super();}publicMenu(ComplexButton[]button){super();this.buttonbutton;}publicComplexButton[]getButton(){returnbutton;}publicvoidsetButton(ComplexButton[]button){this.buttonbutton;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+Arrays.hashCode(button);returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;Menuother(Menu)obj;if(!Arrays.equals(button,other.button))returnfalse;returntrue;}@OverridepublicStringtoString(){return"Menu[button"+Arrays.toString(button)+"]";}}13.ViewButton.java:
/***二级菜单:(view)类型:*@authorAdministrator**/publicclassViewButtonextendsButton{/***菜单名称:*/privateStringname;/***类型:*/privateStringtype;/***响应的网页:*/privateStringurl;publicViewButton(){super();}publicViewButton(Stringname,Stringtype,Stringurl){super();this.namename;this.typetype;this.urlurl;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.typetype;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.urlurl;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+((namenull)?0:name.hashCode());resultprime*result+((typenull)?0:type.hashCode());resultprime*result+((urlnull)?0:url.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;ViewButtonother(ViewButton)obj;if(namenull){if(other.name!null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(typenull){if(other.type!null)returnfalse;}elseif(!type.equals(other.type))returnfalse;if(urlnull){if(other.url!null)returnfalse;}elseif(!url.equals(other.url))returnfalse;returntrue;}@OverridepublicStringtoString(){return"ViewButton[name"+name+",type"+type+",url"+url+"]";}}14.MiniprogramButton.java:
/***跳转到小程序:*@authorAdministrator**/publicclassMiniprogramButtonextendsButton{/***类型:*/privateStringtype;/***名称:*/privateStringname;/***路径:*/privateStringurl;/***小程序appid*/privateStringappid;/***小程序的页面*/privateStringpagepath;publicMiniprogramButton(){super();}publicMiniprogramButton(Stringtype,Stringname,Stringurl,Stringappid,Stringpagepath){super();this.typetype;this.namename;this.urlurl;this.appidappid;this.pagepathpagepath;}publicStringgetType(){returntype;}publicvoidsetType(Stringtype){this.typetype;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this.urlurl;}publicStringgetAppid(){returnappid;}publicvoidsetAppid(Stringappid){this.appidappid;}publicStringgetPagepath(){returnpagepath;}publicvoidsetPagepath(Stringpagepath){this.pagepathpagepath;}@OverridepublicinthashCode(){finalintprime31;intresult1;resultprime*result+((appidnull)?0:appid.hashCode());resultprime*result+((namenull)?0:name.hashCode());resultprime*result+((pagepathnull)?0:pagepath.hashCode());resultprime*result+((typenull)?0:type.hashCode());resultprime*result+((urlnull)?0:url.hashCode());returnresult;}@Overridepublicbooleanequals(Objectobj){if(thisobj)returntrue;if(objnull)returnfalse;if(getClass()!obj.getClass())returnfalse;MiniprogramButtonother(MiniprogramButton)obj;if(appidnull){if(other.appid!null)returnfalse;}elseif(!appid.equals(other.appid))returnfalse;if(namenull){if(other.name!null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(pagepathnull){if(other.pagepath!null)returnfalse;}elseif(!pagepath.equals(other.pagepath))returnfalse;if(typenull){if(other.type!null)returnfalse;}elseif(!type.equals(other.type))returnfalse;if(urlnull){if(other.url!null)returnfalse;}elseif(!url.equals(other.url))returnfalse;returntrue;}@OverridepublicStringtoString(){return"MiniprogramButton[type"+type+",name"+name+",url"+url+",appid"+appid+",pagepath"+pagepath+"]";}}15.MenuUtil.java:
/***菜单工具类:*@authorAdministrator**/publicclassMenuUtil{/***封装菜单数据*@return*/publicstaticMenugetMenu(){//创建view类型的菜单ViewButtoncb_4newViewButton();cb_4.setType("view");cb_4.setName("菜单的名称");cb_4.setUrl("跳转的网页路径");//创建click类型的菜单CommonButtoncb_2newCommonButton();cb_2.setType("click");cb_2.setName("菜单的名称");cb_2.setKey("xxxxxxx");//创建click类型的菜单CommonButtoncb_3newCommonButton();cb_3.setType("click");cb_3.setName("菜单的名称");cb_3.setKey("xxxxxxxxxxxx");//创建第一个一级菜单ComplexButtoncx_1newComplexButton();cx_1.setName("一级菜单名称");cx_1.setSub_button(newButton[]{cb_4,cb_2,cb_3});//创建第二个一级菜单ComplexButtoncx_2newComplexButton();cx_2.setName("一级菜单名称");//创建公众号跳转到小程序的菜单MiniprogramButtonminiprogramButtonnewMiniprogramButton();miniprogramButton.setName("菜单名称");miniprogramButton.setType("miniprogram");miniprogramButton.setAppid("要跳转的小程序APPID");miniprogramButton.setUrl("http://mp.weixin.qq.com");miniprogramButton.setPagepath("小程序要展示的页面路径");cx_2.setSub_button(newButton[]{miniprogramButton});ComplexButtoncx_3newComplexButton();cx_3.setName("菜单名称");CommonButtoncommonButtonnewCommonButton();commonButton.setKey("key3");commonButton.setName("菜单名称");commonButton.setType("click");cx_3.setSub_button(newButton[]{commonButton});//封装菜单数据MenumenunewMenu();menu.setButton(newComplexButton[]{cx_2,cx_3,cx_1});returnmenu;}}/***创建自定义菜单:*/@RequestMapping("/getAccount_txt")@ResponseBodypublicvoidgetAccount_txt(){Stringaccess_tokenaccountsService.Accountaccess_token();//这里是获取的TOken接口StringurlWeChatTools.create+access_token;//这里是创建菜单的接口和token拼接https://api.weixin.qq.com/cgi-bin/menu/create?access_tokenACCESS_TOKENSystem.out.println("发送的url"+url);MenumenuMenuUtil.getMenu();JSONObjectjsonObjectsJSONObject.fromObject(menu);HttpUtils.httpPost(url,jsonObjects.toString());}16.这里就是创建自定义菜单的实例了,这些代码应该是没有问题的,这里说一下,可能这些文档是去年的时候我写的,现在可能已经被改了,自己去微信官方去查下文档,还有就是之前的账号被封了,那个账号不会在登录,以后就是这个账号,哪里的文章我也会迁移到这里,有什么问题可以就加群:
微信公众号创建自定义菜单公众号跳转小程序功能-小程序怎么放到公众号菜单里-公众号菜单链接小程序
浏览量:1363
时间:
来源:qrn196789910
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。










