name = dr_lang('模板消息'); // 模板前缀(避免混淆) $this->tpl_prefix = 'template_'; // 用于表储存的字段,后台可修改的表字段 $field = array( 'title' => array( 'name' => dr_lang('主题'), 'fieldname' => 'title', // 这是字段名称必须和主键相同 ), 'template' => array( 'name' => dr_lang('模板ID'), 'fieldname' => 'template', // 这是字段名称必须和主键相同 ), 'url' => array( 'name' => dr_lang('消息URL'), 'fieldname' => 'url', // 这是字段名称必须和主键相同 ), ); // 初始化数据表 $this->_init([ 'table' => weixin_wxtable('template'), 'field' => $field, // 可查询的字段 'order_by' => 'inputtime desc', // 列表排序 'date_field' => 'inputtime', // 按时间段搜索字段 ]); // 把公共变量传入模板 \Phpcmf\Service::V()->assign([ // 搜索字段 'field' => $field, // 后台的菜单 'menu' => \Phpcmf\Service::M('auth')->_admin_menu( [ WEIXIN_MORE_NAME. $this->name => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-edit'], '创建' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'], '修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'], ]), 'group' => \Phpcmf\Service::M('User', APP_DIR)->get_group_data(), 'ucount' => \Phpcmf\Service::M()->table(weixin_wxtable('user'))->counts(), ]); } // 来自cms的群发 public function show_add() { $id = (int)\Phpcmf\Service::L('Input')->get('id'); $mid = dr_safe_filename(\Phpcmf\Service::L('Input')->get('mid')); if (!$id || !$mid) { $this->_json(0, '参数不能为空'); } $data = \Phpcmf\Service::M()->table_site($mid)->get($id); if (!$data) { $this->_json(0, '内容不存在'); } $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll(); if (!$cache) { $this->_json(0, dr_lang('没有可用粉丝')); } $tpl = []; // 生成模板 $template = []; foreach ($tpl['content'] as $t) { if ($t['name']) { $template[$t['name']] = [ 'value' => $t['value'], 'color' => $t['color'], ]; } } if (!$template) { $this->_json(0, dr_lang('模板内容解析后不存在')); } // 存储文件 \Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [ 'data' => $data, 'template' => $template, 'users' => dr_save_bfb_data($cache) ], 3600); $this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]); } // 查看列表 public function index() { list($tpl) = $this->_List(); \Phpcmf\Service::V()->display($tpl); } // 添加内容 public function add() { list($tpl) =$this->_Post(0); \Phpcmf\Service::V()->display($tpl); } // 修改内容 public function edit() { $id = intval(\Phpcmf\Service::L('Input')->get('id')); list($tpl) = $this->_Post($id); \Phpcmf\Service::V()->display($tpl); } // 删除内容 public function del() { $this->_Del( \Phpcmf\Service::L('Input')->get_post_ids(), null, null, \Phpcmf\Service::M()->dbprefix($this->init['table']) ); } // 内容处理 public function todo_add() { $id = \Phpcmf\Service::L('input')->get('id'); $data = \Phpcmf\Service::M()->table($this->init['table'])->get($id); if (!$data) { $this->_json(0, dr_lang('模板内容不存在')); } elseif (!$data['content']) { $this->_json(0, dr_lang('内容参数不存在')); } elseif (!$data['template']) { $this->_json(0, dr_lang('模板ID不存在')); } $data['content'] = dr_string2array($data['content']); if ($data['groupid'] < 0) { $gid = abs($data['groupid']); $where = 'uid in (select uid from '.\Phpcmf\Service::M()->dbprefix('member_group_index').' where gid='.$gid.')'; $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where($where)->getAll(); } elseif ($data['groupid'] > 0) { $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->where('groupids LIKE "%\"'.\Phpcmf\Service::M()->db->escapeString($data['groupid'], true).'\"%"')->getAll(); } else { $cache = \Phpcmf\Service::M()->table(weixin_wxtable('user'))->getAll(); } if (!$cache) { $this->_json(0, dr_lang('没有可用粉丝')); } // 生成模板 $template = []; foreach ($data['content'] as $t) { if ($t['name']) { $template[$t['name']] = [ 'value' => $t['value'], 'color' => $t['color'], ]; } } if (!$template) { $this->_json(0, dr_lang('模板内容解析后不存在')); } // 存储文件 \Phpcmf\Service::L('cache')->set_auth_data('app-weixin-template-send', [ 'data' => $data, 'template' => $template, 'users' => $this->_save_bfb_data($cache), ]); $this->_json(1, 'ok', ['url' => dr_url('weixin/template/show_index', ['counts'=> count($cache)])]); } function _save_bfb_data($data) { $cache = []; $count = dr_count($data); $num = ceil($count/10); if ($count > $num) { $pagesize = ceil($count/$num); for ($i = 1; $i <= $num; $i ++) { $cache[$i] = array_slice($data, ($i - 1) * $pagesize, $pagesize); } } else { for ($i = 1; $i <= $count; $i ++) { $cache[$i] = array_slice($data, ($i - 1), 1); } } return $cache; } // 内容处理 public function show_index() { \Phpcmf\Service::V()->assign([ 'menu' => '', 'hidebtn' => 1, 'todo_url' => dr_url('weixin/template/send_add'), 'count_url' => dr_url('weixin/template/show_count_index'), ]); \Phpcmf\Service::V()->display('bfb.html');exit; } // 内容数量统计 public function show_count_index() { $data = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send'); !dr_count($data) && $this->_json(0, dr_lang('无可用数据,缓存已失效')); $this->_json(count($data['users']), 'ok'); } public function send_add() { $page = max(1, intval($_GET['pp'])); $cache = \Phpcmf\Service::L('cache')->get_auth_data('app-weixin-template-send'); !$cache && $this->_json(0, dr_lang('缓存不存在')); $data = $cache['users'][$page]; $cts = count($cache['users']); if ($data) { $html = ''; foreach ($data as $user) { $rt = $this->_send_template($user['openid'], $cache['data']['template'], $cache['template'], $cache['data']['url'], $cache['data']['color']); if (!$rt['code']) { $ok = "".$rt['msg'].""; $class = ' p_error'; } else { $ok = "".dr_lang('发送成功').""; \Phpcmf\Service::M()->db->table($this->init['table']) ->where('id', intval($cache['data']['id'])) ->increment('counts', 1); } $html.= '

