---
# System prepended metadata

title: 工作筆記(20250707) - 建立綠界繳費訂單

---

# 工作筆記(20250707) - 建立綠界繳費訂單
本周主要完成了 ngrok 通道建立、Flask ReturnURL 伺服器搭建、ecpay_payment_sdk 下載與付費網頁生成、綠界測試環境模擬繳費及回調訊息接收。
## 簡介 ngrok
概述：ngrok 是一款工具，將本地伺服器暴露為公開可訪問的 URL，適合測試綠界 API 的 ReturnURL。
![image](https://hackmd.io/_uploads/HkqzUjuBxl.png)
使用步驟：
下載 ngrok 執行檔並解壓縮。
註冊帳戶獲取 Auth Token，執行 ngrok authtoken <token> 配置。
![image](https://hackmd.io/_uploads/r1w8Ij_Sxl.png)
運行 ngrok http 5000 映射本地 5000 端口，獲取 URL（如 https://61b5-122-116-195-165.ngrok-free.app）。
用途：提供臨時公開網域，測試支付回調。
    
## Flask 建立 ReturnURL
程式功能：使用 Flask 搭建簡單 Web 伺服器returnServer.py，處理綠界支付回調。
```python=1
from flask import Flask, request

app = Flask(__name__)

@app.route("/callback", methods=["POST"])
def callback():
    data = request.form  # 接收綠界回調資料
    print(f"收到回調：{data}")  # 記錄資料
    return "1|OK"  # 回應綠界確認

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)    
```
程式碼重點：
@app.route("/callback", methods=["POST"])：接收 POST 請求。
print(f"收到回調：{data}")：記錄回調資料。
return "1|OK"：回應綠界確認。
運行方式：python returnServer.py，綁定 0.0.0.0:5000。
狀態：成功運行，準備接收回調。
    
## 下載 ecpay_payment_sdk 並以 ecpay_test_order.py 建立付費網頁
步驟：
下載綠界官方 Python SDK (ecpay_payment_sdk.py)。
運行 ecpay_test_order.py 生成支付訂單。
``` python=1
from ecpay_payment_sdk import ECPayPaymentSdk
from datetime import datetime

# 初始化SDK
sdk = ECPayPaymentSdk(
    MerchantID='3002607',
    HashKey='pwFHCqoQZGmho4w6',
    HashIV='EkRm7iFT261dpevs'
)

# 測試訂單參數
order_params = {
    'MerchantTradeNo': datetime.now().strftime("NO%Y%m%d%H%M%S"),
    'MerchantTradeDate': datetime.now().strftime("%Y/%m/%d %H:%M:%S"),
    'PaymentType': 'aio',
    'TotalAmount': 2600,
    'TradeDesc': 'POS月租費測試',
    'ItemName': 'POS月租費',
    'ReturnURL': 'https://61b5-122-116-195-165.ngrok-free.app/callback',
    'ChoosePayment': 'ALL',
    'ClientBackURL': 'https://www.google.com',
    'EncryptType': 1,
}

# 創建訂單並生成HTML表單
try:
    params = sdk.create_order(order_params)
    html = sdk.gen_html_post_form('https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5', params)
    with open('payment.html', 'w', encoding='utf-8') as f:
        f.write(html)
    print("HTML 內容已保存至 payment.html")
except Exception as e:
    print(f'錯誤：{e}')
```
程式碼重點：
初始化 SDK 並設定測試憑證（MerchantID: 3002607, HashKey, HashIV）。
定義訂單參數（MerchantTradeNo、TotalAmount: 2600、ReturnURL 等）。
生成 HTML 表單並保存為 payment.html。
狀態：付費網頁已生成，但未公開網域（目前為本地檔案）。
## 綠界網頁測試繳費，後台發出模擬付費資訊
測試過程：
開啟 payment.html，提交表單至 https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5。
![image](https://hackmd.io/_uploads/ByOjvsureg.png)
在綠界測試後台模擬支付。
![image](https://hackmd.io/_uploads/Sy5ypiuHge.png)
![image](https://hackmd.io/_uploads/ByxfTj_Bxg.png)
結果：後台記錄訂單（MerchantTradeNo 對應），發出模擬付費資訊。
成功在 returnServer 接收到付費訊息
回調內容：Flask 伺服器收到 POST 請求，顯示回調資料。
![image](https://hackmd.io/_uploads/SkgUpjurxl.png)
驗證：確認支付成功，ReturnURL 正常運作。
狀態：回調伺服器成功接收並回應 1|OK。
    
## 下一步
公開網域：整合 Flask 將 payment.html 公開為 /payment，使用 ngrok 提供訪問。
多分店擴展：根據分店 ID 動態生成訂單。
