怎么實(shí)現(xiàn)小程序發(fā)送服務(wù)通知-創(chuàng)新互聯(lián)

這篇文章主要介紹了怎么實(shí)現(xiàn)小程序發(fā)送服務(wù)通知,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)南充,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220

如何實(shí)現(xiàn)小程序發(fā)送服務(wù)通知?

小程序給用戶發(fā)送消息需要比較多的驗(yàn)證,剛剛遇到這個(gè)需求可能會(huì)花較長(zhǎng)時(shí)間研究測(cè)試,所以從基礎(chǔ)整理了一整套發(fā)送消息的邏輯,為以后開(kāi)發(fā)消息通知功能提供思路,減少學(xué)習(xí)時(shí)間

發(fā)送模板消息主要有以下幾個(gè)部分

一、獲取access_token

二、建立消息模板

三、獲取form_id

四、發(fā)送消息通知

五、設(shè)定定時(shí)任務(wù)

一、獲取access_token

向微信請(qǐng)求發(fā)送消息時(shí),會(huì)需要到access_token,access_token相當(dāng)于是小程序的身份證,雖然有appid和appsecret這2個(gè)證明,但是微信為了保證安全性,就用了access_token這個(gè)有時(shí)效的身份證明來(lái)驗(yàn)證,一條access_token只有2小時(shí)有效期,而且單個(gè)小程序1天只能請(qǐng)求1000次access_token,所以我們需要一套邏輯來(lái)保證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
}

再設(shè)置一個(gè)定時(shí)器每小時(shí)觸發(fā)一次該接口,之后就可以隨意取出肯定能用的token了

$token = db('token')->find();
$token = $token['access_token'];

二、建立消息模板

在小程序微信公眾平臺(tái)的左邊欄有一個(gè)模板消息的選項(xiàng)卡,只需要按照文檔添加一個(gè)模板消息,就可以得到對(duì)應(yīng)的對(duì)應(yīng)的模板ID,這一步基本都是網(wǎng)頁(yè)自行操作,不作更多展示

三、獲取form_id

微信為了防止小程序?qū)τ脩暨M(jìn)行過(guò)多消息通知,對(duì)消息通知進(jìn)行了一個(gè)限制,每發(fā)送一條消息通知,就需要一條form_id或者prepay_id

prepay_id是用戶在使用微信支付之后返回的Id,本文中不做詳解

form_id是與button綁定的Id,每當(dāng)用戶點(diǎn)擊綁定過(guò)的button就會(huì)返回一條form_id,一條form_id的有效期是7天,且每個(gè)用戶的form_id只能對(duì)該用戶使用,所以我們需要一個(gè)專門的邏輯來(lái)保存和使用form_id

①設(shè)計(jì)form_id表結(jié)構(gòu)
form_id有2個(gè)條件,第一個(gè)是僅7天內(nèi)有效,第二個(gè)是僅對(duì)創(chuàng)建form_id的用戶有效,針對(duì)這2個(gè)要求建立如下表
創(chuàng)建時(shí)間用戶id
idcreateTimeopenIdform_id
id作為主鍵自增不用解釋
createTime作為找到過(guò)期form_id的標(biāo)志,設(shè)置定時(shí)任務(wù),刪除過(guò)期form_id
openId用來(lái)找到用戶自己的form_id來(lái)使用
②取到form_id
<!--pages/index/index.wxml-->
<form  report-submit='ture' bindsubmit='form_id'>
    <button form-type="submit">確定</button>
</form>
// 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//自行獲取當(dāng)前用戶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;}//過(guò)濾開(kāi)發(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'];
}
④定時(shí)刪除過(guò)期form_id
public function test(){
    $time = time()-518400;//保證form_id可用性刪除6天前的form_id
    db('form_id')->where('createTime','<',$time)->delete();
    //將該方法每天執(zhí)行一次
}

四、發(fā)送消息通知

當(dāng)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,//本消息點(diǎn)擊后跳轉(zhuǎn)到的頁(yè)面
        "form_id"   =>  $form_id,
        'data'  =>  [
            'keyword1'  =>  [
                'value' =>  $title
            ],
            'keyword2'  =>  [
                'value' =>  $data1
            ],
            'keyword3'  =>  [
                'value' =>  $data2
            ]
        ],
        'emphasis_keyword'  =>  "keyword1.DATA"//消息中要放大的內(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;
}

五、設(shè)定定時(shí)任務(wù)

為了保證上述操作都能順利進(jìn)行,我們需要設(shè)定幾個(gè)定時(shí)任務(wù)來(lái)幫助消息發(fā)送,先假設(shè)有幾個(gè)方法

getToken //每小時(shí)更新一次token

delForm_id //每天刪除一次6天前的form_id

message //每分鐘執(zhí)行一次發(fā)送消息

首先連接上服務(wù)器打開(kāi)定時(shí)任務(wù)設(shè)置

crontab -e

設(shè)置中的每一行就是一個(gè)定時(shí)任務(wù),分成3個(gè)部分

1.* * * * *
這5個(gè)參數(shù)分別表示定時(shí)任務(wù)的執(zhí)行時(shí)間,每個(gè)參數(shù)與上個(gè)參數(shù)隔一個(gè)空格,分別為(分)(時(shí))(天)(月)(星期),下面舉例子
* * * * *//每分鐘執(zhí)行一次
0 * * * *//每小時(shí)的第0分鐘執(zhí)行一次
*/5 * * * *//每5分鐘執(zhí)行一次
* 23 * * *//每天的23點(diǎn)執(zhí)行一次
* * 1 * *//每月1號(hào)執(zhí)行一次
* * * */2 *//每2個(gè)月執(zhí)行一次
0 0 * * 6//每周6的0點(diǎn)0分執(zhí)行一次

2./usr/bin/php

這是php執(zhí)行文件的路徑,如果cd到該路徑,給出php執(zhí)行文件路徑就會(huì)執(zhí)行php文件,可以用來(lái)測(cè)試php文件是否可以設(shè)置定時(shí)任務(wù)

注意,這個(gè)路徑只是一個(gè)快捷方式,真正的php執(zhí)行文件在/usr/local/php/bin/php或者/usr/local/php(版本號(hào))/bin/php,如果在bin下沒(méi)有創(chuàng)建快捷方式請(qǐng)自行創(chuàng)建

3./項(xiàng)目路徑/執(zhí)行文件

這是需要執(zhí)行的php文件路徑,如果寫的是原生php,直接指到該文件即可,如果是用thinkphp框架寫的,那需要指到根目錄或者public目錄下的index.php,后邊跟上/模塊/控制器/方法

知道這3點(diǎn)我們就可以寫出上述3個(gè)定時(shí)任務(wù)

* */1 * * */usr/bin/php /項(xiàng)目路徑/index.php /index/index/getToken
* 4 * * */usr/bin/php /項(xiàng)目路徑/index.php /index/index/delForm_id
* * * * */usr/bin/php /項(xiàng)目路徑/index.php /index/index/message

最后,重啟一下定時(shí)任務(wù)

//CentOS5/CentOS6
/sbin/service crond restart
//CentOS7
/bin/systemctl restart crond.service

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享怎么實(shí)現(xiàn)小程序發(fā)送服務(wù)通知內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問(wèn)題就找創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!

新聞標(biāo)題:怎么實(shí)現(xiàn)小程序發(fā)送服務(wù)通知-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)源:http://muchs.cn/article48/codhep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、微信公眾號(hào)、微信小程序、App開(kāi)發(fā)電子商務(wù)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司