array ( 'value' => '测试活动', ), 'keyword2' => array ( 'value' => date('Y-m-d H:i:s'), ), 'keyword3' => array ( 'value' => '欢迎参加', ), ); $data = json_encode($data); //Dever::setInput('touser', 'oIZ895bO9a_TT_ouYCQLPFMod57c'); //Dever::setInput('touser', 'oIZ895bO9a_TT_ouYCQLPFMod57c'); Dever::setInput('page', $page); Dever::setInput('data', $data); //Dever::setInput('form_id', '1526295575657'); Dever::setInput('key', 'act'); Dever::setInput('project_id', '2'); $type = Dever::input('type', 1); if ($type == 1) { return $this->send(); } else { return $this->sendMul(); } } # 发送单条模板消息 public function send() { $key = Dever::input('key'); $project_id = Dever::input('project_id'); $touser = Dever::input('touser'); $page = Dever::input('page'); //$data = json_encode(Dever::input('data')); $data = Dever::input('data'); $form_id = Dever::input('form_id'); $emphasis_keyword = Dever::input('emphasis_keyword'); $this->sendOne($key, $project_id, $touser, $page, $data, $form_id, $emphasis_keyword); return 'ok'; } # 发送单条模板消息 public function sendOne($key, $project_id, $touser, $path, $data, $form_id = false, $emphasis_keyword = '', $state = false) { if ($project_id > 0 && $key && $touser && $path && $data) { $info = Dever::db('wechat_applet/msg')->one(array('option_key' => $key, 'option_project_id' => $project_id)); if ($info) { $update = array(); $update['project_id'] = $info['project_id']; $update['msg_id'] = $info['id']; $update['touser'] = $touser; $update['path'] = $path; $update['data'] = $data; $update['form_id'] = $form_id; $update['status'] = 1; $update['emphasis_keyword'] = $emphasis_keyword; if (!$update['form_id']) { $update['form_id'] = $this->getFormId($info['project_id'], $update['touser']); } if (!$update['form_id']) { return; } $where = array(); $where['option_msg_id'] = $info['id']; $where['option_touser'] = $update['touser']; //$where['option_data'] = $update['data']; //$where['option_form_id'] = $update['form_id']; $where['option_path'] = $update['path']; $id = Dever::upinto('wechat_applet/msg_log', $where, $update); Core::run($info['project_id'], 'send_msg', 'msg.sendAction', 'msg.sendLog', 'wechat_applet', $id, $state); } } } public function submit() { # 立刻发送 $id = Dever::input('id'); if ($id > 0) { $info = Dever::db('wechat_applet/msg_send')->one($id); if ($info) { $project = explode(',', $info['project_id']); Dever::setInput('key', $info['key']); Dever::setInput('page', $info['page']); $send = $this->getData($info['content']); foreach ($project as $k => $v) { Dever::setInput('project_id', $v); $this->sendMul(); } } } Dever::alert('提交成功,请到模板消息日志中查看发送记录'); return; } # 解析data public function getData($data = false) { $send = Dever::input('data'); if (!$send && $data) { $send = array(); $data = json_decode(base64_decode($data), true); if ($data) { foreach ($data as $k => $v) { $send[$v['key']]['value'] = $v['value']; } $send = json_encode($send, JSON_UNESCAPED_UNICODE); Dever::setInput('data', $send); } } return $send; } # 发送多条模板消息 入队 public function sendMul() { $key = Dever::input('key'); $project_id = Dever::input('project_id'); $page = Dever::input('page'); $data = Dever::input('data'); $emphasis_keyword = Dever::input('emphasis_keyword'); if ($project_id > 0 && $key && $page && $data) { # 获取所有拥有formid的openid,并去重 $list = Dever::db('wechat_applet/msg_form')->getAllGroupByOpenid(array('option_project_id' => $project_id)); if ($list) { if (Dever::project('queue')) { Dever::import('queue'); foreach ($list as $k => $v) { if ($v['form_id']) { $param = array(); $param['key'] = $key; $param['project_id'] = $project_id; $param['touser'] = $v['openid']; $param['page'] = $page; $param['data'] = $data; $param['form_id'] = $v['form_id']; $param['emphasis_keyword'] = $emphasis_keyword; Dever::db('wechat_applet/msg_form')->delete($v['id']); Dever::push($param); } } } else { foreach ($list as $k => $v) { if ($v['form_id']) { $param = array(); $param['key'] = $key; $param['project_id'] = $project_id; $param['touser'] = $v['openid']; $param['page'] = $page; $param['data'] = $data; $param['form_id'] = $v['form_id']; $param['emphasis_keyword'] = $emphasis_keyword; Dever::db('wechat_applet/msg_form')->delete($v['id']); $this->sendOne($param['key'], $param['project_id'], $param['touser'], $param['page'], $param['data'], $param['form_id'], $daparamta['emphasis_keyword']); } } } } } return 'ok'; } # 发送多条模板消息 出队 每小时执行一次 public function cron() { Dever::import('queue'); $state = true;//同步发送 $total = 100; $num = 0; while($num < $total) { $data = Dever::pop(); if ($data) { $num++; $state = true; $this->sendOne($data['key'], $data['project_id'], $data['touser'], $data['page'], $data['data'], $data['form_id'], $data['emphasis_keyword'], $state); } else { $num = $total+1; } } return 'ok'; } public function getFormId($project_id, $openid) { # 获取一个form_id,取最新的100条,然后随机取 $info = Dever::db('wechat_applet/msg_form')->getAll(array('option_openid' => $openid, 'option_project_id' => $project_id)); if ($info) { $key = array_rand($info, 1); $info = $info[$key]; Dever::db('wechat_applet/msg_form')->delete($info['id']); return $info['form_id']; } else { return false; } } # 记录form_id 之后加上清理过期的form_id 七天过期 public function write_form_id() { $id = Dever::input('project_id'); if ($id > 0) { $update = array(); $update['project_id'] = $id; $update['form_id'] = Dever::input('form_id'); $update['openid'] = Dever::input('openid'); $where = array(); $where['option_openid'] = $update['openid']; $where['option_project_id'] = $update['project_id']; $where['option_form_id'] = $update['form_id']; $id = Dever::upinto('wechat_applet/msg_form', $where, $update); } return 'ok'; } public function sendAction($id) { $info = Dever::db('wechat_applet/msg_log')->one($id); if ($info) { $info['page'] = $info['path']; $msg = Dever::db('wechat_applet/msg')->one($info['msg_id']); $info['template_id'] = $msg['template_id']; if ($info['data']) { $info['data'] = json_decode($info['data'], true); } return $info; } else { die; } } public function sendLog($project_id, $data, $id = false) { $info = Dever::db('wechat_applet/msg_log')->one($id); if ($info) { $update['where_id'] = $info['id']; $update['result'] = json_encode($data); if ($data['errmsg'] == 'ok') { $update['status'] = 2; } else { $update['status'] = 3; } $update['num'] = $info['num'] + 1; Dever::db('wechat_applet/msg_log')->update($update); } } # 同步微信消息模板到本地 public function sync() { $project = Dever::db('token/project')->state(array('option_type' => 3)); if ($project) { foreach ($project as $k => $v) { Core::run($v['id'], 'get_msg', '', 'msg.load', 'wechat_applet'); } } return 'ok'; } public function load($project_id, $data, $param = false) { if (isset($data['list']) && $data['list']) { Dever::db('wechat_applet/msg')->updates(array('option_project_id' => $project_id, 'set_state' => 2)); foreach ($data['list'] as $k => $v) { $update = array(); $update['project_id'] = $project_id; $update['template_id'] = $v['template_id']; $update['content'] = $v['content']; $update['name'] = $v['title']; $update['example'] = $v['example']; $update['state'] = 1; $id = Dever::upinto('wechat_applet/msg', array('option_project_id' => $project_id, 'option_template_id' => $v['template_id']), $update); } } return array(); } }