微信小程序> 微信订阅号能关联小程序-微信公众号创建自定义菜单(公众号跳转小程序功能)-微信关联小程序

微信订阅号能关联小程序-微信公众号创建自定义菜单(公众号跳转小程序功能)-微信关联小程序

浏览量:2370 时间: 来源:qq_41971087

1.使用JAVA后端去自定义创建菜单,微信公众号开发文档中提供了API:

2.https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013,请大家认真的观看文档的中的信息,

3.创建菜单中有一些要注意的地方:

4.1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。

5.2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

6.3、创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

7.这些可以说是创建菜单中的格式或者是规则,下面是菜单的类型,每个类型代表给他创建的菜单中的功能是不一样的,请认真查看文档

8.创建菜单的接口为:https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN,注意:发送的请求是POST

9.代码实例:

10.HttpUtils.java(发送POST请求):

11.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;

12.importjava.io.IOException;importjava.net.URLDecoder;/***pUser:qrn*pDate:14-1-28*pVersion:1.0*描述:http请求的工具类*/publicclassHttpUtils{privatestaticLoggerlogger=LoggerFactory.getLogger(HttpUtils.class);//日志记录

13./***httpPost**@paramurl路径*@paramjsonParam参数*@returnJSONObject*/publicstaticJSONObjecthttpPost(Stringurl,StringjsonParam){returnhttpPost(url,jsonParam,false);}

14./***post请求**@paramurlurl地址*@paramparam参数*@paramnoNeedResponse不需要返回结果*@returnJSONObject*/publicstaticJSONObjecthttpPost(Stringurl,Stringparam,booleannoNeedResponse){//post请求返回结果HttpClienthttpClient=HttpClients.createDefault();JSONObjectjsonResult=null;HttpPostmethod=newHttpPost(url);try{if(null!=param){//解决中文乱码问题StringEntityentity=newStringEntity(param,"utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");method.setEntity(entity);}HttpResponseresult=httpClient.execute(method);url=URLDecoder.decode(url,"UTF-8");/**请求发送成功,并得到响应**/if(result.getStatusLine().getStatusCode()==200){Stringstr="";try{/**读取服务器返回过来的json字符串数据**/str=EntityUtils.toString(result.getEntity());System.out.println(str);if(noNeedResponse){returnnull;}/**把json字符串转换成json对象**/jsonResult=JSONObject.parseObject(str);}catch(Exceptione){logger.error("post请求提交失败:"+url,e);}}}catch(IOExceptione){logger.error("post请求提交失败:"+url,e);}returnjsonResult;}

15.}

16.创建菜单的方法(SpringMvc):

17./***创建自定义菜单:*/@RequestMapping("/getAccount_txt")@ResponseBodypublicvoidgetAccount_txt(){Stringaccess_token=accountsService.Accountaccess_token();//这里是获取的TOken接口Stringurl=WeChatTools.create+access_token;//这里是创建菜单的接口和token拼接https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_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"+"}";JSONObjectjsonObjects=JSONObject.fromObject(sun);HttpUtils.httpPost(url,jsonObjects.toString());}

18.这样根据自己所需要的去拼写相应的类型就可以实现了

19.下面是进行了封装的创建菜单:Button.java:

20./***菜单:*@authorAdministrator**/publicclassButton{/***菜单名称:*/privateStringname;

21.publicButton(){super();}

22.publicButton(Stringname){super();this.name=name;}

23.publicStringgetName(){returnname;}

24.publicvoidsetName(Stringname){this.name=name;}

25.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((name==null)?0:name.hashCode());returnresult;}

26.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;Buttonother=(Button)obj;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;returntrue;}

27.@OverridepublicStringtoString(){return"Button[name="+name+"]";}}

28.CommonButton.java:

29./***二级菜单(CLICK类型)*@authorAdministrator**/publicclassCommonButtonextendsButton{

30./***菜单名称:*/privateStringname;/***类型*/privateStringtype;/***响应动作类型*/privateStringkey;

31.publicCommonButton(){super();}

32.publicCommonButton(Stringname,Stringtype,Stringkey){super();this.name=name;this.type=type;this.key=key;}

33.publicStringgetName(){returnname;}

34.publicvoidsetName(Stringname){this.name=name;}

35.publicStringgetType(){returntype;}

36.publicvoidsetType(Stringtype){this.type=type;}

37.publicStringgetKey(){returnkey;}

38.publicvoidsetKey(Stringkey){this.key=key;}

39.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((key==null)?0:key.hashCode());result=prime*result+((name==null)?0:name.hashCode());result=prime*result+((type==null)?0:type.hashCode());returnresult;}

