小程式如何使用訂閱訊息(PHP程式碼+小程式js程式碼)

語言: CN / TW / HK

點選進入“PHP開源社群”

免費獲取進階面試、文件、視訊資源

結合之前的摸爬滾打的點滴經驗,我給大家整理下,做到一文就能讓你明白[什麼是訂閱訊息?]、[如何使用訂閱訊息]、[開發訂閱訊息]。

1、什麼是小程式訂閱訊息?

可以實現給授權了的使用者進行訊息推送,推送一些指定的訊息,帶動使用者的點選,例如提醒使用者簽到,或者傳送一些獎勵到賬等通知,目的就是一個,帶動使用者的點選,留住老使用者。在這裡我們需要通過,小程式的後臺去開通訂閱訊息,訂閱訊息企業、個人都可以開通,機關部門可以申請長期訂閱模板、而其他的就只能選擇一次性模板。

訊息型別

  • 一次性訂閱訊息

一次性訂閱訊息用於解決使用者使用小程式後,後續服務環節的通知問題。使用者自主訂閱後,開發者可不限時間地下發一條對應的服務訊息;每條訊息可單獨訂閱或退訂。

  • 長期訂閱訊息

一次性訂閱訊息可滿足小程式的大部分服務場景需求,但線下公共服務領域存在一次性訂閱無法滿足的場景,如航班延誤,需根據航班實時動態來多次傳送訊息提醒。為便於服務,我們提供了長期性訂閱訊息,使用者訂閱一次後,開發者可長期下發多條訊息。

目前長期性訂閱訊息僅向政務民生、醫療、交通、金融、教育等線下公共服務開放,後期將逐步支援到其他線下公共服務業務。

  • 裝置訂閱訊息

裝置訂閱訊息是一種特殊型別的訂閱訊息,它屬於長期訂閱訊息型別,且需要完成「裝置接入」才能使用。

裝置訂閱訊息用於在裝置觸發某些需要人工介入的事件時(例如裝置發生故障、裝置耗材不足等),向用戶傳送訊息通知。詳見裝置訂閱訊息文件

  • 何為一次性模板?

簡明扼要來說,就是使用者授權一次可以獲取一次訊息,開發者不可以一直推送訊息打擾使用者

  • 訂閱訊息的格式

訂閱訊息是不可以隨便傳送的,需要對應到格式,包括字數長度等等,可以看這個,這是一個簽到模板。

看下他的詳情

這裡的thing1、thing5都由字數的規範,防止推送垃圾訊息,引流之類的

2、執行基本流程

前端通過元件介面使用者進行授權,後端通過定時觸發,將模板訊息觸發。可以通過寶塔的定時計劃來進行觸發,用到的各種鑑權,我們通過redis來儲存

3、開發步驟

第一步開通訂閱訊息

選擇訊息模板

注意:如果沒有想要的模板,去把小程式的服務類目多加幾個

小程式申請授權

一次性訂閱訊息、長期訂閱訊息,介面

wx.requestSubscribeMessage

程式碼:

wx.requestSubscribeMessage({

tmplIds: [],

})

上面的tmplIds裡面填寫的就是申請到的模板ID,例如我的

6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ

這裡之前做過測試多個模板id一次性授權,存在bug,只會取第一個有效,啥意思呢?就是像這樣

tmplIds: [‘1’,‘2’],



這個大家自己去測試

我們新建wxml檔案:

<view style="height: 100rpx;"></view>

<button>抽獎</button>

<view style="height: 100rpx;"></view>

<button type="primary" bindtap="sign_up">簽到</button>

<view style="height: 100rpx;"></view>

<button>購買</button>

<view style="height: 100rpx;"></view>

<button>分享</button>

註釋:1每個人能每天能分享一次,重複分享積分不算入

2邀請新使用者登入後加積分

新建js檔案:

// pages/share/share.js

