微信模板消息是開發者向用戶發送重要服務通知的關鍵方式,例如訂單付款成功、物流狀態更新、活動提醒等。本文將詳細介紹如何使用 PHP 結合 cURL 實現微信模板消息的發送,並提供基於 ThinkPHP 框架的完整類庫代碼,供開發者參考與直接使用。
發送微信模板消息主要分為兩個步驟:
以下封裝好的 OrderPush 類支援 ThinkPHP 框架,包含 Token 緩存、GET/POST 請求封裝、模板消息發送等核心功能:
<?php
namespace OrgWeixin;
/**
* 微信模板消息發送類
* 基於 ThinkPHP 實現,支援 Access Token 自動緩存與更新
*/
class OrderPush
{
protected $appid;
protected $secrect;
protected $accessToken;
/**
* 構造函數,初始化並獲取 Access Token
* @param string $appid 微信公眾號 AppID
* @param string $secrect 微信公眾號 AppSecret
*/
function __construct($appid, $secrect)
{
$this->appid = $appid;
$this->secrect = $secrect;
$this->accessToken = $this->getToken($appid, $secrect);
}
/**
* 發送 POST 請求
* @param string $url 請求地址
* @param string $param 請求參數
* @return bool|mixed 響應數據或 false
*/
function request_post($url = '', $param = '')
{
if (empty($url) || empty($param)) {
return false;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* 發送 GET 請求
* @param string $url 請求地址
* @return bool|mixed 響應數據或 false
*/
function request_get($url = '')
{
if (empty($url)) {
return false;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
/**
* 獲取 Access Token(支援緩存)
* @param string $appid
* @param string $appsecret
* @return mixed Access Token
*/
protected function getToken($appid, $appsecret)
{
// ThinkPHP S() 函數用於緩存操作
if (S($appid)) {
$access_token = S($appid);
} else {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;
$token = $this->request_get($url);
$token = json_decode(stripslashes($token));
$arr = json_decode(json_encode($token), true);
$access_token = $arr['access_token'];
// 緩存 7200 秒(2 小時),留有餘量自動刷新
S($appid, $access_token, 7200);
}
return $access_token;
}
/**
* 發送自定義模板消息
* @param string $touser 接收者 OpenID
* @param string $template_id 模板 ID
* @param string $url 點擊消息跳轉鏈接
* @param array $data 模板數據(結構需與後台配置一致)
* @param string $topcolor 頂部顏色,默認 #7B68EE
* @return bool 發送是否成功
*/
public function doSend($touser, $template_id, $url, $data, $topcolor = '#7B68EE')
{
$template = array(
'touser' => $touser,
'template_id' => $template_id,
'url' => $url,
'topcolor' => $topcolor,
'data' => $data
);
$json_template = json_encode($template);
$api_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $this->accessToken;
$dataRes = $this->request_post($api_url, urldecode($json_template));
// 微信返回 errcode 為 0 表示成功
$result = json_decode($dataRes, true);
return isset($result['errcode']) && $result['errcode'] == 0;
}
}
實例化類並發送消息:
<?php
// 引入類文件
require_once 'OrderPush.class.php';
$appid = 'your_appid';
$secrect = 'your_secret';
$push = new OrgWeixin\OrderPush($appid, $secrect);
// 模板數據結構需與微信後台配置的模板字段對應
$data = array(
'first' => array('value' => urlencode("您好,您的訂單已支付成功"), 'color' => "#743A3A"),
'keyword1' => array('value' => urlencode("訂單編號:20240101001"), 'color' => "#EEEEEE"),
'keyword2' => array('value' => urlencode("支付金額:¥99.00"), 'color' => "#EEEEEE"),
'remark' => array('value' => urlencode('感謝您的購買,如有疑請聯繫客服'), 'color' => '#FFFFFF'),
);
$touser = 'oXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // 用戶 OpenID
$template_id = 'your_template_id'; // 模板 ID
$url = 'https://yourdomain.com/order/detail/20240101001'; // 點擊跳轉頁面
if ($push->doSend($touser, $template_id, $url, $data)) {
echo "模板消息發送成功";
} else {
echo "發送失敗,請檢查日誌";
}
urlencode 處理,防止中文亂碼。errcode 查閱官方文檔排查(如 40037 模板 ID 錯誤、43004 需要用戶關注等)。S() 緩存替換為 Redis、Memcached 或文件緩存即可。通過封裝 cURL 請求與 Token 管理,我們實現了一個可復用、易維護的微信模板消息發送類。開發者可根據業務需求擴展,如支援小程序訂閱消息、批量發送、發送記錄入庫等功能。