40.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;CommonButtonother=(CommonButton)obj;if(key==null){if(other.key!=null)returnfalse;}elseif(!key.equals(other.key))returnfalse;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(type==null){if(other.type!=null)returnfalse;}elseif(!type.equals(other.type))returnfalse;returntrue;}

41.@OverridepublicStringtoString(){return"CommonButton[name="+name+",type="+type+",key="+key+"]";}}

42.ComplexButton.java:

43.importjava.util.Arrays;

44./***一级菜单:*@authorAdministrator**/publicclassComplexButtonextendsButton{/***菜单名称:*/privateStringname;/***子级菜单:*/privateButton[]sub_button;

45.publicComplexButton(){super();}

46.publicComplexButton(Stringname,Button[]sub_button){super();this.name=name;this.sub_button=sub_button;}

47.publicStringgetName(){returnname;}

48.publicvoidsetName(Stringname){this.name=name;}

49.publicButton[]getSub_button(){returnsub_button;}

50.publicvoidsetSub_button(Button[]sub_button){this.sub_button=sub_button;}

51.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((name==null)?0:name.hashCode());result=prime*result+Arrays.hashCode(sub_button);returnresult;}

52.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;ComplexButtonother=(ComplexButton)obj;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(!Arrays.equals(sub_button,other.sub_button))returnfalse;returntrue;}

53.@OverridepublicStringtoString(){return"ComplexButton[name="+name+",sub_button="+Arrays.toString(sub_button)+"]";}}

54.Menu.java:

55.importjava.util.Arrays;

56./***表示要创建的菜单*@authorAdministrator**/publicclassMenu{

57.privateComplexButton[]button;

58.publicMenu(){super();}

59.publicMenu(ComplexButton[]button){super();this.button=button;}

60.publicComplexButton[]getButton(){returnbutton;}

61.publicvoidsetButton(ComplexButton[]button){this.button=button;}

62.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+Arrays.hashCode(button);returnresult;}

63.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;Menuother=(Menu)obj;if(!Arrays.equals(button,other.button))returnfalse;returntrue;}

64.@OverridepublicStringtoString(){return"Menu[button="+Arrays.toString(button)+"]";}

65.}ViewButton.java:

66./***二级菜单:(view)类型:*@authorAdministrator**/publicclassViewButtonextendsButton{/***菜单名称:*/privateStringname;/***类型:*/privateStringtype;/***响应的网页:*/privateStringurl;

67.publicViewButton(){super();}

68.publicViewButton(Stringname,Stringtype,Stringurl){super();this.name=name;this.type=type;this.url=url;}

69.publicStringgetName(){returnname;}

70.publicvoidsetName(Stringname){this.name=name;}

71.publicStringgetType(){returntype;}

72.publicvoidsetType(Stringtype){this.type=type;}

73.publicStringgetUrl(){returnurl;}

74.publicvoidsetUrl(Stringurl){this.url=url;}

75.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((name==null)?0:name.hashCode());result=prime*result+((type==null)?0:type.hashCode());result=prime*result+((url==null)?0:url.hashCode());returnresult;}

76.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;ViewButtonother=(ViewButton)obj;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(type==null){if(other.type!=null)returnfalse;}elseif(!type.equals(other.type))returnfalse;if(url==null){if(other.url!=null)returnfalse;}elseif(!url.equals(other.url))returnfalse;returntrue;}

77.@OverridepublicStringtoString(){return"ViewButton[name="+name+",type="+type+",url="+url+"]";}

78.}

79.MiniprogramButton.java:

80./***跳转到小程序:*@authorAdministrator**/publicclassMiniprogramButtonextendsButton{/***类型:*/privateStringtype;/***名称:*/privateStringname;/***路径:*/privateStringurl;/***小程序appid*/privateStringappid;/***小程序的页面*/privateStringpagepath;publicMiniprogramButton(){super();}

81.publicMiniprogramButton(Stringtype,Stringname,Stringurl,Stringappid,Stringpagepath){super();this.type=type;this.name=name;this.url=url;this.appid=appid;this.pagepath=pagepath;}

82.publicStringgetType(){returntype;}

83.publicvoidsetType(Stringtype){this.type=type;}

84.publicStringgetName(){returnname;}

85.publicvoidsetName(Stringname){this.name=name;}

86.publicStringgetUrl(){returnurl;}

87.publicvoidsetUrl(Stringurl){this.url=url;}

88.publicStringgetAppid(){returnappid;}

89.publicvoidsetAppid(Stringappid){this.appid=appid;}

90.publicStringgetPagepath(){returnpagepath;}

91.publicvoidsetPagepath(Stringpagepath){this.pagepath=pagepath;}

92.@OverridepublicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((appid==null)?0:appid.hashCode());result=prime*result+((name==null)?0:name.hashCode());result=prime*result+((pagepath==null)?0:pagepath.hashCode());result=prime*result+((type==null)?0:type.hashCode());result=prime*result+((url==null)?0:url.hashCode());returnresult;}

93.@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null)returnfalse;if(getClass()!=obj.getClass())returnfalse;MiniprogramButtonother=(MiniprogramButton)obj;if(appid==null){if(other.appid!=null)returnfalse;}elseif(!appid.equals(other.appid))returnfalse;if(name==null){if(other.name!=null)returnfalse;}elseif(!name.equals(other.name))returnfalse;if(pagepath==null){if(other.pagepath!=null)returnfalse;}elseif(!pagepath.equals(other.pagepath))returnfalse;if(type==null){if(other.type!=null)returnfalse;}elseif(!type.equals(other.type))returnfalse;if(url==null){if(other.url!=null)returnfalse;}elseif(!url.equals(other.url))returnfalse;returntrue;}

94.@OverridepublicStringtoString(){return"MiniprogramButton[type="+type+",name="+name+",url="+url+",appid="+appid+",pagepath="+pagepath+"]";}}MenuUtil.java:

95./***菜单工具类:*@authorAdministrator**/publicclassMenuUtil{

96./***封装菜单数据*@return*/publicstaticMenugetMenu(){//创建view类型的菜单ViewButtoncb_4=newViewButton();cb_4.setType("view");cb_4.setName("菜单的名称");cb_4.setUrl("跳转的网页路径");//创建click类型的菜单CommonButtoncb_2=newCommonButton();cb_2.setType("click");cb_2.setName("菜单的名称");cb_2.setKey("xxxxxxx");//创建click类型的菜单CommonButtoncb_3=newCommonButton();cb_3.setType("click");cb_3.setName("菜单的名称");cb_3.setKey("xxxxxxxxxxxx");

97.//创建第一个一级菜单ComplexButtoncx_1=newComplexButton();cx_1.setName("一级菜单名称");cx_1.setSub_button(newButton[]{cb_4,cb_2,cb_3});

98.//创建第二个一级菜单ComplexButtoncx_2=newComplexButton();cx_2.setName("一级菜单名称");//创建公众号跳转到小程序的菜单MiniprogramButtonminiprogramButton=newMiniprogramButton();miniprogramButton.setName("菜单名称");miniprogramButton.setType("miniprogram");miniprogramButton.setAppid("要跳转的小程序APPID");miniprogramButton.setUrl("http://mp.weixin.qq.com");miniprogramButton.setPagepath("小程序要展示的页面路径");cx_2.setSub_button(newButton[]{miniprogramButton});ComplexButtoncx_3=newComplexButton();cx_3.setName("菜单名称");CommonButtoncommonButton=newCommonButton();commonButton.setKey("key3");commonButton.setName("菜单名称");commonButton.setType("click");cx_3.setSub_button(newButton[]{commonButton});//封装菜单数据Menumenu=newMenu();menu.setButton(newComplexButton[]{cx_2,cx_3,cx_1});returnmenu;}}

99./***创建自定义菜单:*/@RequestMapping("/getAccount_txt")@ResponseBodypublicvoidgetAccount_txt(){Stringaccess_token=accountsService.Accountaccess_token();//这里是获取的TOken接口Stringurl=WeChatTools.create+access_token;//这里是创建菜单的接口和token拼接https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKENSystem.out.println("发送的url"+url);Menumenu=MenuUtil.getMenu();JSONObjectjsonObjects=JSONObject.fromObject(menu);HttpUtils.httpPost(url,jsonObjects.toString());}

100.这里就是创建自定义菜单的实例了,这些代码应该是没有问题的,如果有问题可以在下发评论

版权声明

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

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