'; } $this->_json($page + 1, $html, [ 'msg' => '正在执行第'.$page.'页/共'.$cts.'页', 'bfb' => round($page/$cts * 100, 2), ]); } // 完成 \Phpcmf\Service::L('cache')->del_auth_data('app-weixin-template-send'); $this->_json($cts, 'ok'); } /** * 获取微信 access token */ public function _weixin_template_access_token() { $cache_data = \Phpcmf\Service::L('cache')->init('file')->get('access_token'); if (isset($cache_data['time']) && $cache_data['access_token']) { $access_token = $cache_data['access_token']; } else { $weixin = \Phpcmf\Service::C()->get_cache('weixin'); $result = wx_get_https_json_data('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$weixin['account']['appid'].'&secret='.$weixin['account']['appsecret']); if (!$result['code']) { return dr_return_data(0, 'AccessToken:'.$result['msg']); } \Phpcmf\Service::L('cache')->init('file')->save('access_token', $result['data'], 3600); $access_token = $result['data']['access_token']; } return dr_return_data(1, 'ok', ['access_token' => $access_token]); } private function _send_template($oid, $id, $data, $url = '', $color = '') { $rt = $this->_weixin_template_access_token(); if (!$rt['code']) { return dr_return_data(0, $rt['msg']); } $p = [ 'touser' => $oid, 'template_id' => $id, 'url' => $url, 'topcolor' => $color, 'data' => $data, ]; $rt = wx_post_https_json_data('https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$rt['data']['access_token'], $p); return $rt; } // 复制 public function copy_edit() { $id = intval(\Phpcmf\Service::L('input')->get('id')); $data = \Phpcmf\Service::M()->db->table(weixin_wxtable('template'))->where('id', $id)->get()->getRowArray(); if (!$data) { $this->_json(0, dr_lang('数据#%s不存在', $id)); } unset($data['id']); $data['title'].= '_copy'; $rt = \Phpcmf\Service::M()->table(weixin_wxtable('template'))->insert($data); if (!$rt['code']) { $this->_json(0, dr_lang($rt['msg'])); } $this->_json(1, dr_lang('复制成功')); } /** * 获取内容 * $id 内容id,新增为0 * */ protected function _Data($id = 0) { $data = parent::_Data($id); if (!$data) { return []; } $data['content'] = dr_string2array($data['content']); return $data; } // 格式化保存数据 protected function _Format_Data($id, $data, $old) { $data[1] = \Phpcmf\Service::L('input')->post('data'); $data[1]['content'] = dr_array2string($data[1]['content']); if (!$id) { // 当提交新数据时,把当前时间插入进去 $data[1]['counts'] = 0; $data[1]['inputtime'] = SYS_TIME; } return $data; } }