使用Flask實現接口回調地址
一、接口回調的基本概念
接口回調(Callback)是一種異步通信機制,當某個事件發生時(如支付完成、任務結束),服務提供方會主動調用預先配置的URL(即回調地址)來通知結果。核心流程:
- 服務方觸發事件
- 向回調地址發送HTTP請求(通常為POST)
- 接收方處理請求并返回響應
- 服務方根據響應狀態決定是否重試
二、前置準備工作
-
網絡環境配置
- 確保服務器有公網IP或使用內網穿透工具(如ngrok)
- 開放防火墻端口(默認5000)
- 配置域名解析(可選,推薦使用HTTPS)
-
依賴安裝
pip install flask requests
-
回調安全機制(必備)
- 驗證簽名(防止偽造請求)
- Token驗證(身份認證)
- 請求超時設置
- 重試策略約定
三、Flask回調接口實現
from flask import Flask, request, jsonify
import hashlib
import timeapp = Flask(__name__)# 回調接口路由
@app.route('/callback', methods=['POST'])
def callback_handler():# 1. 基礎驗證if not request.is_json:return jsonify({"code": 400, "msg": "Invalid content type"}), 400data = request.json# 2. 安全驗證(示例:簽名驗證)sign = data.get('sign')timestamp = data.get('timestamp')nonce = data.get('nonce')# 驗證簽名有效性(實際需替換為你的密鑰)secret = "YOUR_SECRET_KEY"sign_str = f"{timestamp}{nonce}{secret}".encode()real_sign = hashlib.sha256(sign_str).hexdigest()if sign != real_sign:return jsonify({"code": 403, "msg": "Invalid signature"}), 403# 3. 處理業務邏輯(示例)event_type = data.get('event')if event_type == "payment_success":order_id = data['order_id']amount = data['amount']# 更新訂單狀態等操作print(f"訂單{order_id}支付成功,金額:{amount}")# 4. 返回標準響應return jsonify({"code": 200,"msg": "Callback processed","timestamp": int(time.time())})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, ssl_context='adhoc') # 啟用簡易HTTPS
四、關鍵實現細節
-
簽名驗證流程
-
必備安全措施
- 防重放攻擊:驗證時間戳,拒絕超過5分鐘的請求
- 參數校驗:檢查必要字段是否存在
- HTTPS加密:使用
ssl_context
配置證書 - IP白名單:通過
request.remote_addr
限制來源IP
-
回調數據示例
{"event": "payment_success","order_id": "202308150001","amount": 99.50,"timestamp": 1692086400,"nonce": "7a3b8c","sign": "d4e5c6f7...(SHA256簽名)" }
五、測試與調試方法
-
本地測試工具
# 使用curl模擬回調 curl -X POST http://localhost:5000/callback \ -H "Content-Type: application/json" \ -d '{"event":"test","timestamp":1692086400,"nonce":"123456","sign":"..."}'
-
調試建議
- 使用
ngrok
生成臨時公網地址:ngrok http 5000
- 記錄原始請求:
print(request.data)
- 添加請求日志中間件
- 使用
六、生產環境部署要點
-
性能優化
- 使用Gunicorn部署:
gunicorn -w 4 app:app
- 添加Nginx反向代理
- 異步處理耗時操作(Celery)
- 使用Gunicorn部署:
-
容錯機制
- 實現冪等性處理(防止重復回調)
- 設置響應超時(建議<3秒)
- 添加失敗重試隊列