文档章节

微信公众平台自定义菜单

冰糖710
 冰糖710
发布于 2015/05/13 15:52
字数 675
阅读 164
收藏 18

最近微信公众平台挺火的,肯定好多公司像我们公司一样,要开发微信公众平台,在此记录一下在制作 自定义菜单时遇到的问题,

希望能给某些人点思路,或少走点弯路.

为了动态修改自定义菜单,把菜单项存入数据库中 $arr是从数据库查询出来的经过处理后的数组格式为:

array(1) {
  ["button"] => array(3) {
    [0] => array(3) {
      ["type"] => string(4) "view"
      ["name"] => string(12) "公司新闻"
      ["url"] => string(24) "http://www.google.com.tw"
    }
    [1] => array(3) {
      ["type"] => string(4) "view"
      ["name"] => string(12) "公司案例"
      ["url"] => string(20) "http://www.baidu.com"
    }
    [2] => array(2) {
      ["name"] => string(12) "智能家居"
      ["sub_button"] => array(5) {
        [0] => array(3) {
          ["type"] => string(5) "click"
          ["name"] => string(12) "功能描述"
          ["key"] => string(10) "smart_desc"
        }
        [1] => array(3) {
          ["type"] => string(5) "click"
          ["name"] => string(12) "每日一点"
          ["key"] => string(9) "day_click"
        }
        [2] => array(3) {
          ["type"] => string(5) "click"
          ["name"] => string(12) "一天一点"
          ["key"] => string(13) "eve_day_click"
        }
        [3] => array(3) {
          ["type"] => string(5) "click"
          ["name"] => string(12) "休闲时刻"
          ["key"] => string(11) "xiuxian_day"
        }
        [4] => array(3) {
          ["type"] => string(5) "click"
          ["name"] => string(12) "做人好难"
          ["key"] => string(3) "nan"
        }
      }
    }
  }
}

  

在添加菜单的时候发现直接json_encode($arr);会提示40016错误:不合法的按钮个数

在调用了json_encode函数之后所有中文被转换成 "\u8fd9" 这种形式,

为了使用json_encode处理后的结构而不改变中文可以使用如下函数(来源于互联网):

 

     /**************************************************************
	 *
	 *	使用特定function对数组中所有元素做处理
	 *	@param	string	&$array		要处理的字符串
	 *	@param	string	$function	要执行的函数
	 *	@return boolean	$apply_to_keys_also		是否也应用到key上
	 *	@access public
	 *
	 *************************************************************/
	function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
	{
	    static $recursive_counter = 0;
	    if (++$recursive_counter > 1000) {
	        die('possible deep recursion attack');
	    }
	    foreach ($array as $key => $value) {
	        if (is_array($value)) {
	            self::arrayRecursive($array[$key], $function, $apply_to_keys_also);
	        } else {
	            $array[$key] = $function($value);
	        }
	 
	        if ($apply_to_keys_also && is_string($key)) {
	            $new_key = $function($key);
	            if ($new_key != $key) {
	                $array[$new_key] = $array[$key];
	                unset($array[$key]);
	            }
	        }
	    }
	    $recursive_counter--;
	}
	 
	/**************************************************************
	 *
	 *	将数组转换为JSON字符串(兼容中文)
	 *	@param	array	$array		要转换的数组
	 *	@return string		转换得到的json字符串
	 *	@access public
	 *
	 *************************************************************/
	function JSON($array) {
		self::arrayRecursive($array, 'urlencode', true);
		$json = json_encode($array);
		return urldecode($json);
	}

  

执行添加:

function apply(){
		$token_str = self::get_access_token();
		$del_url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={$token_str}";
		file_get_contents($del_url);
		$apply_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$token_str}";
		$data = self::JSON(self::get_menu());//json化中文不变
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $apply_url);
		curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		$result = curl_exec($ch);
		curl_close($ch);
		$result = json_decode($result,true);
		$this->redirect("Menu/index",array(
			'msg'=>($result['errcode']==0?'操作成功':'操作失败'),
			'state'=>$result['errcode']==0 ? 0 : 1
		));
	}

 OK添加成功 ^_^ ,仅供参考

  当然代码过多发到首页肯定是过不了的,不过为了让更多人看到还是厚着脸色发布到首页(不知道能在首页呆几分钟~

本文转载自:http://www.cnblogs.com/hxtgirq710/p/weixin.html

冰糖710
粉丝 4
博文 10
码字总数 0
作品 0
程序员
私信 提问
微信公众平台如何创建自定义菜单?

微信现在的功能越来越强大了,申请认证后的开发者能自定义菜单,用户直接点击微信界面下方的菜单,就能直接去到指定的页面,下面小编用【微信公众平台测试号】为大家演示一下怎么创建自定义菜...

DavidBao
2015/04/16
3.9K
0
微信公众平台(2)-自定义菜单接口

前几日发布了nodejs搭建微信公众平台后台,今天介绍下公众平台的自定义菜单接口。 首先自定义菜单接口在刚申请的订阅号中是没有权限设置的,需要认证开通,而服务号在申请成功之后就可以自定...

雪飘七月
2014/10/10
0
0
微信公众平台自定义菜单创建 -JAVA

微信公众平台开发之自定义菜单创建JAVA源码 创建项目添加httpclient.jar、fastjson.jar支持 专注微信公众平台app开发群:209389987 自定义菜单的问题总结: 1.自定义菜单只有服务号可以申请,...

using
2013/09/13
5.6K
2
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0
微信公众平台开发自定义菜单功能开发

一、简介 微信公众平台服务号以及之前成功申请内测资格的订阅号都具有自定义菜单的功能。开发者可利用该功能为公众账号的会话界面底部增加自定义菜单,用户点击菜单中的选项,可以调出相应的...

hengfeng_su
2013/12/02
374
0

没有更多内容

加载失败,请刷新页面

加载更多

500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部