本项目中群发通知时,先获取48小时内有交互用户的数量,并获取上次已经保存的群发消息,其相应代码如下。
1 public function index
2 {
3 // 48小时内有交互的用户
4 $condition['heartbeat'] = array('gt',(time - 172800));
5 $list = Db::name('user')->where($condition)->select;
6
7 // 获取用户数
8 $this->assign('total', count($list));
9
10 // 获取已有消息
11 $message = MessageModel::get(1);
12 $this->assign('message', $message->toArray);
13
14 // 渲染模板输出
15 return $this->fetch;
16 }
模板页面的代码如下。
1 <form action="{:Url('message/send')}" method="post">
2 <table cellpadding=0 cellspacing=0 >
3 <tr>
4 <td>覆盖人数</td>
5 <td><font color="blue">{$total}</font></td>
6 </tr>
7 <tr>
8 <td>消息类型</td>
9 <td><input type="text" name="type" size="50"></td>
10 </tr>
11 <tr>
12 <td>图文标题</td>
13 <td><input type="text" name="title" size="50"></td>
14 </tr>
15 <tr>
16 <td>图文详情</td>
17 <td><textarea name="description" rows="3" cols="60" size=
"50">{$message.description}</textarea></td>
18 </tr>
19 <tr>
20 <td>图片地址</td>
21 <td><input type="text" name="picurl" size="50"></td>
22 </tr>
23 <tr>
24 <td>跳转地址</td>
25 <td><input type="text" name="url" size="100"></td>
26 </tr>
27 <tr>
28 <td><font color="red"><strong>*注意:</strong></font></td>
29 <td><font color="red">务必确认信息正确一致,点击发送后将马上启动发送程序并且
无法撤销。</font></td>
30 </tr>
31 </table>
32 <p>
33 <input type="hidden" name="id" />
34 <INPUT TYPE="submit" >
35 </p>
36 </form>
群发配置页面效果如图25-8所示。
图25-8 群发配置界面
当点击“发送”按钮后,send函数将接收到通过POST传输过来的参数。将这些参数拼装成一个图文消息,然后获取48小时内有互动的用户列表,接着使用客服接口对用户列表进行遍历发送,就实现了群发图文通知的功能。其相应代码如下。
1 public function send
2 {
3 // 更新并存储当前消息
4 $message = new MessageModel;
5 $message->save(['title' => $_POST['title'],
6 'description' => $_POST['description'],
7 'picurl' => $_POST['picurl'],
8 'url' => $_POST['url'],
9 'date' => date("Ymd",time)
10 ],['id' => $_POST['id']]);
11
12 // 获取48小时内有互动的用户列表
13 $condition['heartbeat'] = array('gt',(time - 172800));
14 $userlist = Db::name('user')->where($condition)->select;
15
16 // 准备微信类及群发图文
17 $weixin = new \weixin\Wxapi;
18 $data = array;
19 $data = array("title"=>$_POST['title'], "description"=>$_POST['description'],
"picurl"=>$_POST['picurl'], "url" =>$_POST['url']);
20
21 // 遍历发送
22 $array = array;
23 foreach ($userlist as &$user) {
24 $openid = $user['openid'];
25 $result = $weixin->send_custom_message($openid, "news", $data);
26 var_dump($openid);
27 var_dump($result);
28 }
29 }
用户收到的图文消息如图25-9所示。
图25-9 群发通知效果
如果群发的用户很多,使用轮询一对一发送的方式将出现极大的延迟,这时需要考虑使用其他方式异步执行,如使用队列的方式。