使用Flask实现接口回调地址

发布于:2025-09-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

使用Flask实现接口回调地址

一、接口回调的基本概念

接口回调(Callback)是一种异步通信机制,当某个事件发生时(如支付完成、任务结束),服务提供方会主动调用预先配置的URL(即回调地址)来通知结果。核心流程:

  1. 服务方触发事件
  2. 向回调地址发送HTTP请求(通常为POST)
  3. 接收方处理请求并返回响应
  4. 服务方根据响应状态决定是否重试
二、前置准备工作
  1. 网络环境配置

    • 确保服务器有公网IP或使用内网穿透工具(如ngrok)
    • 开放防火墙端口(默认5000)
    • 配置域名解析(可选,推荐使用HTTPS)
  2. 依赖安装

    pip install flask requests
    
  3. 回调安全机制(必备)

    • 验证签名(防止伪造请求)
    • Token验证(身份认证)
    • 请求超时设置
    • 重试策略约定
三、Flask回调接口实现
from flask import Flask, request, jsonify
import hashlib
import time

app = Flask(__name__)

# 回调接口路由
@app.route('/callback', methods=['POST'])
def callback_handler():
    # 1. 基础验证
    if not request.is_json:
        return jsonify({"code": 400, "msg": "Invalid content type"}), 400
    
    data = 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
四、关键实现细节
  1. 签名验证流程

    匹配
    不匹配
    接收回调请求
    提取sign/timestamp/nonce
    拼接原始字符串
    生成SHA256签名
    对比签名
    执行业务逻辑
    返回403错误
  2. 必备安全措施

    • 防重放攻击:验证时间戳,拒绝超过5分钟的请求
    • 参数校验:检查必要字段是否存在
    • HTTPS加密:使用ssl_context配置证书
    • IP白名单:通过request.remote_addr限制来源IP
  3. 回调数据示例

    {
      "event": "payment_success",
      "order_id": "202308150001",
      "amount": 99.50,
      "timestamp": 1692086400,
      "nonce": "7a3b8c",
      "sign": "d4e5c6f7...(SHA256签名)"
    }
    
五、测试与调试方法
  1. 本地测试工具

    # 使用curl模拟回调
    curl -X POST http://localhost:5000/callback \
    -H "Content-Type: application/json" \
    -d '{"event":"test","timestamp":1692086400,"nonce":"123456","sign":"..."}'
    
  2. 调试建议

    • 使用ngrok生成临时公网地址:ngrok http 5000
    • 记录原始请求:print(request.data)
    • 添加请求日志中间件
六、生产环境部署要点
  1. 性能优化

    • 使用Gunicorn部署:gunicorn -w 4 app:app
    • 添加Nginx反向代理
    • 异步处理耗时操作(Celery)
  2. 容错机制

    • 实现幂等性处理(防止重复回调)
    • 设置响应超时(建议<3秒)
    • 添加失败重试队列

网站公告

今日签到

点亮在社区的每一天
去签到