本項目中群發通知時,先獲取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 群發通知效果
如果群發的用戶很多,使用輪詢一對一發送的方式將出現極大的延遲,這時需要考慮使用其他方式異步執行,如使用隊列的方式。