# 工作筆記(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 動態生成訂單。