訂單爆量也不怕!WordPress 串接黑貓、宅配通、超取物流 API,打造全自動出貨帝國
嗨,我是浪花科技的 Eric。身為一個天天跟程式碼和伺服器打交道的工程師,我最受不了的就是看到明明可以讓電腦做的事情,卻要耗費大量人力去「手動」完成。其中最經典的場景,莫過於電商網站的「出貨流程」。
想像一下這個畫面:後台湧入幾十、幾百筆訂單,你的同事(或就是你自己)開始了一場複製貼上的惡夢。把收件人姓名、電話、地址,一筆一筆地複製到物流公司的後台系統,然後再把產生的託運單號,一筆一筆地貼回 WooCommerce 訂單備註。滑鼠點到手抽筋,眼睛看到脫窗,最慘的是,只要一個不小心複製錯地址,接下來就是無止盡的客訴和逆物流處理。老實說,這根本不是 21 世紀該有的工作模式,對吧?這種重複性高、容錯率低的工作,就是我們工程師最愛「消滅」的對象。
今天,我就要帶你徹底終結這場手動出貨地獄。我們要做的,就是讓你的 WordPress/WooCommerce 網站直接跟物流系統「對話」,透過 物流 API 串接,實現從訂單成立到託運單產生的全自動化流程。不管是黑貓、宅配通,還是方便的超商取貨(C2C),這篇文章將從觀念到實戰,一步步帶你打造一個真正能擴展、高效率的自動化出貨引擎。
為什麼要串接物流 API?這不只是「省時間」而已
很多老闆或行銷人員聽到「API 串接」,第一個反應可能是:「喔,就是節省人工複製貼上的時間嘛。」這當然沒錯,但格局小了。一個好的自動化流程,帶來的是指數級的效益提升,遠不止省下幾個人力成本這麼簡單。我囉嗦一點,幫你拆解一下:
- 消除人為錯誤: 電腦不會眼花,不會手抖。API 傳輸的資料,只要來源(訂單資料)正確,送到物流系統的資料就是 100% 正確,從根本上杜絕了地址填錯、姓名打錯的低級錯誤。
- 即時性與效率: 當訂單狀態轉為「處理中」的瞬間,託運單就能自動產生。你不需要再等到每天下午固定時間才「批次處理」。這意味著你的商品可以更快地進入出貨流程,客戶也能更快收到貨。
- 提升顧客體驗: 託運單號自動回填到訂單後,系統可以自動發信通知客戶「您的商品已出貨,貨運追蹤碼為 XXXX」。客戶可以隨時查詢包裹進度,不用再一直私訊問客服「我的東西到哪了?」,大幅降低客服壓力。
- 數據一致性: 所有出貨資訊(如託運單號、運費、寄送狀態)都儲存在你的 WordPress 資料庫中,方便後續的數據分析、報表產出,而不是散落在各個物流公司的後台。
- 解放生產力,專注核心業務: 把員工從重複性的出貨作業中解放出來,讓他們去做更有價值的事情,例如客戶關係維護、行銷活動策劃、產品開發等。這才是企業成長的關鍵。
所以,別再把物流 API 串接看成一個單純的「IT 專案」,它是一個能直接優化營運流程、提升顧客滿意度、增強企業競爭力的「商業策略」。
台灣主流物流 API 快速導覽
在我們動手寫程式碼之前,得先了解一下戰場上有哪些玩家。在台灣,主流的電商物流選擇不外乎宅配和超商取貨,而他們的 API 也各有特色。
黑貓宅急便 (T-Cat) & 台灣宅配通 (Pelican)
這兩家是宅配市場的巨頭,服務穩定,覆蓋率廣。他們的 API 通常需要企業客戶身份才能申請。功能上大同小異,核心功能包括:
- 建立託運單: 傳入寄件人、收件人資訊、包裹尺寸、代收貨款金額等,API 會回傳一組託運單號 (Waybill Number) 和一個用於列印託運單的 PDF 檔案 URL。
- 查詢貨態: 用託運單號去查詢包裹目前的配送狀態。
- 取消託運單: 在司機來收貨前,可以透過 API 取消已經建立的託運單。
一般來說,直接跟這兩家串接,適合出貨量大、且需要深度客製化流程的企業。申請流程通常需要簽訂合約,來回溝通也需要一些時間。
超商取貨 (C2C) – 7-11 & 全家
對於中小型電商來說,超商取貨是絕對的主力。但有趣的是,我們通常不會直接去跟 7-11 或全家串接 API。因為他們把這部分的服務整合到了第三方物流平台或金流服務商中,例如:綠界科技 (ECPay)、藍新科技 (NewebPay) 等。
透過這些第三方平台串接 C2C 物流有幾個好處:
- 一站式服務: 你只需要跟一個平台申請,就能同時開通 7-11、全家、萊爾富等多家超商的物流服務。
- 簡化流程: 他們提供了統一的 API 格式,你不用分別去研究各家超商的技術文件。
- 整合金流: 通常物流服務會跟他們的金流服務綁在一起,處理「取貨付款」的對帳流程會非常方便。
在串接 C2C 時,最關鍵的一個環節是「電子地圖」。你必須在結帳頁面嵌入一個讓使用者選擇取貨門市的地圖介面。使用者選定門市後,你會得到一組「門市代號」,這組代號就是你稍後呼叫 API 建立託運單時必須傳入的關鍵參數。
動手實戰:打造你的 WooCommerce 自動出貨機器人
好了,理論說得夠多了,來點硬核的。接下來,我將示範如何透過撰寫客製化程式碼,在 WooCommerce 訂單狀態變更時,自動呼叫物流 API 來建立託運單。這裡我會以一個虛構的 API 為例,但整個邏輯和流程適用於任何一家物流服務商。
Step 1:打好地基 – 前置準備
在寫下任何一行程式碼前,請確保你已經準備好:
- API 帳號資訊: 你必須先跟你的物流合作夥伴(例如黑貓或綠界)申請 API 串接資格,並取得一組 API Key、商戶編號 (Merchant ID) 或類似的認證資訊。
- 技術文件 (API Document): 這是你的藏寶圖!務必仔細閱讀,了解 API 的請求網址 (Endpoint)、請求方式 (GET/POST)、需要傳送的參數、資料格式 (JSON/XML),以及成功與失敗時會回傳什麼內容。
- 一個安全的測試環境: 拜託,千萬不要在正式上線的網站直接開發測試。使用 Staging 環境,避免任何意外搞砸你的線上訂單。
Step 2:找到對的時機點 – 善用 WooCommerce Hook
我們不希望每張訂單一成立就馬上建立託運單(因為客戶可能還沒付款),最佳的時機點是當你確認收到款項,並將訂單狀態更新為「處理中」(Processing) 的那一刻。WooCommerce 提供了一個完美的 Hook 來捕捉這個事件:woocommerce_order_status_processing。
我們會把所有邏輯都掛載這個 Hook 上,這樣一來,只要有訂單進入「處理中」狀態,我們的自動化腳本就會被觸發。
Step 3:組裝彈藥 – 組合 API 請求資料
在 Hook 觸發的函式中,我們會接收到一個 $order_id。透過這個 ID,我們可以取得完整的訂單物件 (WC_Order),然後從中挖出所有需要的資訊,例如:
- 收件人姓名:
$order->get_shipping_first_name(),$order->get_shipping_last_name() - 收件人地址:
$order->get_formatted_shipping_address() - 收件人電話:
$order->get_billing_phone() - 訂單金額 (用於代收貨款):
$order->get_total() - (超商取貨) 門市代號: 這通常是在結帳時透過電子地圖外掛存放在訂單的 meta data 中,可以用
$order->get_meta('_shipping_store_id')之類的方式取得。
拿到這些資料後,我們會把它們組裝成一個符合 API 文件要求的陣列 (array),準備發送出去。
Step 4:發射!呼叫 API 並處理回傳結果
WordPress 內建了強大的 HTTP API 函式 wp_remote_post(),讓我們可以輕易地發送 POST 請求。我們會把 API Endpoint URL 和剛剛組裝好的資料陣列傳給它。
API 的回應至關重要。我們需要檢查回應的 HTTP 狀態碼是不是 200 (OK),然後解析回傳的 Body 內容(通常是 JSON 格式)。
- 如果成功: API 通常會回傳託運單號 (例如 `waybill_no`) 和列印標籤的網址。我們會把這些資訊用
update_post_meta()存進訂單的 meta data,並用$order->add_order_note()新增一筆私密備註,方便後台人員查看。 - 如果失敗: 絕對不能讓程式崩潰!我們會紀錄下失敗的原因(API 回傳的錯誤訊息),並在訂單備註中留下錯誤日誌,提醒管理員需要手動介入處理這筆訂單的出貨。健壯的錯誤處理,是專業工程師和業餘玩家的最大區別。
底下是一段完整的範例程式碼,你可以把它加到你的子佈景主題的 functions.php 檔案中。請記得,這是一個概念性的範例,你需要根據你實際使用的物流 API 文件來修改參數和欄位名稱。
<?php
/**
* 當 WooCommerce 訂單狀態變為「處理中」時,自動串接物流 API 建立託運單
*/
add_action( 'woocommerce_order_status_processing', 'roamer_create_shipping_order_automatically', 20, 2 );
function roamer_create_shipping_order_automatically( $order_id, $order ) {
// 檢查這筆訂單是否已經產生過託運單,避免重複執行
if ( $order->get_meta('_shipping_waybill_number') ) {
return;
}
// --- 1. 設定你的 API 資訊 ---
$api_url = 'https://logistics.example.com/api/v1/create_order'; // 換成你真實的 API Endpoint
$merchant_id = 'YOUR_MERCHANT_ID'; // 換成你的商戶 ID
$api_key = 'YOUR_API_KEY'; // 換成你的 API Key
// --- 2. 從訂單中組合要發送的資料 ---
$shipping_data = [
'merchant_id' => $merchant_id,
'order_no' => $order->get_order_number(),
'receiver_name' => $order->get_shipping_first_name() . ' ' . $order->get_shipping_last_name(),
'receiver_phone'=> $order->get_billing_phone(),
'receiver_addr' => $order->get_shipping_address_1() . $order->get_shipping_address_2(),
'parcel_size' => 'S', // 這可能需要根據商品計算
'cod_amount' => ( $order->get_payment_method() === 'cod' ) ? $order->get_total() : 0,
// 如果是超商取貨,可能需要傳門市代號
// 'store_id' => $order->get_meta('_c2c_store_id'),
];
// 產生簽章,許多 API 會要求,實作方式請參考文件
$signature = hash('sha256', http_build_query($shipping_data) . $api_key);
// --- 3. 發送 API 請求 ---
$response = wp_remote_post( $api_url, [
'method' => 'POST',
'timeout' => 15, // 設定超時時間
'headers' => [
'Content-Type' => 'application/json; charset=utf-8',
'X-Signature' => $signature, // 範例:使用 Header 傳遞簽章
],
'body' => json_encode( $shipping_data ),
]);
// --- 4. 處理 API 回應 ---
if ( is_wp_error( $response ) ) {
// 請求本身發生錯誤 (例如網路問題)
$error_message = $response->get_error_message();
$order->add_order_note( '物流 API 請求失敗:' . $error_message );
return;
}
$response_code = wp_remote_retrieve_response_code( $response );
$response_body = wp_remote_retrieve_body( $response );
$result = json_decode( $response_body, true );
if ( $response_code === 200 && isset($result['status']) && $result['status'] === 'success' ) {
// 成功建立託運單
$waybill_number = $result['data']['waybill_no'];
$label_url = $result['data']['label_url'];
// 將託運單號和標籤網址存入訂單 meta
$order->update_meta_data( '_shipping_waybill_number', $waybill_number );
$order->update_meta_data( '_shipping_label_url', $label_url );
$order->save();
// 新增一筆訂單備註
$note = sprintf(
'物流託運單已自動建立!<br>託運單號: %s <br> <a href="%s" target="_blank">點此列印託運單</a>',
$waybill_number,
$label_url
);
$order->add_order_note( $note );
} else {
// API 回傳錯誤訊息
$error_message = isset($result['message']) ? $result['message'] : '未知的錯誤';
$order->add_order_note( '建立物流託運單失敗:' . $error_message . ' (Code: ' . $response_code . ')' );
}
}
?>
讓自動化更上一層樓:不只是建立訂單
成功自動建立託運單只是第一步。一個完整的自動化流程還可以包含更多進階功能:
- 後台整合: 你可以客製化 WooCommerce 的訂單列表和訂單詳情頁面,直接顯示託運單號和一個「列印標籤」的按鈕,讓倉管人員操作起來更直覺。
- 貨態追蹤 Webhook: 更進階的玩法是,接收來自物流公司的 Webhook 通知。當他們更新包裹狀態(例如「配送中」、「已送達」)時,會主動通知你的網站。你可以監聽這個通知,並自動將 WooCommerce 的訂單狀態更新為「已完成」,實現真正的端到端全自動化。
串接物流 API 看似複雜,但一旦建立起來,它就像一個 24 小時不休息的超強員工,默默地為你處理掉所有繁瑣的出貨工作。它所帶來的效率提升和錯誤率降低,對於任何一個想要規模化的電商來說,都是一筆極其划算的投資。
別再讓你的團隊深陷複製貼上的泥淖了。是時候解放他們的雙手,讓科技去做科技擅長的事。如果你在整合過程中遇到任何挑戰,或是有更複雜的客製化流程需求,浪花科技的團隊擁有豐富的 API 串接與電商系統開發經驗。
覺得以上的內容對你有幫助嗎?如果對於 WordPress 網站客製化、API 串接整合有任何問題,或是有客製化網站的需求,都歡迎點此連結,填寫表單聯繫我們,我們很樂意為您提供解決方案!
延伸閱讀
- 告別手動複製貼上!WooCommerce Webhook 終極指南:打造零失誤、全自動的訂單處理流程
- 告別手動上架地獄!WooCommerce 商品 API 終極實戰,讓你的庫存、ERP 同步自動化!
- 訂單一來就自動歸檔?n8n 聯手 WooCommerce 訂單同步,打造你的 24H 全自動電商大腦!
常見問題 (FAQ)
Q1: 為什麼不直接用市面上的物流外掛就好?
市面上的外掛是個快速的起點,但它們通常有幾個限制:1. 彈性不足,如果你的出貨流程有特殊需求(例如根據商品類型選擇不同物流),外掛可能無法滿足。2. 長期成本,許多好的物流外掛採用年費訂閱制,長期下來是一筆不小的開銷。3. 依賴性,外掛的更新和維護都掌握在第三方開發者手中。自己撰寫串接邏輯,可以讓你完全掌控整個流程,並根據業務需求隨時調整。
Q2: 串接物流 API 一定需要跟物流公司簽「企業合約」嗎?
是的,絕大多數情況下是必須的。API 金鑰通常只提供給簽約的企業客戶。這是因為 API 串接涉及到費用結算、責任歸屬等商業層面的問題。如果你是個人賣家或剛起步的小型電商,建議先使用整合多家物流的第三方平台(如綠界 ECPay),他們的申請門檻通常較低。
Q3: 超商取貨的「電子地圖」該怎麼整合到我的結帳頁面?
這部分通常由你合作的物流平台提供解決方案。例如,綠界科技會提供一個專門的 WooCommerce 外掛,啟用後就能在結帳頁面顯示選擇門市的按鈕與地圖。使用者選擇後,門市的代號、名稱等資訊會自動存入訂單中,你只需要在後續呼叫 API 時,從訂單 meta data 裡把這些資訊讀取出來即可。
Q4: 如果 API 呼叫失敗了,我的訂單會不會卡住或遺失?
這完全取決於你的程式碼寫得夠不夠「健壯」。如文章中的範例所示,一個好的做法是使用 `is_wp_error()` 檢查請求本身是否出錯,並解析 API 回傳的 HTTP 狀態碼和錯誤訊息。一旦偵測到失敗,就不應繼續執行,而是應該在訂單後台新增一條清晰的錯誤備註,並通知管理員需要手動介入。絕對不能讓程式在出錯時「默默死去」,這會導致訂單被遺漏。






