Wechat.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <?php
  2. /**
  3. * 公众号管理控制器
  4. *
  5. */
  6. namespace app\admin\controller;
  7. use think\Config;
  8. use think\Db;
  9. use tree\Tree;
  10. use think\Env;
  11. class Wechat extends Admin
  12. {
  13. public function _initialize() {
  14. parent::_initialize();
  15. $this->appid = Env::get('appid');
  16. $this->appsecret = Env::get('appsecret');
  17. $this->wxMenuModel = model('WxMenu');
  18. }
  19. public function getAccessToken() {
  20. $redis = \think\Cache::store('default');
  21. $redisKey = "weixinaccesstoken".$this->appid;
  22. $WeixinAccessTokenCache = trim($redis->get($redisKey));
  23. if($WeixinAccessTokenCache){
  24. return $WeixinAccessTokenCache;
  25. } else{
  26. $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appsecret;
  27. $resjson = file_get_contents($url);
  28. $obj = json_decode($resjson);
  29. if($obj->access_token){
  30. $redis->set($redisKey, $obj->access_token, 30);
  31. return $obj->access_token;
  32. }
  33. if($obj->errcode){
  34. return $obj->errmsg;
  35. }
  36. }
  37. }
  38. public function menu() {
  39. // 排序
  40. $this->listOrders($this->wxMenuModel);
  41. $result = model('WxMenu')->order(["list_order" => "ASC"])->select();
  42. $tree = new Tree();
  43. $tree->icon = ['&nbsp;&nbsp;&nbsp;│ ', '&nbsp;&nbsp;&nbsp;├─ ', '&nbsp;&nbsp;&nbsp;└─ '];
  44. $tree->nbsp = '&nbsp;&nbsp;&nbsp;';
  45. $newMenus = [];
  46. foreach ($result as $m) {
  47. $newMenus[$m['id']] = $m;
  48. }
  49. $result2 = array();
  50. foreach ($result as $key => $value) {
  51. $result2[$key]['parent_id_node'] = ($value['parent_id']) ? ' class="child-of-node-' . $value['parent_id'] . '"' : '';
  52. $result2[$key]['style'] = empty($value['parent_id']) ? '' : 'display:none;';
  53. $str_manage = '';
  54. if($value['parent_id']==0){
  55. if (authUI('admin/Wechat/menuEdit')) {
  56. $str_manage .= '<a href="' . url("Wechat/menuEdit", ["parent_id" => $value['id'], "menu_id" => $this->request->param("menu_id")])
  57. . '">添加子菜单</a> ';
  58. }
  59. else{
  60. $str_manage .= '<a></a>';
  61. }
  62. }
  63. else{
  64. $str_manage .= '<a></a>';
  65. }
  66. if (authUI('admin/Wechat/menuEdit')) {
  67. $str_manage .= '<a href="' . url("Wechat/menuEdit", ["id" => $value['id'], "menu_id" => $this->request->param("menu_id")])
  68. . '">编辑</a> ';
  69. }
  70. if (authUI('admin/Wechat/delete')) {
  71. $str_manage .= '<a href="javascript:;" onclick="del_info(this,\'' . url("Wechat/menuDel", ["id" => $value['id'], "menu_id" => $this->request->param("menu_id")]) . '\')"> 删除 </a> ';
  72. }
  73. if($value['type']=='view'){
  74. $typeName = '跳转网页';
  75. }
  76. else if($value['type']=='click'){
  77. $typeName = '发送消息';
  78. }
  79. else{
  80. $typeName = '';
  81. }
  82. $result2[$key]['status'] = $typeName;
  83. $result2[$key]['str_manage'] = $str_manage;
  84. $result2[$key]['parent_id'] = $value['parent_id'];
  85. $result2[$key]['id'] = $value['id'];
  86. $result2[$key]['list_order'] = $value['list_order'];
  87. $result2[$key]['name'] = $value['name'];
  88. }
  89. $tree->init($result2);
  90. $str = "<tr id='node-\$id' \$parent_id_node style='\$style'>
  91. <td style='padding-left:20px;'><input name='list_orders[\$id]' type='text' size='3' value='\$list_order' class=\'layui-input\'></td>
  92. <td>\$spacer\$name</td>
  93. <td>\$status</td>
  94. <td>\$str_manage</td>
  95. </tr>";
  96. $category = $tree->getTree(0, $str);
  97. $this->assign("category", $category);
  98. return $this->fetch();
  99. }
  100. public function menuLoad() {
  101. if($this->appid) {
  102. $menu = $this->getMenus();
  103. $menus = [];
  104. if($menu) {
  105. $menu = json_decode($menu, true);
  106. $menus = $menu['menu']['button'];
  107. }
  108. // var_dump($menus);
  109. if($menus) {
  110. model('WxMenu')->where('1=1')->delete();
  111. $datetime = time();
  112. $s1 = 0;
  113. foreach($menus as $menu) {
  114. $data = [
  115. 'parent_id' => 0,
  116. 'name' => $menu['name'],
  117. 'list_order' => $s1,
  118. 'updated' => $datetime,
  119. ];
  120. $data = $this->_menuType($data, $menu);
  121. $menuId = model('WxMenu')->insertGetId($data);
  122. if(!empty($menu['sub_button']) && $menuId) {
  123. $s2 = 0;
  124. foreach ($menu['sub_button'] as $subMenu) {
  125. $d = [
  126. 'parent_id' => $menuId,
  127. 'name' => $subMenu['name'],
  128. 'list_order' => $s2,
  129. 'updated' => $datetime,
  130. ];
  131. $d = $this->_menuType($d, $subMenu);
  132. model('WxMenu')->insertGetId($d);
  133. ++$s2;
  134. }
  135. }
  136. ++$s1;
  137. }
  138. $this->success("操作成功");
  139. }
  140. $this->error("操作失败");
  141. }
  142. $this->error('请选择公众号');
  143. }
  144. private function _menuType($data, $menu) {
  145. if(isset($menu['type'])) {
  146. $t = $data['type'] = $menu['type'];
  147. if($t == 'click') {
  148. $data['key'] = $menu['key'];
  149. } else if($t == 'view') {
  150. $data['url'] = $menu['url'];
  151. } else if($t == 'media_id') {
  152. $data['media_id'] = $menu['media_id'];
  153. }
  154. }
  155. return $data;
  156. }
  157. private function getMenus(){
  158. $accessToken = $this->getAccessToken();
  159. $url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$accessToken;
  160. return file_get_contents($url);
  161. }
  162. public function menuEdit() {
  163. $id = $this->request->param("id", 0, 'intval');
  164. $appId = $this->appid;
  165. $parentId = $this->request->param("parent_id", 0, 'intval');
  166. if(!$appId)
  167. return false;
  168. if($id) {
  169. $data = model('WxMenu')->find($id);
  170. if ($data['key']) {
  171. $menuEvent = model('WxMenuEvent')->getEventByKey($data['key']);
  172. $data['content'] = $menuEvent['event_content'];
  173. }
  174. else{
  175. $data['content'] = '';
  176. }
  177. }
  178. else{
  179. if(!model('WxMenu')->checkNum($parentId)) {
  180. if($parentId){
  181. $this->error('该菜单已添加5个二级菜单,无法继续添加');
  182. }
  183. else{
  184. $this->error('已添加3个一级菜单,无法继续添加');
  185. }
  186. }
  187. $data = array();
  188. $data['name'] = '';
  189. $data['parent_id'] = 0;
  190. $data['id'] = 0;
  191. if($parentId){
  192. $data['url'] = '';
  193. $data['content'] = '';
  194. $data['type'] = 'click';
  195. }
  196. }
  197. $this->assign(compact('id', 'data', 'parentId'));
  198. return $this->fetch();
  199. }
  200. public function menuSave() {
  201. $id = $this->request->param("id", 0, 'intval');
  202. $data = $_POST;
  203. $data['name'] = $data['name'];
  204. $data['updated'] = date('Y-m-d H:i:s');
  205. if($id) {
  206. if(isset($data['type']) && $data['type']){
  207. $Content = $data['content'];
  208. unset($data['content']);
  209. }
  210. unset($data['parent_id']);
  211. if(model('WxMenu')->update($data) !== false) {
  212. if (isset($data['type']) && $data['type']=='click') {
  213. $params = array();
  214. $params['id'] = $id;
  215. $params['key'] = 'click_event_key_' . $id;
  216. model('WxMenu')->update($params);
  217. $menuEvent = model('WxMenuEvent')->where(array('event_key' => 'click_event_key_' . $id))->find();
  218. if ($menuEvent) {
  219. $params = array();
  220. $params['event_content'] = $Content;
  221. model('WxMenuEvent')->where(array('id' => $menuEvent['id']))->update($params);
  222. } else {
  223. $params = array();
  224. $params['event'] = 'click';
  225. $params['event_key'] = 'click_event_key_' . $id;
  226. $params['event_content'] = $Content;
  227. model('WxMenuEvent')->insertGetId($params);
  228. }
  229. }
  230. $this->success('修改成功', url('Wechat/menu'));
  231. }
  232. } else {
  233. if(!model('WxMenu')->checkNum($data['parent_id'])) {
  234. if($data['parent_id']){
  235. $this->error('该菜单已添加5个二级菜单,无法继续添加');
  236. }
  237. else{
  238. $this->error('已添加3个一级菜单,无法继续添加');
  239. }
  240. }
  241. if(isset($data['type']) && $data['type']){
  242. $Content = $data['content'];
  243. unset($data['content']);
  244. }
  245. if($id = model('WxMenu')->insertGetId($data)){
  246. if (isset($data['type']) && $data['type']=='click') {
  247. $params = array();
  248. $params['id'] = $id;
  249. $params['key'] = 'click_event_key_' . $id;
  250. model('WxMenu')->update($params);
  251. $params = array();
  252. $params['event'] = 'click';
  253. $params['event_key'] = 'click_event_key_' . $id;
  254. $params['event_content'] = $Content;
  255. model('WxMenuEvent')->insertGetId($params);
  256. }
  257. $this->success('添加成功', url('Wechat/menu'));
  258. }
  259. }
  260. $this->error('操作失败');
  261. }
  262. public function menuDel() {
  263. $id = $this->request->param("id", 0, 'intval');
  264. $count = model('WxMenu')->where(["parent_id" => $id])->count();
  265. if ($count > 0) {
  266. $this->error("该菜单下还有子菜单,无法删除!");
  267. }
  268. if($id && $menu = model('WxMenu')->find($id)) {
  269. if(model('WxMenu')->where(['id'=>$id])->delete()) {
  270. $this->success('删除成功');
  271. }
  272. }
  273. $this->error('操作失败');
  274. }
  275. public function menuSend() {
  276. $appId = $this->appid;
  277. if($appId) {
  278. $TopMenus = model('WxMenu')->where(['parent_id'=>0])->order('list_order asc,id asc')->select();
  279. foreach($TopMenus as $TopMenu) {
  280. $num = model('WxMenu')->where(['parent_id'=>$TopMenu['id']])->count();
  281. if(!$num) {
  282. $this->error('存在一级菜单未配置子菜单,不能发布!');
  283. }
  284. }
  285. $data = model('WxMenu')->getAppMenu();
  286. $menus = [];
  287. foreach($data as $d) {
  288. $menus[$d['parent_id']][] = $d;
  289. }
  290. $buttons = [];
  291. foreach($menus[0] as $m) {
  292. $menu = [
  293. 'name' => urldecode($m['name']),
  294. ];
  295. $menu = $this->_menuType($menu, $m);
  296. if(!$m['type']) {
  297. foreach($menus[$m['id']] as $mm) {
  298. $menu2 = [
  299. 'name' => urldecode($mm['name']),
  300. ];
  301. $menu2 = $this->_menuType($menu2, $mm);
  302. $menu['sub_button'][] = $menu2;
  303. }
  304. }
  305. $buttons['button'][] = $menu;
  306. }
  307. if(empty($buttons)) {
  308. $url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$this->getAccessToken($appId);
  309. $resobj = apipost($url,[],false,true);
  310. } else {
  311. $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken($appId);
  312. $params = json_encode($buttons, JSON_UNESCAPED_UNICODE);
  313. //echo $params; exit;
  314. $resobj = apipost($url,$params,false,true);
  315. }
  316. $obj = json_decode($resobj, true);
  317. if($obj['errcode'] != 0) {
  318. $this->error($obj['errmsg']);
  319. }
  320. $this->success('发送到公众号成功');
  321. }
  322. $this->error('请选择公众号');
  323. }
  324. }