使用Flask实现接口回调地址
使用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秒)
- 添加失败重试队列