| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 | <?php/*|--------------------------------------------------------------------------| 模板消息|--------------------------------------------------------------------------*/namespace Applet\Src;use Dever;use Main\Lib\Wechat;use Main\Lib\Core;class Msg{	# 发送模板消息	public function test()	{		$page = 'pages/index/index';		$data = array        (            'keyword1' => 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 = 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, $page, $data, $form_id, $emphasis_keyword = '', $state = false)	{		if ($project_id > 0 && $key && $touser && $page && $data) {			$info = Dever::db('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['page'] = $page;				$update['data'] = $data;				$update['form_id'] = $form_id;				$update['emphasis_keyword'] = $emphasis_keyword;				if (!$update['form_id']) {					$update['form_id'] = $this->getFormId($info['project_id'], $update['touser']);				}				$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_page'] = $update['page'];				$id = Dever::upinto('applet/msg_log', $where, $update);				Core::run($info['project_id'], 'send_msg', 'msg.sendAction', 'msg.sendLog', 'applet', $id, $state);			}		}	}	public function submit()	{		# 立刻发送		$id = Dever::input('id');		if ($id > 0) {			$info = Dever::db('applet/msg_send')->one($id);			if ($info) {				Dever::setInput('key', $info['key']);				Dever::setInput('project_id', $info['project_id']);				Dever::setInput('page', $info['page']);				$data = json_decode(base64_decode($info['content']), true);				if ($data) {					$send = array();					foreach ($data as $k => $v) {						$send[$v['key']] = $v['value'];					}					$send = json_encode($send, JSON_UNESCAPED_UNICODE);					Dever::setInput('data', $send);				}				$this->sendMul();			}		}		Dever::alert('提交成功,请到模板消息日志中查看发送记录');		return;	}	# 发送多条模板消息 入队	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('applet/msg_form')->getAllGroupByOpenid(array('option_project_id' => $project_id));			if ($list) {				Dever::import('queue');				foreach ($list as $k => $v) {					if (is_numeric($v['form_id']) && $v['openid'] == 'oIZ895adCNPtwyPX47Uv8ne8_xcM') {						$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('applet/msg_form')->delete($v['id']);						Dever::push($param);					}				}			}		}		return 'ok';	}	# 发送多条模板消息 出队 每小时执行一次	public function cron()	{		Dever::import('queue');		$state = true;		//如果是异步发送,每发送10次,休息3秒		$time = 3;		$num = 0;		$sync = true;//同步发送		while ($state == true) {			$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);				if ($sync == false && $num == 10) {					$num = 0;					sleep($time);				}			} else {				$state = false;			}		}		return 'ok';	}	public function getFormId($project_id, $openid)	{		# 获取一个form_id,取最新的100条,然后随机取		$info = Dever::db('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('applet/msg_form')->delete($info['id']);			return $info['form_id'];		} else {			Dever::alert('错误的form_id');		}	}	# 记录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('applet/msg_form', $where, $update);		}		return 'ok';	}	public function sendAction($id)	{		$info = Dever::db('applet/msg_log')->one($id);		if ($info) {			$msg = Dever::db('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('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('applet/msg_log')->update($update);		}	}	# 同步微信消息模板到本地	public function sync()	{		$project = Dever::db('main/project')->state(array('option_type' => 3));		if ($project) {			foreach ($project as $k => $v) {				Core::run($v['id'], 'get_msg', '', 'msg.load', 'applet');			}		}		return 'ok';	}	public function load($project_id, $data, $param = false)	{		if (isset($data['list']) && $data['list']) {			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'];				$id = Dever::upinto('applet/msg', array('option_project_id' => $project_id, 'option_template_id' => $v['template_id']), $update);			}		}		return array();	}}
 |