微信小程序發送訂閱消息(之前是模板消息)

  • 2020 年 8 月 24 日
  • 筆記

之前的模板消息已經廢棄,現在改為訂閱消息,訂閱消息發佈前,需要用戶確認後才能接收訂閱消息。

小程序端
index.wxml

<button bindtap="send">發送訂閱消息</button>

index.js

const app = getApp()
Page({
  data: {
  },

send:function(){
    wx.requestSubscribeMessage({  
      tmplIds: ['WZiCliW1zVtHXqX7dGnFNmFvxhW-wd9S_W4WfrwNvss'],  
      success:(res)=> {
        wx.request({
          url: '//www.xxx.com/send.php',
          data: {
            openid:'要推送的openid',
            template_id:'要使用的template_id',
          },
          header: {
            'content-type': 'application/json'
          },
          success (res) {
            if(res.data.errcode == '43101'){
              console.log("拒絕訂閱消息")
            }else if(res.data.errcode == '0'){
              console.log("發送訂閱消息")
            }else{
              console.log("未知錯誤")
            }
          }
        })
      }
    })
  }
)}

後端
send.php

<?php
//設置 header 
header("Content-type:application/json");

//接收參數
$template_id = $_GET["template_id"];
$openid = $_GET["openid"];

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

// 獲取access_token
// include '';
require_once("access_token.php");

//目標服務器地址 
curl_setopt($ch, CURLOPT_URL, '//api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token='.$access_token);

//設置要POST的數據
curl_setopt($ch, CURLOPT_POST, true);
$data = '{
  "touser": $openid,
  "template_id": $template_id,
  "page": "pages/index/index",// 要跳轉的頁面
  "miniprogram_state":"developer",
  "lang":"zh_CN",
  "data": {
      "thing4": {
          "value": "歡迎使用專插本最前線小程序"
      },
      "thing5": {
          "value": "小程序由公眾號:廣東專插本最前線開發"
      }
  }
}';
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");

// 對認證證書來源的檢查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// 從證書中檢查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

//獲取的信息以文件流的形式返回,而不是直接輸出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//發起請求
$result = curl_exec($ch);
echo $result;

//關閉請求
curl_close($ch);
?>

access_token.php

<?php
// 聲明頁面header
header("Content-type:charset=utf-8");

// APPID、APPSECRET
$appid = "你的小程序APPID";
$appsecret = "你的小程序APPSECRET";

// 獲取access_token和jsapi_ticket
function getToken(){
    $file = file_get_contents("access_token.json",true);//讀取access_token.json裏面的數據
    $result = json_decode($file,true);

//判斷access_token是否在有效期內,如果在有效期則獲取緩存的access_token
//如果過期了則請求接口生成新的access_token並且緩存access_token.json
if (time() > $result['expires']){
        $data = array();
        $data['access_token'] = getNewToken();
        $data['expires'] = time()+7000;
        $jsonStr =  json_encode($data);
        $fp = fopen("access_token.json", "w");
        fwrite($fp, $jsonStr);
        fclose($fp);
        return $data['access_token'];
    }else{
        return $result['access_token'];
    }
}
 
//獲取新的access_token
function getNewToken($appid,$appsecret){
    global $appid;
    global $appsecret;
    $url = "//api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret."";
    $access_token_Arr =  file_get_contents($url);
    $token_jsonarr = json_decode($access_token_Arr, true);
    return $token_jsonarr["access_token"];
}

$access_token = getToken();
?>

邏輯
1、通過button控件出發send函數
2、send函數調用wx.requestSubscribeMessageAPI,微信允許接收訂閱消息
3、 wx.request向send.php後端請求
4、後端獲取access_token後,調用訂閱消息接口POST一段json數據即可發送訂閱消息

官方文檔
1、//developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html
2、//developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html

Author:TANKING
Date:2020-08-24
Web://www.likeyun.cn/
WeChat:face6009