首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實作發送微信模板消息完整指南

     編輯:PHP 相關知識

前言

微信模板消息是開發者向用戶發送重要服務通知的關鍵方式,例如訂單付款成功、物流狀態更新、活動提醒等。本文將詳細介紹如何使用 PHP 結合 cURL 實現微信模板消息的發送,並提供基於 ThinkPHP 框架的完整類庫代碼,供開發者參考與直接使用。

核心實現原理

發送微信模板消息主要分為兩個步驟:

  1. 獲取 Access Token:使用 AppID 和 AppSecret 向微信服務器請求憑證,有效期 7200 秒,建議緩存以減少請求頻率。
  2. 調用發送接口:攜帶 Access Token、用戶 OpenID、模板 ID、跳轉鏈接及數據內容,向微信 API 發送 POST 請求。

完整代碼實現

以下封裝好的 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 "發送失敗,請檢查日誌";
}

常見問題與注意事項

  • Token 緩存:生產環境務必緩存 Access Token,避免頻繁請求導致被微信限制 IP。
  • 數據編碼:模板數據的 value 建議使用 urlencode 處理,防止中文亂碼。
  • 錯誤碼排查:發送失敗時,記錄微信返回的完整 JSON,根據 errcode 查閱官方文檔排查(如 40037 模板 ID 錯誤、43004 需要用戶關注等)。
  • 非 ThinkPHP 環境:若不使用 ThinkPHP,將 S() 緩存替換為 Redis、Memcached 或文件緩存即可。

總結

通過封裝 cURL 請求與 Token 管理,我們實現了一個可復用、易維護的微信模板消息發送類。開發者可根據業務需求擴展,如支援小程序訂閱消息、批量發送、發送記錄入庫等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved