appid = Env::get('appid'); $this->appsecret = Env::get('appsecret'); $this->wxMenuModel = model('WxMenu'); } public function getAccessToken() { $redis = \think\Cache::store('default'); $redisKey = "weixinaccesstoken".$this->appid; $WeixinAccessTokenCache = trim($redis->get($redisKey)); if($WeixinAccessTokenCache){ return $WeixinAccessTokenCache; } else{ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appsecret; $resjson = file_get_contents($url); $obj = json_decode($resjson); if($obj->access_token){ $redis->set($redisKey, $obj->access_token, 30); return $obj->access_token; } if($obj->errcode){ return $obj->errmsg; } } } public function menu() { // 排序 $this->listOrders($this->wxMenuModel); $result = model('WxMenu')->order(["list_order" => "ASC"])->select(); $tree = new Tree(); $tree->icon = ['   │ ', '   ├─ ', '   └─ ']; $tree->nbsp = '   '; $newMenus = []; foreach ($result as $m) { $newMenus[$m['id']] = $m; } $result2 = array(); foreach ($result as $key => $value) { $result2[$key]['parent_id_node'] = ($value['parent_id']) ? ' class="child-of-node-' . $value['parent_id'] . '"' : ''; $result2[$key]['style'] = empty($value['parent_id']) ? '' : 'display:none;'; $str_manage = ''; if($value['parent_id']==0){ if (authUI('admin/Wechat/menuEdit')) { $str_manage .= ' $value['id'], "menu_id" => $this->request->param("menu_id")]) . '">添加子菜单 '; } else{ $str_manage .= ''; } } else{ $str_manage .= ''; } if (authUI('admin/Wechat/menuEdit')) { $str_manage .= ' $value['id'], "menu_id" => $this->request->param("menu_id")]) . '">编辑 '; } if (authUI('admin/Wechat/delete')) { $str_manage .= ' $value['id'], "menu_id" => $this->request->param("menu_id")]) . '\')"> 删除 '; } if($value['type']=='view'){ $typeName = '跳转网页'; } else if($value['type']=='click'){ $typeName = '发送消息'; } else{ $typeName = ''; } $result2[$key]['status'] = $typeName; $result2[$key]['str_manage'] = $str_manage; $result2[$key]['parent_id'] = $value['parent_id']; $result2[$key]['id'] = $value['id']; $result2[$key]['list_order'] = $value['list_order']; $result2[$key]['name'] = $value['name']; } $tree->init($result2); $str = " \$spacer\$name \$status \$str_manage "; $category = $tree->getTree(0, $str); $this->assign("category", $category); return $this->fetch(); } public function menuLoad() { if($this->appid) { $menu = $this->getMenus(); $menus = []; if($menu) { $menu = json_decode($menu, true); $menus = $menu['menu']['button']; } // var_dump($menus); if($menus) { model('WxMenu')->where('1=1')->delete(); $datetime = time(); $s1 = 0; foreach($menus as $menu) { $data = [ 'parent_id' => 0, 'name' => $menu['name'], 'list_order' => $s1, 'updated' => $datetime, ]; $data = $this->_menuType($data, $menu); $menuId = model('WxMenu')->insertGetId($data); if(!empty($menu['sub_button']) && $menuId) { $s2 = 0; foreach ($menu['sub_button'] as $subMenu) { $d = [ 'parent_id' => $menuId, 'name' => $subMenu['name'], 'list_order' => $s2, 'updated' => $datetime, ]; $d = $this->_menuType($d, $subMenu); model('WxMenu')->insertGetId($d); ++$s2; } } ++$s1; } $this->success("操作成功"); } $this->error("操作失败"); } $this->error('请选择公众号'); } private function _menuType($data, $menu) { if(isset($menu['type'])) { $t = $data['type'] = $menu['type']; if($t == 'click') { $data['key'] = $menu['key']; } else if($t == 'view') { $data['url'] = $menu['url']; } else if($t == 'media_id') { $data['media_id'] = $menu['media_id']; } } return $data; } private function getMenus(){ $accessToken = $this->getAccessToken(); $url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$accessToken; return file_get_contents($url); } public function menuEdit() { $id = $this->request->param("id", 0, 'intval'); $appId = $this->appid; $parentId = $this->request->param("parent_id", 0, 'intval'); if(!$appId) return false; if($id) { $data = model('WxMenu')->find($id); if ($data['key']) { $menuEvent = model('WxMenuEvent')->getEventByKey($data['key']); $data['content'] = $menuEvent['event_content']; } else{ $data['content'] = ''; } } else{ if(!model('WxMenu')->checkNum($parentId)) { if($parentId){ $this->error('该菜单已添加5个二级菜单,无法继续添加'); } else{ $this->error('已添加3个一级菜单,无法继续添加'); } } $data = array(); $data['name'] = ''; $data['parent_id'] = 0; $data['id'] = 0; if($parentId){ $data['url'] = ''; $data['content'] = ''; $data['type'] = 'click'; } } $this->assign(compact('id', 'data', 'parentId')); return $this->fetch(); } public function menuSave() { $id = $this->request->param("id", 0, 'intval'); $data = $_POST; $data['name'] = $data['name']; $data['updated'] = date('Y-m-d H:i:s'); if($id) { if(isset($data['type']) && $data['type']){ $Content = $data['content']; unset($data['content']); } unset($data['parent_id']); if(model('WxMenu')->update($data) !== false) { if (isset($data['type']) && $data['type']=='click') { $params = array(); $params['id'] = $id; $params['key'] = 'click_event_key_' . $id; model('WxMenu')->update($params); $menuEvent = model('WxMenuEvent')->where(array('event_key' => 'click_event_key_' . $id))->find(); if ($menuEvent) { $params = array(); $params['event_content'] = $Content; model('WxMenuEvent')->where(array('id' => $menuEvent['id']))->update($params); } else { $params = array(); $params['event'] = 'click'; $params['event_key'] = 'click_event_key_' . $id; $params['event_content'] = $Content; model('WxMenuEvent')->insertGetId($params); } } $this->success('修改成功', url('Wechat/menu')); } } else { if(!model('WxMenu')->checkNum($data['parent_id'])) { if($data['parent_id']){ $this->error('该菜单已添加5个二级菜单,无法继续添加'); } else{ $this->error('已添加3个一级菜单,无法继续添加'); } } if(isset($data['type']) && $data['type']){ $Content = $data['content']; unset($data['content']); } if($id = model('WxMenu')->insertGetId($data)){ if (isset($data['type']) && $data['type']=='click') { $params = array(); $params['id'] = $id; $params['key'] = 'click_event_key_' . $id; model('WxMenu')->update($params); $params = array(); $params['event'] = 'click'; $params['event_key'] = 'click_event_key_' . $id; $params['event_content'] = $Content; model('WxMenuEvent')->insertGetId($params); } $this->success('添加成功', url('Wechat/menu')); } } $this->error('操作失败'); } public function menuDel() { $id = $this->request->param("id", 0, 'intval'); $count = model('WxMenu')->where(["parent_id" => $id])->count(); if ($count > 0) { $this->error("该菜单下还有子菜单,无法删除!"); } if($id && $menu = model('WxMenu')->find($id)) { if(model('WxMenu')->where(['id'=>$id])->delete()) { $this->success('删除成功'); } } $this->error('操作失败'); } public function menuSend() { $appId = $this->appid; if($appId) { $TopMenus = model('WxMenu')->where(['parent_id'=>0])->order('list_order asc,id asc')->select(); foreach($TopMenus as $TopMenu) { $num = model('WxMenu')->where(['parent_id'=>$TopMenu['id']])->count(); if(!$num) { $this->error('存在一级菜单未配置子菜单,不能发布!'); } } $data = model('WxMenu')->getAppMenu(); $menus = []; foreach($data as $d) { $menus[$d['parent_id']][] = $d; } $buttons = []; foreach($menus[0] as $m) { $menu = [ 'name' => urldecode($m['name']), ]; $menu = $this->_menuType($menu, $m); if(!$m['type']) { foreach($menus[$m['id']] as $mm) { $menu2 = [ 'name' => urldecode($mm['name']), ]; $menu2 = $this->_menuType($menu2, $mm); $menu['sub_button'][] = $menu2; } } $buttons['button'][] = $menu; } if(empty($buttons)) { $url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$this->getAccessToken($appId); $resobj = apipost($url,[],false,true); } else { $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken($appId); $params = json_encode($buttons, JSON_UNESCAPED_UNICODE); //echo $params; exit; $resobj = apipost($url,$params,false,true); } $obj = json_decode($resobj, true); if($obj['errcode'] != 0) { $this->error($obj['errmsg']); } $this->success('发送到公众号成功'); } $this->error('请选择公众号'); } }