2015-10-09 11:39:26 ZW_KK 阅读数 718
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5686 人正在学习 去看看 秦子恒

微信自定义菜单的创建与使用

需求

当微信公众号设置为开发者模式,想要自己创建和开发菜单的话,就需要自己调用微信创建菜单的接口来创建菜单了。创建菜单之后,如果需要迫切的看到效果,有时候需要取消关注-从新关注才能够看到的哦(缓存问题)。由于新版微信添加的挺多按钮类型,目前只实现click(点击推事件)和view(跳转URL),其他类型的大致相同。
按钮事件描述
注意:公众号必须是认证了的才有这个自定义菜单创建的功能的哦。你可以在自己的公众号->开发者中心,查看是否支持该接口。

菜单类介绍

Buttonx按钮类

    private String name;
    private String type;   //菜单类型 1:点击事件,2:跳转url,3:分组菜单
    private String key;   //菜单key值
    private String url;   //跳转的链接
    private List<Buttonx> sub_button;   //如果是一级菜单,这集合表示二级菜单
    //all get and set  所有字段的get 和 set方法

Menux菜单类

public class Menux {
    private List<Buttonx> button;
    public List<Buttonx> getButton() {
        return button;
    }
    public void setButton(List<Buttonx> button) {
        this.button = button;
    }
}

菜单类包含按钮类(微信最多只能有三个一级菜单哦),按钮类有一级按钮、事件推送按钮、跳转URL按钮,一级按钮可以包含5个二级按钮,5个二级按钮的类型只有事件推送按钮、跳转URL按钮。

场景

如下图公众号菜单:
这里写图片描述
按钮类型:
1.主页:跳转URL按钮
2.主页3:推送事件按钮
3.一级菜单:(如名)

代码

根据菜单分别构建相关的button和menu对象。
如:
主页这个button对象:

        Buttonx btn1 = new Buttonx();
        btn1.setName("主页");
        btn1.setUrl("http://www.csdn.net/");
        btn1.setType("view");

        Buttonx btn2 = new Buttonx();
        btn2.setName("主页3");
        btn2.setKey("KEY_1");
        btn2.setType("click");

        Buttonx btnsub = new Buttonx();
        btnsub.setName("一级菜单");
        Buttonx btn3 = new Buttonx();
        btn3.setName("大家好");
        btn3.setUrl("http://www.baidu.com/");
        btn3.setType("view");

        Buttonx btn4 = new Buttonx();
        btn4.setName("你好");
        btn4.setKey("KEY_1");
        btn4.setType("click");

        btnsub.sub_button.add(btn3);
        btnsub.sub_button.add(btn4);

        Menux menu = new Menux();
        menu.getButton().add(btn1);
        menu.getButton().add(btn2);
        menu.getButton().add(btnsub);

        // 将菜单对象转换成json字符串,利用的是一个jar包,不用自己封装了,也可以自己手动封装
        String jsonMenu = net.sf.json.JSONObject.fromObject(menu).toString();
        // 调用接口创建菜单
        JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);
        if (null != jsonObject) {
                //如果返回的代码不等于0,那么就是说操作的数据不成功
                if (0 != jsonObject.getInt("errcode")) {
                    result = jsonObject.getInt("errcode");
                    log.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
            }
        }

httpRequest(String requestUrl, String requestMethod, String outputStr)方法描述:

/**
     * 发起https请求并获取结果
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */
    public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
            httpUrlConn.setSSLSocketFactory(ssf);

            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            httpUrlConn.setRequestMethod(requestMethod);

            if ("GET".equalsIgnoreCase(requestMethod))
                httpUrlConn.connect();

            // 当有数据需要提交时
            if (null != outputStr) {

                OutputStream outputStream = httpUrlConn.getOutputStream();
                // 注意编码格式,防止中文乱码
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            // 释放资源
            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();

            jsonObject = JSONObject.fromObject(buffer.toString());

        } catch (ConnectException ce) {
            log.error("Weixin server connection timed out.");
        } catch (Exception e) {
            log.error("https request error:{}", e);
        }
        return jsonObject;
    }

总结

执行如果没有出现错误,就代表请求成功了,对应的微信公众号就生成了自定义菜单了。在公众号点击按钮的时候,就会响应对应的事件了。
注意:如果点击的按钮是推送事件的话,那么就需要在自己的系统设置响应的相关内容了。

2018-04-12 20:54:54 xiruiyang 阅读数 289
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5686 人正在学习 去看看 秦子恒

1、自定义菜单最多包括3个一级菜单,一级菜单 最多包括5个二级菜单

2、一级菜单最多4个汉字,二级菜单最多7个汉字

自定义菜单接口可实现多种类型按钮,如下:

1、click:
2、view:
3、scancode_push:
4、scancode_waitmsg:
5、pic_sysphoto:
6、pic_photo_or_album:
7、pic_weixin:
8、location_select:
9、media_id:
10、view_limited:

http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

click和view的请求示例

