isPost()) { //获取公众号配置信息 $wx_config = $wechat_model->getOneWxconfig(); View::assign('wx_config', $wx_config); //接口地址 $wx_apiurl = HTTP_TYPE . $_SERVER['HTTP_HOST'] . substr($_SERVER['PHP_SELF'], 0, strpos($_SERVER['PHP_SELF'], 'index.php')) . 'api/Wechat/index'; View::assign('wx_apiurl', $wx_apiurl); return View::fetch(); } else { $data = [ 'token' => input('post.wx_token'), 'appid' => input('post.wx_appid'), 'appsecret' => input('post.wx_AppSecret'), 'wxname' => input('post.wx_name'), 'xcx_appid' => input('post.xcx_appid'), 'xcx_appsecret' => input('post.xcx_AppSecret'), ]; //公众号二维码图片待处理 $id = input('param.wx_id'); if (empty($id)) { $res = $wechat_model->addWxconfig($data); } else { $res = $wechat_model->editWxconfig(array('id' => $id), $data); } if ($res) { $this->success(lang('ds_common_op_succ')); } else { $this->error(lang('ds_common_op_fail')); } } } //公众号菜单 public function menu() { $wechat_model = model('wechat'); $menu_list = $wechat_model->getWxmenuList(array(array('pid', '=', 0))); $menu_json = array(); foreach ($menu_list as $key => $val) { $menu_json[$key] = array(); $menu_json[$key][] = array('name' => 'name', 'value' => $val['name']); if ($val['type']) { $menu_json[$key][] = array('name' => 'type', 'value' => $val['type']); } if ($val['value']) { $val['value'] = json_decode($val['value'], true); foreach ($val['value'] as $k => $v) { if ($k == 'url') { if ($val['type'] == 'view') { $menu_json[$key][] = array('name' => 'url1', 'value' => $v); } else if ($val['type'] == 'miniprogram') { $menu_json[$key][] = array('name' => 'url2', 'value' => $v); } } else { $menu_json[$key][] = array('name' => $k, 'value' => $v); } } } $menu_json[$key][] = array('child' => []); $menu_sub_list = $wechat_model->getWxmenuList(array(array('pid', '=', $val['id']))); $menu_list[$key]['child'] = $menu_sub_list; if (!empty($menu_sub_list)) { foreach ($menu_sub_list as $key1 => $val1) { $temp = array(); $temp[] = array('name' => 'name', 'value' => $val1['name']); if ($val1['type']) { $temp[] = array('name' => 'type', 'value' => $val1['type']); } if ($val1['value']) { $val1['value'] = json_decode($val1['value'], true); foreach ($val1['value'] as $k => $v) { if ($k == 'url') { if ($val1['type'] == 'view') { $temp[] = array('name' => 'url1', 'value' => $v); } else if ($val1['type'] == 'miniprogram') { $temp[] = array('name' => 'url2', 'value' => $v); } } else { $temp[] = array('name' => $k, 'value' => $v); } } } $menu_json[$key][count($menu_json[$key]) - 1]['child'][] = $temp; } } } View::assign('menu_list', $menu_list); View::assign('menu_json', $menu_json); $this->setAdminCurItem('menu'); return View::fetch(); } public function add_menu() { $menus = input('param.menus/a'); $result = ''; $menu_list = array(); Db::startTrans(); try { $wechat_model = model('wechat'); $condition = array(array('id', '>', 0)); $wechat_model->delWxmenu($condition); foreach ($menus as $key => $val) { $temp = array(); foreach ($val as $k => $v) { if ($k != (count($val) - 1)) { $temp[$v['name']] = $v['value']; } } $id = count($menu_list) + 1; $menu_list[] = array('id' => $id, 'pid' => 0, 'child_count' => isset($val[count($val) - 1]['child']) ? count($val[count($val) - 1]['child']) : 0, 'value' => $temp, 'index1' => $key, 'index2' => -1); if (isset($val[count($val) - 1]['child'])) { foreach ($val[count($val) - 1]['child'] as $k1 => $v1) { $temp = array(); foreach ($v1 as $k => $v) { $temp[$v['name']] = $v['value']; } $menu_list[] = array('id' => count($menu_list) + 1, 'pid' => $id, 'value' => $temp, 'index1' => $key, 'index2' => $k1); } } } $menu_array = array(); foreach ($menu_list as $val) { if (trim($val['value']['name']) == '') { $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => 'name'); throw new \think\Exception('', 10006); } if (isset($val['child_count']) && $val['child_count'] > 0) { $menu_array[] = array( 'id' => $val['id'], 'pid' => $val['pid'], 'name' => $val['value']['name'], 'type' => '', 'value' => '' ); } else { $temp = array( 'id' => $val['id'], 'pid' => $val['pid'], 'name' => $val['value']['name'], 'type' => $val['value']['type'], ); switch ($val['value']['type']) { case 'article_id': if (trim($val['value']['article_id']) == '') { $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => 'article_id'); throw new \think\Exception('', 10006); } $temp['value'] = json_encode(array('article_id' => $val['value']['article_id'])); break; case 'click': if (trim($val['value']['key']) == '') { $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => 'key'); throw new \think\Exception('', 10006); } $temp['value'] = json_encode(array('key' => $val['value']['key'])); break; case 'view': if (trim($val['value']['url1']) == '') { $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => 'url1'); throw new \think\Exception('', 10006); } $temp['value'] = json_encode(array('url' => $val['value']['url1'])); break; case 'miniprogram': if (trim($val['value']['url2']) == '' || trim($val['value']['appid']) == '' || trim($val['value']['pagepath']) == '') { $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => ((trim($val['value']['url2']) == '') ? 'url2' : ((trim($val['value']['appid']) == '') ? 'appid' : 'pagepath'))); throw new \think\Exception('', 10006); } $temp['value'] = json_encode(array('url' => $val['value']['url2'], 'appid' => $val['value']['appid'], 'pagepath' => $val['value']['pagepath'])); break; default: $result = array('index1' => $val['index1'], 'index2' => $val['index2'], 'name' => 'type'); throw new \think\Exception('', 10006); } $menu_array[] = $temp; } } if (!empty($menu_array)) { Db::name('wxmenu')->insertAll($menu_array); } } catch (\Exception $e) { Db::rollback(); ds_json_encode(10001, $e->getMessage(), $result); } Db::commit(); ds_json_encode(10000, lang('ds_common_op_succ')); } //更新公众号菜单 public function pub_menu() { //获取父级菜单 $wechat_model = model('wechat'); //获取菜单 $config = $wechat_model->getOneWxconfig(); $p_menus = $wechat_model->getWxmenuList(array('pid' => 0), 'id ASC'); $p_menus = ds_change_arraykey($p_menus, 'id'); $post_str = $this->convert_menu($p_menus); // http post请求 if (!count($p_menus) > 0) { $this->error(lang('no_menu'), 'Wechat/menu'); exit; } //查看access_token是否过期 $wechat = new WechatApi($config); $expire_time = $config['expires_in']; if ($expire_time > TIMESTAMP) { //有效期内 $wechat->access_token_ = $config['access_token']; } else { $access_token = $wechat->checkAuth(); if ($access_token == FALSE) { $this->error(lang('ds_common_op_fail') . $wechat->errCode . $wechat->errMsg, 'Wechat/menu'); } $web_expires = TIMESTAMP + 7000; // 提前200秒过期 $condition = array(); $condition[] = array('id', '=', $config['id']); $data = array('access_token' => $access_token, 'expires_in' => $web_expires); $wechat_model->editWxconfig($condition, $data); } $return = $wechat->createMenu($post_str); if ($return) { $this->success(lang('ds_common_op_succ'), 'Wechat/menu'); } else { $this->error(lang('ds_common_op_fail') . $wechat->errCode . $wechat->errMsg); } } //菜单转换 private function convert_menu($p_menus) { $wechat_model = model('wechat'); $new_arr = array(); $count = 0; foreach ($p_menus as $k => $v) { $new_arr[$count]['name'] = $v['name']; //获取子菜单 $c_menus = $wechat_model->getMenulist(array('pid' => $k)); if ($c_menus) { foreach ($c_menus as $kk => $vv) { $add = array(); $add['name'] = $vv['name']; $add['type'] = $vv['type']; $add = array_merge($add, json_decode($vv['value'], true)); $new_arr[$count]['sub_button'][] = $add; } } else { $new_arr[$count]['type'] = $v['type']; $new_arr[$count] = array_merge($new_arr[$count], json_decode($v['value'], true)); } $count++; } return array('button' => $new_arr); } /** * 关键字文本回复 */ public function k_text() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); if (empty($wechat)) { $this->error(lang('please_set_wechat_config'), 'Wechat/setting'); } $lists = $wechat_model->getWxkeywordList(array('type' => 'TEXT'), 'k.id,k.keyword,t.text', 10, 't.createtime DESC'); View::assign('lists', $lists); View::assign('show_page', $wechat_model->page_info->render()); return View::fetch(); } /* * 添加文本回复 */ public function text_form() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); if (empty($wechat)) { $this->error(lang('please_set_wechat_config'), 'Wechat/setting'); } if (request()->isPost()) { $kid = input('param.id'); $add['keyword'] = input('param.keyword'); $add['text'] = input('param.text'); if (empty($kid)) { //添加模式 $add['createtime'] = TIMESTAMP; $add['pid'] = $wechat_model->addWxtext($add); unset($add['text']); unset($add['createtime']); $add['type'] = 'TEXT'; $row = $wechat_model->addWxkeyword($add); } else { //编辑模式 $data = $wechat_model->getOneWxkeyword(array('id' => $kid)); if ($data) { $update['keyword'] = $add['keyword']; $wechat_model->editWxkeyword(array('id' => $kid), $update); $row = $wechat_model->editWxtext(array('id' => $data['pid']), $add); } } $row >= 0 ? dsLayerOpenSuccess(lang('ds_common_op_succ')) : $this->error(lang('ds_common_op_fail'), 'Wechat/k_text'); exit; } else { //编辑状态 $id = intval(input('param.id')); $key = array(); if ($id) { $where = "k.id={$id} AND k.type='TEXT'"; $res = Db::name('wxkeyword')->alias('k')->join('wxtext t', 't.id=k.id', 'LEFT')->where($where)->field('k.id,k.keyword,t.text')->find(); View::assign('key', $res); } return View::fetch(); } } /* * 删除文本回复 */ public function del_text() { $wechat_model = model('wechat'); $id = input('param.id'); $row = $wechat_model->getOneWxkeyword(array('id' => $id)); if ($row) { $wechat_model->delWxkeyword(array('id' => $id)); $wechat_model->delWxtext(array('id' => $row['pid'])); ds_json_encode(10000, lang('ds_common_del_succ')); } else { ds_json_encode(10001, lang('ds_common_del_fail')); } } /** * 删除消息推送 */ public function del_wxmsg() { $wechat_model = model('wechat'); $id = input('param.id'); $id_array = ds_delete_param($id); if ($id_array === FALSE) { ds_json_encode(10001, lang('param_error')); } $condition = array(array('id', 'in', $id_array)); $result = $wechat_model->delWxmsg($condition); if ($result) { ds_json_encode(10000, lang('ds_common_del_succ')); } else { ds_json_encode(10001, lang('ds_common_del_fail')); } } /* * 微信注册会员列表 */ public function member() { $wechat_model = model('wechat'); $wxmember_list = $wechat_model->getWxmemberList(); foreach ($wxmember_list as $key => $val) { @$wxmember_list[$key]['member_wxinfo'] = unserialize($val['member_wxinfo']); } View::assign('show_page', $wechat_model->page_info->render()); View::assign('wxmember_list', $wxmember_list); return View::fetch('member'); } /* * 消息推送 */ public function msend() { $touser = input('param.openid'); $id = input('param.member_id'); if (request()->isPost()) { $wechat_model = model('wechat'); $config = $wechat_model->getOneWxconfig(); $wechat = new WechatApi($config); $type = input('param.type'); if ($type == 'text') { //发送文本消息 $content = input('param.text'); $send = array( 'touser' => $touser, 'msgtype' => 'text', 'text' => array('content' => $content) ); } else { //发送图文消息 $title = input('param.title'); $description = input('param.description'); $url = input('param.url'); $picUrl = ''; if (!empty($_FILES['s_pic']['name'])) { $prefix = $id; $file_name = $prefix . '_' . date('YmdHis') . rand(10000, 99999) . '.png'; $res = ds_upload_pic(DIR_ADMIN . DIRECTORY_SEPARATOR . 'wechat', 's_pic', $file_name); if ($res['code']) { $file_name = $res['data']['file_name']; } else { $this->error($res['msg']); } $picUrl = ds_get_pic(DIR_ADMIN . DIRECTORY_SEPARATOR . 'wechat', $file_name); } $content = array( array( 'title' => $title, 'description' => $description, 'url' => $url, 'picurl' => $picUrl ) ); $send = array( 'touser' => $touser, 'msgtype' => 'news', 'news' => array('articles' => $content) ); } $SendInfo = serialize($send); $data['member_id'] = $id; $data['content'] = $SendInfo; $data['createtime'] = TIMESTAMP; $ret = $wechat->sendCustomMessage($send); if ($ret) { //添加至推送列表 $data['issend'] = '1'; $wechat_model->addWxmsg($data); dsLayerOpenSuccess(lang('ds_common_op_succ')); } else { $data['issend'] = '0'; $wechat_model->addWxmsg($data); $this->error(lang('ds_common_op_fail') . $wechat->errCode . $wechat->errMsg); } } else { return View::fetch(); } } /* * 消息推送列表 */ public function SendList() { $wechat_model = model('wechat'); $list = $wechat_model->getWxmsgList(); foreach ($list as $key => $val) { $info = unserialize($val['content']); $type = $info['msgtype']; $list[$key]['type'] = $type == 'text' ? lang('message_type_text') : lang('message_type_news'); if ($type == 'text') { $list[$key]['content'] = $info['text']['content']; } else { $content = $info['news']['articles']['0']; $content = json_encode($content); $list[$key]['content'] = "查看图文消息"; /* View::assign('title',$content['title']); View::assign('description',$content['description']); View::assign('url',$content['url']); echo View::fetch('news'); */ } } View::assign('show_page', $wechat_model->page_info->render()); View::assign('lists', $list); return View::fetch('list'); } /* * 消息群发 */ public function Sendgroup() { if (request()->isPost()) { $m_info = model('wechat')->getWxmemberList(); $openid = ''; foreach ($m_info as $k => $val) { $openid .= $val['member_wxopenid'] . ','; } $openid = explode(',', $openid); $content = input('param.text'); $send = array( 'touser' => $openid, 'msgtype' => 'text', 'text' => array('content' => $content) ); $config = model('wechat')->getOneWxconfig(); $wechat = new WechatApi($config); $res = $wechat->massSend($send); if ($res) { dsLayerOpenSuccess(lang('ds_common_op_succ')); } else { $this->error(lang('ds_common_op_fail') . $wechat->errCode . $wechat->errMsg); } } else { return View::fetch('sendgroup'); } } public function material() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); if (empty($wechat)) { $this->error(lang('please_set_wechat_config'), 'Wechat/setting'); } $template = array( 'offset' => (input('param.page', 1) - 1) * 10, 'count' => 10, ); $res = $wechat_model->getMaterialList($template); if (!$res['code']) { $this->error($res['msg']); } $paginate = Db::name('wxconfig')->paginate(10, $res['data']['total_count'], ['query' => request()->param()]); View::assign('show_page', $paginate->render()); View::assign('list', $res['data']['item']); $this->setAdminCurItem('material'); return View::fetch(); } public function freepublish() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); if (empty($wechat)) { $this->error(lang('please_set_wechat_config'), 'Wechat/setting'); } $template = array( 'offset' => (input('param.page', 1) - 1) * 10, 'count' => 10, ); $res = $wechat_model->getFreepublishList($template); if (!$res['code']) { $this->error($res['msg']); } $paginate = Db::name('wxconfig')->paginate(10, $res['data']['total_count'], ['query' => request()->param()]); View::assign('show_page', $paginate->render()); View::assign('list', $res['data']['item']); $this->setAdminCurItem('freepublish'); return View::fetch(); } public function freepublish_del() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $res = $wechat_model->delFreepublish(input('param.article_id')); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } ds_json_encode(10000, lang('ds_common_op_succ')); } public function material_select() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); if (empty($wechat)) { $this->error(lang('please_set_wechat_config'), 'Wechat/setting'); } $template = array( 'type' => 'news', 'offset' => (input('param.page', 1) - 1) * 10, 'count' => 10, ); $res = $wechat_model->getFreepublishList($template); if (!$res['code']) { $this->error($res['msg']); } $paginate = Db::name('wxconfig')->paginate(10, $res['data']['total_count'], ['query' => request()->param()]); View::assign('show_page', $paginate->render()); View::assign('list', $res['data']['item']); return View::fetch(); } public function material_add() { if (request()->isPost()) { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $temp = input('param.articles/a'); $articles = array(); foreach ($temp as $key => $val) { $a = array(); foreach ($val as $v) { if (in_array($v['name'], ['thumb_media_id', 'title', 'author', 'content', 'content_source_url', 'need_open_comment', 'only_fans_can_comment'])) { if (in_array($v['name'], ['thumb_media_id', 'title', 'content', 'content_source_url']) && $v['value'] == '') { ds_json_encode(10001, '', array('index' => $key, 'name' => $v['name'])); } $a[$v['name']] = $v['value']; } } $articles[] = $a; } $template = array( 'articles' => $articles ); $res = $wechat_model->addMaterial($template); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } ds_json_encode(10000, lang('ds_common_op_succ')); } else { $this->setAdminCurItem('material_add'); return View::fetch('material_form'); } } public function get_freepublish() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $article_id = input('param.article_id'); return $wechat_model->getFreepublishInfo($article_id); } public function material_edit() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $media_id = input('param.media_id'); $res = $wechat_model->getMaterialInfo($media_id); if (request()->isPost()) { if (!$res['code']) { ds_json_encode(10001, $res['msg']); } $material_info = $res['data']['news_item']; $temp = input('param.articles/a'); $index = 0; foreach ($temp as $key => $val) { $a = array(); foreach ($val as $v) { if (in_array($v['name'], ['thumb_media_id', 'title', 'author', 'content', 'content_source_url', 'need_open_comment', 'only_fans_can_comment'])) { if (in_array($v['name'], ['thumb_media_id', 'title', 'content', 'content_source_url']) && $v['value'] == '') { ds_json_encode(10001, '', array('index' => $key, 'name' => $v['name'])); } $a[$v['name']] = $v['value']; } } if (!isset($material_info[$index])) { ds_json_encode(10001, '图文消息(' . $index . ')不存在'); } ksort($a); ksort($material_info[$index]); if (json_encode($a) != json_encode($material_info[$index])) { $template = array( 'media_id' => $media_id, 'index' => $index, 'articles' => $a ); $res = $wechat_model->editMaterial($template); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } } $index++; } ds_json_encode(10000, lang('ds_common_op_succ')); } else { if (!$res['code']) { $this->error($res['msg']); } foreach ($res['data']['news_item'] as $key => $val) { $res['data']['news_item'][$key]['content'] = str_replace('data-src', 'src', $val['content']); } View::assign('material_info', $res['data']['news_item']); $this->setAdminCurItem('material_edit'); return View::fetch('material_form'); } } public function material_del() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $res = $wechat_model->delMaterial(input('param.media_id')); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } ds_json_encode(10000, lang('ds_common_op_succ')); } public function freepublish_submit() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $res = $wechat_model->submitFreepublish(input('param.media_id')); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } ds_json_encode(10000, lang('ds_common_op_succ')); } public function get_material_image() { $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); return $wechat_model->getImage(input('param.media_id')); } public function upload_material_image() { $type = intval(input('param.type')); $wechat_model = model('wechat'); $wechat = $wechat_model->getOneWxconfig(); $res = $wechat_model->uploadMaterialImage($_FILES['file'], $type); if (!$res['code']) { ds_json_encode(10001, $res['msg']); } ds_json_encode(10000, '', $res['data']); } protected function getAdminItemList() { if (strpos(request()->action(), 'material') !== false || strpos(request()->action(), 'freepublish') !== false) { $menu_array = array( array( 'name' => 'material', 'text' => lang('draft_list'), 'url' => (string) url('Wechat/material') ), array( 'name' => 'freepublish', 'text' => lang('freepublish_list'), 'url' => (string) url('Wechat/freepublish') ), ); if (request()->action() == 'material_edit') { $menu_array[] = array( 'name' => 'material_edit', 'text' => lang('ds_edit'), 'url' => 'javascript:void(0)' ); } else { $menu_array[] = array( 'name' => 'material_add', 'text' => lang('ds_new'), 'url' => (string) url('Wechat/material_add') ); } } else { $menu_array = array( array( 'name' => 'menu', 'text' => lang('wechat_menu'), 'url' => (string) url('Wechat/menu') ), ); } return $menu_array; } }