在微信公眾平台開發中,消息傳輸的安全性至關重要。微信提供了三種加解密模式供開發者選擇:明文模式、兼容模式與安全模式。其中安全模式為官方推薦,所有收發消息均採用 AES 對稱加密,有效保障資料機密性。本文將詳細解析安全模式的技術原理、配置流程與完整代碼實作。
EncodingAESKey 是 AES 對稱加密演算法所使用的密鑰,長度固定為 43 位字元。微信公眾平台使用此密鑰對推送給公眾號的消息體進行加密;公眾號收到密文後用同一密鑰解密,回覆消息亦以此加密。AES 演算法原理可參考相關密碼學資料。
未認證訂閱號因缺少 appid 參數,無法使用安全模式。
假設開發者伺服器 URL 為 https://www.example.com/index.php,需在介面程式中配置三項核心參數:
define("TOKEN", "your_token");
define("AppID", "your_appid");
define("EncodingAESKey", "your_43_char_aes_key");
require_once('wxBizMsgCrypt.php');
用戶發送消息時,微信會在回調 URL 附帶以下查詢參數:
signature=...×tamp=1414243737&nonce=1792106704&encrypt_type=aes&msg_signature=...
同時 POST 請求體為加密後的 XML:
<xml> <ToUserName><![CDATA[gh_xxx]]></ToUserName> <Encrypt><![CDATA[加密密文內容]]></Encrypt> </xml>
伺服器端需提取參數並調用解密:
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
$msg_signature = $_GET['msg_signature'];
$encrypt_type = $_GET['encrypt_type'];
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if ($encrypt_type == 'aes') {
$pc = new WXBizMsgCrypt(TOKEN, EncodingAESKey, AppID);
$decryptMsg = "";
$errCode = $pc->DecryptMsg($msg_signature, $timestamp, $nonce, $postStr, $decryptMsg);
$postStr = $decryptMsg; // 統一後續處理邏輯
}
解密後獲得標準明文 XML,包含 ToUserName、FromUserName、CreateTime、MsgType、Content、MsgId 等欄位。
業務邏輯處理完畢後,構建回覆 XML(明文),然後進行加密返回:
// 明文回覆範例
$replyXml = "<xml>
<ToUserName><![CDATA[{$fromUser}]></ToUserName>
<FromUserName><![CDATA[{$toUser}]></FromUserName>
<CreateTime>".time()."</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[回覆內容]]></Content>
</xml>";
// 加密回覆
if ($encrypt_type == 'aes') {
$encryptMsg = '';
$errCode = $pc->EncryptMsg($replyXml, $timestamp, $nonce, $encryptMsg);
$replyXml = $encryptMsg;
}
echo $replyXml;
加密後輸出包含 Encrypt、MsgSignature、TimeStamp、Nonce 四個欄位的 XML 結構。
<?php
define("TOKEN", "weixin");
define("AppID", "wxbad0b45542aa0b5e");
define("EncodingAESKey", "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG");
require_once('wxBizMsgCrypt.php');
$wechatObj = new WechatCallbackApi();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
} else {
$wechatObj->valid();
}
class WechatCallbackApi {
public function valid() { /* 簽名驗證邏輯 */ }
public function responseMsg() {
// 1. 獲取參數
// 2. 解密消息
// 3. 解析 XML、分發消息類型(event/text/image...)
// 4. 業務處理生成回覆
// 5. 加密回覆並輸出
}
private function receiveEvent($obj) { /* 事件處理 */ }
private function receiveText($obj) { /* 文本消息處理 */ }
private function transmitText($obj, $content) { /* 文本回覆模板 */ }
private function transmitNews($obj, $newsArray) { /* 圖文回覆模板 */ }
private function transmitMusic($obj, $musicArray) { /* 音樂回覆模板 */ }
public function logger($content) { /* 日誌記錄 */ }
}
?>
wxBizMsgCrypt.php 庫檔案版本與 PHP 環境相容(需支援 mcrypt 或 openssl 擴展)。掌握安全模式加解密流程,是構建高安全性微信公眾號後端的基礎。建議開發者參考官方技術方案文檔,結合實際業務場景完善異常處理與日誌監控。