WeChat public platform is very popular recently. There must be many companies like ours who want to develop WeChat public platform. Here we record the problems encountered when making custom menus,
Hope it can give some people some ideas and save them some detours.
In order to dynamically modify the custom menu, store the menu items in the database. $arr is the processed array queried from the database. The format is:
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" } } } } }
When adding a menu, I found that direct json_encode($arr); will prompt 40016 error: illegal number of buttons
After calling the json_encode function, all Chinese characters are converted into the form "u8fd9",
In order to use the json_encoded structure without changing the Chinese, you can use the following function (from the Internet):
/************************************************************** * * 使用特定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); }
Execute add:
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 added successfully ^_^, for reference only
Of course, if you post too much code to the homepage, you will definitely not be able to pass it, but in order to let more people see it, I still shamelessly post it to the homepage (I don’t know how many minutes I can stay on the homepage~