這篇文章主要介紹了怎么實現(xiàn)小程序發(fā)送服務通知,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設、成都網(wǎng)站制作、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務南充,十年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220如何實現(xiàn)小程序發(fā)送服務通知?
小程序給用戶發(fā)送消息需要比較多的驗證,剛剛遇到這個需求可能會花較長時間研究測試,所以從基礎整理了一整套發(fā)送消息的邏輯,為以后開發(fā)消息通知功能提供思路,減少學習時間
發(fā)送模板消息主要有以下幾個部分
一、獲取access_token
二、建立消息模板
三、獲取form_id
四、發(fā)送消息通知
五、設定定時任務
一、獲取access_token
向微信請求發(fā)送消息時,會需要到access_token,access_token相當于是小程序的身份證,雖然有appid和appsecret這2個證明,但是微信為了保證安全性,就用了access_token這個有時效的身份證明來驗證,一條access_token只有2小時有效期,而且單個小程序1天只能請求1000次access_token,所以我們需要一套邏輯來保證access_token的可用性
/tupian/20230522/token>public function test(){ $appId = ''; $appSecret = ''; $token = file_get_contents("/tupian/20230522/token $token = json_decode($token); $token = $token->access_token; db('token')->where('id',1)->update(['access_token'=>$token]);//覆蓋上一條access_token }
再設置一個定時器每小時觸發(fā)一次該接口,之后就可以隨意取出肯定能用的token了
$token = db('token')->find(); $token = $token['access_token'];
二、建立消息模板
在小程序微信公眾平臺的左邊欄有一個模板消息的選項卡,只需要按照文檔添加一個模板消息,就可以得到對應的對應的模板ID,這一步基本都是網(wǎng)頁自行操作,不作更多展示
三、獲取form_id
微信為了防止小程序對用戶進行過多消息通知,對消息通知進行了一個限制,每發(fā)送一條消息通知,就需要一條form_id或者prepay_id
prepay_id是用戶在使用微信支付之后返回的Id,本文中不做詳解
form_id是與button綁定的Id,每當用戶點擊綁定過的button就會返回一條form_id,一條form_id的有效期是7天,且每個用戶的form_id只能對該用戶使用,所以我們需要一個專門的邏輯來保存和使用form_id
①設計form_id表結構 form_id有2個條件,第一個是僅7天內(nèi)有效,第二個是僅對創(chuàng)建form_id的用戶有效,針對這2個要求建立如下表 創(chuàng)建時間用戶id idcreateTimeopenIdform_id id作為主鍵自增不用解釋 createTime作為找到過期form_id的標志,設置定時任務,刪除過期form_id openId用來找到用戶自己的form_id來使用 ②取到form_id// pages/index/index.js form_id: function(e) { wx.request({ url: 'test.com/index/index/form_id',//自行替換接口 method: "POST", data: { form_id: e.detail.formId, openId: openId//自行獲取當前用戶openId }, header: { 'content-type': 'application/x-www-form-urlencoded' } }) }, //test.com/index/index/form_id public function form_id(){ if (empty($_POST)) {die;} $form_id = $_POST['form_id']; if ($form_id == 'the formId is a mock one'){die;}//過濾開發(fā)工具生成的form_id $openId = $_POST['openId']; if (!$openId) {die;} $data = compact('form_id','openId'); db('form_id')->insert($data); } ③使用form_id public function test(){ $openId = ''; $form_id = db('form_id')->where('openId',$openId)->order('id')->field('form_id')->find(); $form_id = $form_id['form_id']; } ④定時刪除過期form_id public function test(){ $time = time()-518400;//保證form_id可用性刪除6天前的form_id db('form_id')->where('createTime','<',$time)->delete(); //將該方法每天執(zhí)行一次 }
四、發(fā)送消息通知
當access_token和form_id都保證可用之后,就可以給用戶發(fā)送消息通知了
public function message($data){ //獲取form_id $form_id = db('form_id')->where('openId',$openId)->order('id')->find(); if (!$form_id) {die;} $form_id = $form_id['form_id']; db('form_id')->where('form_id',$form_id)->delete(); //獲取access_token $access_token = db('token')->where('id',1)->find(); $access_token = $access_token['access_token']; //獲取消息內(nèi)容 $openId = $data['openId']; $title = $data['title']; $data1 = $data['data1']; $data2 = $data['data2']; $request_url='/tupian/20230522/send $request_data=[ 'touser' => $openId, 'template_id' => '',//表id 'page' => 'pages/test/test?data1='.$data1.'&data2='.$data2,//本消息點擊后跳轉到的頁面 "form_id" => $form_id, 'data' => [ 'keyword1' => [ 'value' => $title ], 'keyword2' => [ 'value' => $data1 ], 'keyword3' => [ 'value' => $data2 ] ], 'emphasis_keyword' => "keyword1.DATA"http://消息中要放大的內(nèi)容 ]; $return=json_decode($this->request($request_url,$request_data),true);//發(fā)送消息,并讀取返回值 return $return; } //上面的$this->request方法 public function request($url, $data=null) { $headers=array('Content-type:application/json;charset=UTF-8','Accept:application/json','Cache-Control:no-cache','Pragma:no-cache'); $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); if (!empty($data)) { $data=json_encode($data); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $output=curl_exec($curl); curl_close($curl); return $output; }
五、設定定時任務
為了保證上述操作都能順利進行,我們需要設定幾個定時任務來幫助消息發(fā)送,先假設有幾個方法
getToken //每小時更新一次token
delForm_id //每天刪除一次6天前的form_id
message //每分鐘執(zhí)行一次發(fā)送消息
首先連接上服務器打開定時任務設置
crontab -e
設置中的每一行就是一個定時任務,分成3個部分
1.* * * * * 這5個參數(shù)分別表示定時任務的執(zhí)行時間,每個參數(shù)與上個參數(shù)隔一個空格,分別為(分)(時)(天)(月)(星期),下面舉例子 * * * * *//每分鐘執(zhí)行一次 0 * * * *//每小時的第0分鐘執(zhí)行一次 */5 * * * *//每5分鐘執(zhí)行一次 * 23 * * *//每天的23點執(zhí)行一次 * * 1 * *//每月1號執(zhí)行一次 * * * */2 *//每2個月執(zhí)行一次 0 0 * * 6//每周6的0點0分執(zhí)行一次
2./usr/bin/php
這是php執(zhí)行文件的路徑,如果cd到該路徑,給出php執(zhí)行文件路徑就會執(zhí)行php文件,可以用來測試php文件是否可以設置定時任務
注意,這個路徑只是一個快捷方式,真正的php執(zhí)行文件在/usr/local/php/bin/php
或者/usr/local/php
(版本號)/bin/php
,如果在bin下沒有創(chuàng)建快捷方式請自行創(chuàng)建
3./項目路徑/執(zhí)行文件
這是需要執(zhí)行的php文件路徑,如果寫的是原生php,直接指到該文件即可,如果是用thinkphp框架寫的,那需要指到根目錄或者public目錄下的index.php,后邊跟上/模塊/控制器/方法
知道這3點我們就可以寫出上述3個定時任務
* */1 * * */usr/bin/php /項目路徑/index.php /index/index/getToken * 4 * * */usr/bin/php /項目路徑/index.php /index/index/delForm_id * * * * */usr/bin/php /項目路徑/index.php /index/index/message
最后,重啟一下定時任務
//CentOS5/CentOS6 /sbin/service crond restart //CentOS7 /bin/systemctl restart crond.service
感謝你能夠認真閱讀完這篇文章,希望小編分享怎么實現(xiàn)小程序發(fā)送服務通知內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設公司,,關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián)網(wǎng)站建設公司,,詳細的解決方法等著你來學習!