Page({



/**

* 頁面的初始資料

*/

data: {



},

sign_up:function(){

wx.requestSubscribeMessage({

tmplIds: ['6io5lFLo4OEdNjl2_F********RZEm6RMdHLQ'],

})

},

/**

* 生命週期函式--監聽頁面載入

*/

onLoad(options) {



},



/**

* 生命週期函式--監聽頁面初次渲染完成

*/

onReady() {



},



/**

* 生命週期函式--監聽頁面顯示

*/

onShow() {



},



/**

* 生命週期函式--監聽頁面隱藏

*/

onHide() {



},



/**

* 生命週期函式--監聽頁面解除安裝

*/

onUnload() {



},



/**

* 頁面相關事件處理函式--監聽使用者下拉動作

*/

onPullDownRefresh() {



},



/**

* 頁面上拉觸底事件的處理函式

*/

onReachBottom() {



},



/**

* 使用者點選右上角分享

*/

onShareAppMessage() {



}

})



測試下可以正常授權

後端PHP封裝、redis配置

在api目錄下新建檔案 notify.php

<?php

// 微信小程式通知主要函式

//http_request 利用curl請求 兩個引數 url連線地址 資料資訊

function http_request($url,$data){

$ch = curl_init();//初始化

curl_setopt($ch, CURLOPT_URL, $url);//設定

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$output = curl_exec($ch);//執行

curl_close($ch);//關閉

return $output;//返回結果

}



//封裝方法



//簽到通知

function notify_sign($touser,$ACCESS_TOKEN,$order_num,$shop_name,$user_name9,$phone,$address)

{

$template=array(

'touser'=>"$touser",//接收方openid

'template_id'=>"8nHJ-TGMbPXBEROLpIEsba4ZMKt4lkJlJoEO5RcTYmk", //模板的id

'page'=>"pages/admin_order/admin_order",//點選小程式訂閱訊息跳轉的頁

'data'=>array(

// 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"),

'character_string12'=>array('value'=>"$order_num",'color'=>'#00008B'),

// 'amount4'=>array('value'=>"15",'color'=>'#00008B'),

'thing1'=>array('value'=>"$shop_name",'color'=>'#00008B'),

'thing8'=>array('value'=>"$user_name9",'color'=>'#00008B'),

'phone_number9'=>array('value'=>"$phone",'color'=>'#00008B'),

'thing11'=>array('value'=>"$address",'color'=>'#00008B')

)

// 'phrase1'=>array('value'=>urlencode($plan),'color'=>'#00008B'), //時間

);

$json_template=json_encode($template);

$url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;

$res=http_request($url,urldecode($json_template));

print_r($res);

}





?>

下載redis服務,記得開放6379埠

新建access_token.php檔案

通過定時任務對access_token的儲存,在快過期時呼叫更新,這裡說一次為啥不呼叫一次重新整理一次access_token就好了,弄這麼麻煩?因為當access_token重新整理後已經通知過的模板訊息就會失效,為了防止以前發的模板訊息失效,能最大程度降低失效,可以用定時器的方法更新access_token即可

再看下官方怎麼說的:

access_token 的儲存至少要保留 512 個字元空間;access_token 的有效期目前為 2 個小時,需定時重新整理,重複獲取將導致上次獲取的 access_token 失效;建議開發者使用中控伺服器統一獲取和重新整理 access_token,其他業務邏輯伺服器所使用的 access_token 均來自於該中控伺服器,不應該各自去重新整理,否則容易造成衝突,導致 access_token 覆蓋而影響業務;

<?php

//access_token

$appid="wxe20298c8e087576e";//小程式id

$secret="*****";//金鑰

$grant_type="client_credential";

$access_token=curl_get("https://api.weixin.qq.com/cgi-bin/token?appid=$appid&secret=$secret&grant_type=$grant_type");

echo $access_token;