{
     "button":[
     {    
          "type":"click",
          "name":"今日歌曲",
          "key":"V1001_TODAY_MUSIC"
      },
      {
           "name":"菜单",
           "sub_button":[
           {    
               "type":"view",
               "name":"搜索",
               "url":"http://www.soso.com/"
            },
            {
                 "type":"miniprogram",
                 "name":"wxa",
                 "url":"http://mp.weixin.qq.com",
                 "appid":"wx286b93c14bbf93aa",
                 "pagepath":"pages/lunar/index"
             },
            {
               "type":"click",
               "name":"赞一下我们",
               "key":"V1001_GOOD"
            }]
       }]
 }

2019-07-03 11:19:39 jane_zhang1022 阅读数 523
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5686 人正在学习 去看看 秦子恒

{
    "button": [
        {
            "name": "菜单一",
            "sub_button": [
                {
                    "type": "view",
                    "name": "按钮一",
                    "url": "https://www.baidu.com"
                },
                {
                    "type": "view",
                    "name": "按钮二",
                    "url": "https://www.sougou.com"
                }
            ]
        },
        {
            "name": "菜单二",
            "sub_button": [
                {
                    "type": "view",
                    "name": "菜单一",
                    "url": "http://hao.com"
                },
                {
                    "type": "view",
                    "name": "菜单二",
                    "url": "http://hao.com"
                }
            ]
        },
        {
            "type": "miniprogram",
            "name": "小程序",
            "url": "https://hao.360.com",
            "appid": "APPID",
            "pagepath": "小程序页面路径"
        }
    ]
}

2018-07-26 11:34:25 HD2killers 阅读数 373
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5686 人正在学习 去看看 秦子恒
$data = [
            'button' => [
                0 => [
                    'name' => '商城首页',
                    'url'  => 'http://.html',
                    'type' => 'view',
                ],
                1 => [
                    'name'       => 'App下载',
                    'sub_button' => [
                        0 => [
                            'name' => 'App下载',
                            'url'  => 'http://m',
                            'type' => 'view',
                        ],
                        1 => [
                            'name' => '苹果授信',
                            'type' => 'click',
                            'key'  => 'app_authorization',
                        ],
                        2 => [
                            'name' => '领取优惠券',
                            'type' => 'click',
                            'key'  => 'receive_coupons',
                        ],
                        3 => [
                            'name' => '推广二维码',
                            'type' => 'click',
                            'key'  => 'corcode',
                        ],
                    ],
                ],
                2 => [
                    'name'       => '联系我们',
                    'sub_button' => [
                        0 => [
                            'name' => '运费核算',
                            'type' => 'click',
                            'key'  => 'freight_accounting',
                        ],
                        1 => [
                            'name' => '售后服务',
                            'type' => 'click',
                            'key'  => 'sales_service',
                        ],
                        2 => [
                            'name' => '平台介绍',
                            'type' => 'click',
                            'key'  => 'about',
                        ],
                        3 => [
                            'name' => '添加客服',
                            'type' => 'click',
                            'key'  => 'add_customer',
                        ],
                        4 => [
                            'name' => '联系我们',
                            'type' => 'click',
                            'key'  => 'contact_us',
                        ],
                    ],
                ],
            ],
        ];
        $res = $weObj->createMenu($data);
2018-02-28 13:58:16 fengyan5022 阅读数 616
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5686 人正在学习 去看看 秦子恒

1 方式一:不写代码,使用微信公众平台接口调试工具来创建菜单

{

    "button": [

        {

            "name": "百度", 

            "type": "view", 

            "url": "http://www.baidu.com"

        }, 

        {

            "name": "菜单", 

            "sub_button": [

                {

                    "key": "text", 

                    "name": "回复图文", 

                    "type": "click"

                }, 

                {

                    "name": "百度", 

                    "type": "view", 

                    "url": "http://www.baidu.com"

                }

            ]

        }, 

        {

            "key": "text", 

            "name": "回复图文", 

            "type": "click"

        }

    ]

}

2 方式二:写代码创建菜单

ViewButton


package com.iris.wechat.menu;
/**
 * 视图型菜单事件
 * @author ifeng
 *
 */
public class ViewButton {
	
    private String type;
    private String name;
    private String url;
    
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
  
}

ClickButton


package com.iris.wechat.menu;

public class ClickButton {
  private String type;
  private String name;
  private String key;
  public String getType() {
	return type;
  }
  public void setType(String type) {
	this.type = type;
  }
  public String getName() {
	return name;
  }
  public void setName(String name) {
	this.name = name;
  }
  public String getKey() {
	return key;
  }
  public void setKey(String key) {
	this.key = key;
  }
    
}


CreateMenu

