微信开发之自定义菜单

自定义菜单的 http请求方式:POST  https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN。 正确时的返回JSON数据包如下:
{"errcode":0,"errmsg":"ok"}

错误时的返回JSON数据包如下(示例为无效菜单名长度):

{"errcode":40018,"errmsg":"invalid button name size"}

我们在编写代码时,借用了LaneWeChat框架,很好的封装了各种方法,方便使用。

每次定义菜单时,都要先获取正在使用的公众号的id,字段为mp_id,在定义菜单时需从前台获取到信息,传入后台,并进行数据处理(将json数据转换为数组方法写入数据表中),只有mp_id不为0时才可以显示到页面中,因此在用foreach遍历数组时需要在$value前加&引用符号,如下:

                    $data1=I('post.data');
		foreach ($data1 as &$value) {
			$value['mp_id']=$mp['id'];
		}
		$model = M('mp_menu');
	    $model->where("mp_id = {$mp['id']}")->delete(); 
	    $model->addAll($data1);
		// $this->ajaxReturn($data1);
		include APP_PATH . 'LaneWeChat/lanewechat.php';
	    $ret = Menu::setMenu($data1);
	    file_put_contents('menu.txt', $ret);
	    if($ret === true){
	    	$this->ajaxReturn(array('msg'=>"创建菜单成功"));
	    }else{
	    	$this->ajaxReturn(array('msg'=>$ret));
	    }

在LaneWeChat中存在已经封装好了的创建菜单的方法,我们使用了命名空间后直接使用即可。

若微信公众平台中有已经建好的菜单可以同步到本地继续使用,同样在LaneWeChat框架中有获取菜单的方法,如下:

include APP_PATH . 'LaneWeChat/lanewechat.php';
$menu = Menu::getMenu($data);

此时获取的是一个极为复杂的多维数组,我们需要将数据进行处理,如下:

$menu = $menu['menu']['button'];
		$arr = array();
		$index = 1;
		foreach ($menu as $key => &$value) {
			$value['mp_id']= $mp_id;
			$value['index'] = $index;
			$value['pindex'] = 0;
			$value['sort'] = $index;			
			if(!empty($value['sub_button'])){
				$value['type'] = '';//设置一级菜单,默认值
				$value['content'] = '';//设置一级菜单,默认值
				$sub_menu = $value['sub_button']; //把二级菜单入到变量$sub_menu
				unset($value['sub_button']);
				$arr[] = $value;
				$subindex = 1;
				foreach ($sub_menu as $subkey=>&$subvalue) {
					$subvalue['mp_id'] = $mp_id;
					$subvalue['index'] = $index . $subindex;
					$subvalue['pindex'] = $index;
					$subvalue['sort'] = $subindex;
					if($subvalue['type']== 'click'){
						$subvalue['content'] = $subvalue['key'];
						unset($subvalue['key']);
					}else if($subvalue['type']=='view'){
						$subvalue['content'] = $subvalue['url'];
						unset($subvalue['url']);
					}else {						 
						 $subvalue['content'] = $subvalue['type'];
						 $subvalue['type'] = 'event';
						 unset($subvalue['key']);
					}
					unset($subvalue['sub_button']);
					$arr[] = $subvalue;
					$subindex++;
				}				
			}else{
				if($value['type']== 'click'){
					$value['content'] = $value['key'];
					unset($value['key']);
				}else if($value['type']=='view'){
					$value['content'] = $value['url'];
					unset($value['url']);
				}else {					 
					 $value['content'] = $value['type'];
					 $value['type'] = 'event';
					 unset($value['key']);
				}
				unset($value['sub_button']);
				$arr[] = $value;
			}
			$index++;
		}

由于处理完的数据字段顺序是混乱的,所以并不可以使用addAll方法批量插入,需使用循环遍历。4

相对来说,删除菜单就极为简单了,只需调用框架中的删除菜单方法即可,如下:

include APP_PATH . 'LaneWeChat/lanewechat.php';
$ret = Menu::delMenu($data);



你可能感兴趣的:(微信开发之自定义菜单)