# 工作筆記(20250707) - 建立綠界繳費訂單
本周主要完成了 ngrok 通道建立、Flask ReturnURL 伺服器搭建、ecpay_payment_sdk 下載與付費網頁生成、綠界測試環境模擬繳費及回調訊息接收。
## 簡介 ngrok
概述:ngrok 是一款工具,將本地伺服器暴露為公開可訪問的 URL,適合測試綠界 API 的 ReturnURL。

使用步驟:
下載 ngrok 執行檔並解壓縮。
註冊帳戶獲取 Auth Token,執行 ngrok authtoken <token> 配置。

運行 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。

在綠界測試後台模擬支付。


結果:後台記錄訂單(MerchantTradeNo 對應),發出模擬付費資訊。
成功在 returnServer 接收到付費訊息
回調內容:Flask 伺服器收到 POST 請求,顯示回調資料。

驗證:確認支付成功,ReturnURL 正常運作。
狀態:回調伺服器成功接收並回應 1|OK。
## 下一步
公開網域:整合 Flask 將 payment.html 公開為 /payment,使用 ngrok 提供訪問。
多分店擴展:根據分店 ID 動態生成訂單。