微信後台偵測到商戶異常 (發貨延遲、介面調用失敗、通知失敗等) → POST XML 至商戶設定的「告警通知 URL」 → 商戶需盡快修復問題。
路徑:公眾平台 → 服務 → 服務中心 → 商戶功能 → 商戶基本資料 → 告警通知 URL
範例:`https://www.doucube.com/wxpay/alarm.php`
<xml> <AppId><![CDATA[wxf8b4f85f3a794e77]]></AppId> <ErrorType>1001</ErrorType> // 錯誤代碼 <Description><![CDATA[錯誤描述]]></Description> // 簡短描述 <AlarmContent><![CDATA[錯誤詳情]]></AlarmContent> // 完整詳情 <TimeStamp>1393860740</TimeStamp> <AppSignature><![CDATA[f8164781a303f4d5a944a2dfc68411a8c7e4fbea]]></AppSignature> <SignMethod><![CDATA[sha1]]></SignMethod> </xml>
| ErrorType | 含義 | 典型原因 | 建議處理 |
|---|---|---|---|
| 1001 | 發貨延遲 | 虛擬品 24h/實物 72h 未發貨通知 | 檢查發貨流程、補發貨通知 API |
| 1002 | 介面調用失敗 | 統一下單/退款/查詢 API 回包錯誤 | 查詢日誌、修正參數/簽名/憑證 |
| 1003 | 通知失敗 | 支付結果/退款結果回調 5 秒內無響應 | 優化回調效能、檢查 HTTPS/防火牆 |
| 1004 | 退款失敗 | 退款申請被拒/餘額不足 | 人工介入、補單處理 |
| 1005 | 證書/簽名錯誤 | API 憑證過期/簽名算法不符 | 更新憑證、核對簽名流程 |
<?php
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; // 獲取原始 XML
// 解析 XML
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$errorType = (int)$postObj->ErrorType;
$description = (string)$postObj->Description;
$alarmContent = (string)$postObj->AlarmContent;
$timeStamp = (int)$postObj->TimeStamp;
// 結構化日誌記錄
logger([
'time' => date('Y-m-d H:i:s', $timeStamp),
'error_type' => $errorType,
'description' => $description,
'content' => $alarmContent,
'raw_xml' => $postStr,
]);
function logger($data) {
$maxSize = 100000;
$file = "alarm_log.json";
if (file_exists($file) && filesize($file) > $maxSize) unlink($file);
$line = json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
file_put_contents($file, $line, FILE_APPEND);
// 同步寫入系統日誌 (可被 logrotate 管理)
error_log("[WECHAT_ALARM] " . $line);
}
// 回應微信 (必須在 5 秒內)
echo ' ';
?>
# Filebeat 收集 alarm_log.json → Logstash 解析 → Elasticsearch 存儲 → Kibana 視覺化 # 建立 Dashboard 監控:ErrorType 分布、趨勢、Top 商戶
<?php
// 在 logger() 中加入即時推送
$webhook = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXX'; // 企業微信機器人
$msg = [
'msgtype' => 'markdown',
'markdown' => [
'content' => "**微信支付告警**\n> **類型**: $errorType ($description)\n> **詳情**: $alarmContent\n> **時間**: " . date('Y-m-d H:i:s')
]
];
curl_post($webhook, json_encode($msg));
// 或發送簡訊/郵件給值班人員
?>
| ErrorType | 可自動修復動作 | 風險評估 |
|---|---|---|
| 1001 發貨延遲 | 調用發貨通知 API (若已發貨) | 低 - 需確認訂單狀態 |
| 1002 介面失敗 | 重試失敗訂單 (指數退避) | 中 - 需冪等設計 |
| 1003 通知失敗 | 重發回調通知 | 低 - 微信允許重複通知 |