【小程式】手把手教你如何使用模板訊息通知(採用PHP作為後臺)
前言
模板訊息可以高效地傳遞訊息給使用者,從而更好地提升使用者體驗
需求
有這麼一個小程式,使用者可以在小程式中自定義事件提醒,小程式在使用者設定的時間中進行模板訊息通知
正題
模板訊息的傳送實際上是一個post請求過程
請求地址為
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN
使用post請求,並攜帶幾個必要的引數,
必要引數包括
模板ID(template_id)、表單ID(form_id)、介面呼叫憑證(access_token)、使用者openID(touser)
選填引數包括
點選模板後跳轉的頁面(page)、模板內容(data)、模板需要放大的關鍵詞(emphasis_keyword)
1、先獲取模板ID
小提示:如果模板庫中沒有你想要的模板,可以自己申請新增,申請步驟如下
(主要是比較麻煩,我之前申請過,就是一直稽核不了,最後直接使用已有的模板庫)
2.獲取formID
小程式中新建一個測試formID的例子
index.wxml
<!--index.wxml--> <input type='text' value='{{formID}}'></input> <form bindsubmit='submit' report-submit='true'> <button form-type='submit'>獲取formID</button> </form>
form表單中需要設定 report-submit='true' 來宣告需要傳送模板訊息,並繫結一個提交事件
點選button後將formID新增到input框中
index.js
//index.js
//獲取應用例項
Page({
submit: function(e){
console.log(e);
var formID = e.detail.formId;//獲取formID
this.setData({
formID: formID
});
}
})
新增submit事件,將formID賦值給index.wxml中
在模擬機中演示時,formId會顯示為 the formId is a mock one
真機中才會顯示出formId
把formId儲存起來(因為我直接將formId賦值給input框,所以可以直接在input中複製)
3e3c0fc9a2b82959f07a2bf924ab8185
3.獲取介面呼叫憑證access_token
這個就簡單了
我已經封裝好一個類,其中appID跟secret需要自己修改一下
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=你的APPID&secret=你的APPSECRET
即使用get請求上面的url,即可返回access_token
class resAccTok{
private $appID = '你的appID';
private $secret = '你的secret';
public $access_token = null;
public function __construct(){
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appID.'&secret='.$this->secret;
$this->access_token = json_decode(file_get_contents($url), true);
return $this->access_token;
}
}
使用方法
$result = new resAccTok();
$access_token = $result->access_token['access_token'];
echo $access_token;
4.獲取openID
獲取openID需要配合小程式中的wx.login一起用
wx.login程式碼如下
wx.login({
success: function (res) {
console.log(res)
wx.request({
url: 'https://xxxxxx/resOpenID.php',
data: {
code: res.code
},
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'POST',
success: function (e) {
console.log(e)
var openID = e.data.openid;//返回openID
}
})
}
})
resOpenID.php的程式碼如下
class resOpenID{
private $appID = '你的appID'; //小程式appID
private $secret = '你的secret'; //小程式secret
public function __construct($code){
print_r(file_get_contents('https://api.weixin.qq.com/sns/jscode2session?appid='.$this->appID.'&secret='.$this->secret.'&js_code='.$code.'&grant_type=authorization_code'));
}
}
new resOpenID($_POST['code']);
必要的四個引數已經獲取完畢,接下來講一下選填的引數
點選模板後跳轉的頁面(page)、模板內容(data)、模板需要放大的關鍵詞(emphasis_keyword)
page:使用者點選模板後跳轉的頁面,比如你想讓使用者點選後跳轉到index頁面,可以這麼寫"pages" : "pages/index/index"
data:模板的內容,如果不填,則傳送空模板,data的格式如下
"data": {
"keyword1": {
"value": "學習PHP"
},
"keyword2": {
"value": "09:00"
},
"keyword3": {
"value": "記得回顧昨天的知識"
}
}
其中keyword1、keyword2、keyword3分別對應剛剛新增模板的“日程主題”、“提醒時間”、“備註”
emphasis_keyword:模板需要放大的關鍵詞,不填則預設無放大,格式如下
"emphasis_keyword": "keyword1.DATA"
將關鍵詞1進行放大
傳送模板訊息請求程式碼
我已經封裝了一個簡易的類
sendTemp.php程式碼如下
require_once 'resAccTok.php';
require_once 'curlRequest.php';
date_default_timezone_set('Asia/Shanghai');
class sendTemp extends resAccTok{
public $access_token = null;
private $url = null; //請求的地址
private $data = array();//需要傳送請求的資料
private $openID = null; //使用者的openID
private $formID = null;//表單提交場景下,為 submit 事件帶上的 formId;支付場景下,為本次支付的 prepay_id
private $value1 = '學習PHP';//傳送模板時傳遞的日程主題
private $value2 = '23:40';//傳送模板時傳遞的提醒時間(當前時間)
private $value3 = '記得回顧昨天的知識';//傳送模板時傳遞的備註
public function __construct($openID , $formID){
$this->value2 = date('H:i');
$result = parent::__construct();
if (7200 == $result['expires_in']){//成功獲取access_token
$this->access_token = $result['access_token'];
}
$this->openID = $openID;
$this->formID = $formID;
$this->url = 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$this->access_token;
$this->packageData();
}
/**
* 將資料打包
*/
public function packageData(){
$this->data = [
"touser" => $this->openID,//接收者(使用者)的 openid
"template_id" => "w2dq_rw8q4Kuc9MZnOr_vXJiPAIlU0oBbaGhIZRPaLw",//所需下發的模板訊息的id
"page" => "page/index/index",//點選模板卡片後的跳轉頁面,僅限本小程式內的頁面。支援帶引數,(示例index?foo=bar)。該欄位不填則模板無跳轉。
"form_id" => $this->formID,//表單提交場景下,為 submit 事件帶上的 formId;支付場景下,為本次支付的 prepay_id
"data" => [//模板內容,不填則下發空模板
"keyword1" => [
"value" => $this->value1
],
"keyword2" => [
"value" => $this->value2
],
"keyword3" => [
"value" => $this->value3
]
]
// "emphasis_keyword" => "keyword1.DATA"//模板需要放大的關鍵詞,不填則預設無放大
];
$this->send();
}
public function send(){
$result = posturl($this->url, $this->data);
print_r($result);
}
}
new sendTemp($_POST['openID'],$_POST['formID']);
curlRequest.php是一個已經封裝好的curl檔案
程式碼如下:
<?php
/**
* 一個封裝好的curl請求
* Date: 2018/11/15
* Time: 22:45
*/
/**
* @param $url
* @return mixed
*/
function geturl($url){
$headerArray =array("Content-type:application/json;","Accept:application/json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
return $output;
}
/**
* @param $url
* @param $data
* @return mixed
*/
function posturl($url,$data){
$data = json_encode($data);
$headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return json_decode($output,true);
}
/**
* @param $url
* @param $data
* @return mixed
*/
function puturl($url,$data){
$data = json_encode($data);
$ch = curl_init(); //初始化CURL控制代碼
curl_setopt($ch, CURLOPT_URL, $url); //設定請求的URL
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //設為TRUE把curl_exec()結果轉化為字串,而不是直接輸出
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //設定請求方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//設定提交的字串
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output,true);
}
/**
* @param $url
* @param $data
* @return mixed
*/
function delurl($url,$data){
$data = json_encode($data);
$ch = curl_init();
curl_setopt ($ch,CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
return $output;
}
/**
* @param $url
* @param $data
* @return mixed
*/
function patchurl($url,$data){
$data = json_encode($data);
$ch = curl_init();
curl_setopt ($ch,CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data); //20170611修改介面,用/id的方式傳遞,直接寫在url中了
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output);
return $output;
}
使用postman測試模板資訊傳送
傳送請求到sendTemp.php
並攜帶openID跟formID(剛剛獲得的3e3c0fc9a2b82959f07a2bf924ab8185)
傳送成功,教程結束 !!!
總結
如果別人嘲笑你,那就讓別人嘲笑去吧
每天積累一小步,堅持
追自己想追的夢,做自己想做的事,加油——共勉