WooCommerce使用API回填託運單

前面有介紹把訂單匯出 ( WooCommerce訂單管理 REST API ) => 用API取得宅急便託運單資訊 ( 使用Python串接黑貓宅急便 )

接下來的最後一步,就是回填

作法

import json
import requests

# -------------------------------
# WooCommerce 商店設定(移除 store_url 中嵌入的認證)
# -------------------------------
store_url = "https://yoursite"
consumer_key = "ck_key"
consumer_secret = "cs_secret"

# -------------------------------
# 讀取 tcat.json 檔案,取得印單 API 回應資料
# -------------------------------
with open("tcat.json", "r", encoding="utf-8") as f:
    tcat_data = json.load(f)

orders_data = tcat_data.get("response", {}).get("Data", {}).get("Orders", [])
if not orders_data:
    print("在 tcat.json 中找不到 'response' -> 'Data' -> 'Orders' 資料,請確認格式。")
    exit(1)

# -------------------------------
# 逐筆處理每筆訂單,並回寫 OBTNumber 到 WooCommerce 訂單的 ywot_tracking_code 欄位
# -------------------------------
for order in orders_data:
    obt_number = order.get("OBTNumber")
    if not obt_number:
        print("訂單缺少 OBTNumber,跳過。")
        continue

    # 從 Picking.Details 取得所有 OrderId(若有重複,只更新一次)
    picking_details = order.get("Picking", {}).get("Details", [])
    order_ids = {detail.get("OrderId") for detail in picking_details if detail.get("OrderId")}
    
    if not order_ids:
        print(f"OBTNumber {obt_number} 未找到任何 OrderId,跳過。")
        continue

    for order_id in order_ids:
        update_payload = {
            "meta_data": [
                {
                    "key": "ywot_tracking_code",
                    "value": obt_number
                }
            ]
        }
        # 使用 URL Query 參數帶入認證資訊
        update_url = (
            f"{store_url}/wp-json/wc/v3/orders/{order_id}"
            f"?consumer_key={consumer_key}&consumer_secret={consumer_secret}"
        )
        
        try:
            response = requests.put(update_url, json=update_payload)
        except Exception as e:
            print(f"更新訂單 {order_id} 時發生例外:{e}")
            continue

        if response.status_code in [200, 201]:
            print(f"訂單 {order_id} 已更新,ywot_tracking_code 設定為:{obt_number}")
        else:
            print(f"訂單 {order_id} 更新失敗,狀態碼:{response.status_code},回應:{response.text}")

這裡的範例是根據 tcat.json 中的訂單編號以及託運單號,回填到 ywot_tracking_code

瀏覽次數:55