讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 25.6.2 群發通知實現 >

25.6.2 群發通知實現

本項目中群發通知時,先獲取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 群發通知效果

如果群發的用戶很多,使用輪詢一對一發送的方式將出現極大的延遲,這時需要考慮使用其他方式異步執行,如使用隊列的方式。