微信小程序> 微信公众号创建自定义菜单公众号跳转小程序功能-小程序怎么放到公众号菜单里-公众号菜单链接小程序

微信公众号创建自定义菜单公众号跳转小程序功能-小程序怎么放到公众号菜单里-公众号菜单链接小程序

浏览量:1250 时间: 来源:qrn196789910
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.

这里就是创建自定义菜单的实例了,这些代码应该是没有问题的,这里说一下,可能这些文档是去年的时候我写的,现在可能已经被改了,自己去微信官方去查下文档,还有就是之前的账号被封了,那个账号不会在登录,以后就是这个账号,哪里的文章我也会迁移到这里,有什么问题可以就加群:

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