1. 程式人生 > >【小程式】手把手教你如何使用模板訊息通知(採用PHP作為後臺)

【小程式】手把手教你如何使用模板訊息通知(採用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)

傳送成功,教程結束 !!!

總結

如果別人嘲笑你,那就讓別人嘲笑去吧

每天積累一小步,堅持

追自己想追的夢,做自己想做的事,加油——共勉