package com.iris.wechat.menu;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class CreateMenu {
	public static void main(String[] args){
		
	String accessToken = null;
	 try {
		accessToken = AccessToken.getAccessToken();	
	} catch (Exception e) {
		System.out.println("fail to get AccessToken");
	}
	
	if (accessToken !=null ){
		ClickButton cbt=new ClickButton();
        cbt.setKey("image");
        cbt.setName("回复图片1");
        cbt.setType("click");
         
         
        ViewButton vbt=new ViewButton();
        vbt.setUrl("http://irisfeng.natapp1.cc/WechatValidation/toSAP.action");
        vbt.setName("ToSAP");
        vbt.setType("view");
         
        JSONArray sub_button=new JSONArray();
        sub_button.put(cbt);
        sub_button.put(vbt);
         
         
        JSONObject buttonOne=new JSONObject();
        buttonOne.put("name", "菜单");
        buttonOne.put("sub_button", sub_button);
         
        JSONArray button=new JSONArray();
        button.put(vbt);
        button.put(buttonOne);
        button.put(cbt);
         
        JSONObject menujson=new JSONObject();
        menujson.put("button", button);
        System.out.println(menujson);
        
        String postURL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+accessToken;
        try {
		  URL url = new URL(postURL);
	      HttpURLConnection connection = (HttpURLConnection)url.openConnection();
			
	      connection.setRequestMethod("POST");
	      connection.setDoOutput(true);
	      connection.setDoInput(true);
	      connection.connect();
	
	      OutputStream outputStream = connection.getOutputStream();
	      outputStream.write(menujson.toString().getBytes("UTF-8"));
	      outputStream.flush();
	      outputStream.close();
	
	      InputStream inputStream = connection.getInputStream();
	      int size =inputStream.available();
	      byte[] bs =new byte[size];
	      inputStream.read(bs);
	      String message=new String(bs,"UTF-8");
	
	      System.out.println("message="+message);
		} catch (MalformedURLException e) {
					e.printStackTrace();
		} catch (IOException e) {
		
			e.printStackTrace();
		}

	}
	
	}
	
	
//	public static String getMenuStr() throws JSONException{
//        JSONObject firstLevelMenu = JSONObject.fromObject("");//一级菜单
//        JSONArray firstLevelMenuArray = new JSONArray();//一级菜单列表
//
//
//        //一级菜单内容1
//        JSONObject firstLevelMenuContext1 = new JSONObject();
//        firstLevelMenuContext1.put("type", "click");
//        firstLevelMenuContext1.put("name", "歌曲");
//        firstLevelMenuContext1.put("key", "V1001_TODAY_MUSIC");
//
//        //一级菜单内容2
//        JSONObject firstLevelMenuContext2 = new JSONObject();
//        //一级菜单内容2的二级菜单列表
//        JSONArray firstLevelMenuContext2Array = new JSONArray();
//        //一级菜单内容2的二级菜单内容1
//        JSONObject jsonObject1 = new JSONObject();
//        jsonObject1.put("type", "click");
//        jsonObject1.put("name", "歌曲");
//        jsonObject1.put("key", "V1001_TODAY_MUSIC");
//        //一级菜单内容2的二级菜单内容2
//        JSONObject jsonObject2 = new JSONObject();
//        jsonObject2.put("type", "view");
//        jsonObject2.put("name", "视频");
//        jsonObject2.put("url", "http://www.randzh.cn");
//        firstLevelMenuContext2Array.put(jsonObject1);
//        firstLevelMenuContext2Array.put(jsonObject2);
//        firstLevelMenuContext2.put("name", "菜单");
//        firstLevelMenuContext2.put("sub_button", firstLevelMenuContext2Array);
//
//        //一级菜单内容3
//        JSONObject firstLevelMenuContext3 = new JSONObject();
//        firstLevelMenuContext3.put("type", "click");
//        firstLevelMenuContext3.put("name", "视频");
//        firstLevelMenuContext3.put("key", "V1001_TODAY_MOVIE");
//
//
//        firstLevelMenuArray.put(firstLevelMenuContext1);
//        firstLevelMenuArray.put(firstLevelMenuContext2);
//        firstLevelMenuArray.put(firstLevelMenuContext1);
//
//
//        firstLevelMenu.put("button", firstLevelMenuArray);
//       
//        String str = firstLevelMenu.toString();
//        System.out.println("JSON str="+str);
//        return str;
//    }
//	
//	public static void createCustomMenu() throws Exception{
//        String custmMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";
//
//        //获取access_token
//        String accessToken = AccessToken.getAccessToken();
//        custmMenuUrl = custmMenuUrl + accessToken;
//        System.out.println("===custmMenuUrl="+custmMenuUrl);
//        
//        URL url = new URL(custmMenuUrl);
//        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//
//        connection.setRequestMethod("POST");
//        connection.setDoOutput(true);
//        connection.setDoInput(true);
//        connection.connect();
//
//        OutputStream outputStream = connection.getOutputStream();
//        outputStream.write(getMenuStr().getBytes("UTF-8"));
//        outputStream.flush();
//        outputStream.close();
//
//        InputStream inputStream = connection.getInputStream();
//        int size =inputStream.available();
//        byte[] bs =new byte[size];
//        inputStream.read(bs);
//        String message=new String(bs,"UTF-8");
//
//        System.out.println("message="+message);
//}
}

微信菜单创建

阅读数 4

没有更多推荐了,返回首页