function curl_get($url){



$header = array(

'Accept: application/json',

);

$curl = curl_init();

//設定抓取的url

curl_setopt($curl, CURLOPT_URL, $url);

//設定標頭檔案的資訊作為資料流輸出

curl_setopt($curl, CURLOPT_HEADER, 0);

// 超時設定,以秒為單位

curl_setopt($curl, CURLOPT_TIMEOUT, 1);



// 超時設定,以毫秒為單位

// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);



// 設定請求頭

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

//設定獲取的資訊以檔案流的形式返回,而不是直接輸出。

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

//執行命令

$data = curl_exec($curl);



// 顯示錯誤資訊

if (curl_error($curl)) {

print "Error: " . curl_error($curl);

} else {

$result=json_decode($data,true);

// $ACCESS_TOKEN=$result['access_token'];

curl_close($curl);//關閉連線

// return $result['access_token'];

// //存入到redis

// // 如果未修改php.ini下面兩行註釋去掉

ini_set('session.save_handler', 'redis');

ini_set('session.save_path', 'tcp://127.0.0.1:6379');

$redis = new redis();

$redis->connect('127.0.0.1', 6379);

$redis->set('kuaiquyin_wx_token',$result['access_token']);

echo $redis->get('kuaiquyin_wx_token');

}

}

?>

我們訪問測試下:

設計定時器觸發更新access_token

修改notify.php檔案

開啟小程式模板的詳情我們進行替換,例如我的:

那就需要把內容的資料替換

替換後notify.php檔案如下:

<?php

// 微信小程式通知主要函式

//http_request 利用curl請求 兩個引數 url連線地址 資料資訊

function http_request($url,$data){

$ch = curl_init();//初始化

curl_setopt($ch, CURLOPT_URL, $url);//設定

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$output = curl_exec($ch);//執行

curl_close($ch);//關閉

return $output;//返回結果

}



//封裝方法



//簽到

function notify_sign($touser,$ACCESS_TOKEN)

{

$template=array(

'touser'=>"$touser",//接收方openid

'template_id'=>"6io5lFL**********HLQ", //模板的id

'page'=>"pages/jifen/jifen",//點選小程式訂閱訊息跳轉的頁

'data'=>array(

// 'character_string1'=>array('value'=>"$out_trade_no",'color'=>"#00008B"),

'thing1'=>array('value'=>"積分簽到提醒",'color'=>'#00008B'),

// 'amount4'=>array('value'=>"15",'color'=>'#00008B'),

'thing2'=>array('value'=>"簽到獲得10積分",'color'=>'#00008B'),

'thing5'=>array('value'=>"點選立即簽到",'color'=>'#00008B'),

'phrase6'=>array('value'=>"今天還沒簽到哦",'color'=>'#00008B')

)

// 'phrase1'=>array('value'=>urlencode($plan),'color'=>'#00008B'), //時間

);

$json_template=json_encode($template);

$url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;

$res=http_request($url,urldecode($json_template));

print_r($res);

}





?>

測試

通過定時計劃我們先觸發一次access_token的獲取

然後新建sign.php檔案

寫入程式碼

<?php

//簽到通知

header("Content-type:text/html;charset=utf-8");//字元編碼設定



//通知

include 'notify.php';//引用通知模板檔案

ini_set('session.save_handler', 'redis');

ini_set('session.save_path', 'tcp://127.0.0.1:6379');

$redis = new redis();

$redis->connect('127.0.0.1', 6379);

$redius_token=$redis->get('kuaiquyin_wx_token');//鑑權



// $name=mb_substr($name,0,10,'utf-8');

notify_sign("你的openid",$redius_token,$name);



openid是小程式登陸後給的,可以去參考其他文章,這裡不做說明

例如我的openid

寫入後,去小程式點選簽到授權

訪問後報錯:

我們看一下是啥錯誤

不好意思:smile:忘記改了,忘記改openid了

改了之後:

微信成功收到訊息

以上就是一個簡單的記錄,也方便自己以後使用,也希望能幫助到有這個困擾的你,謝謝支援!

如果你年滿18週歲以上,又覺得學【PHP】太難?想嘗試其他程式語言,那麼我推薦你學Python,現有價值499元Python零基礎課程限時免費領取,限10個名額!

掃描二維碼-免費領取

點選“檢視原文”獲取更多