refactor: 移除 Python 后端源码,全面迁移至 Rust gateway 架构

- 删除全部 Python 源码 (src/) 及 Alembic 迁移脚本,归档至 _deprecated_py_src/
- 重构 Rust gateway ai_pipeline: 拆分 planner/finalize 模块,新增 contracts/adaptation 层
- 重组 handlers 模块为 admin/public/proxy/internal/shared 子模块结构
- 新增 executor 模块,引入 Rust 原生数据库迁移 (aether-data/migrations)
- 简化 CI/Docker 构建流程,移除 base image 二级构建,统一为单一 app image
- 移除 Python 相关基础设施文件 (entrypoint.sh, gunicorn_conf.py, Dockerfile.base)
This commit is contained in:
fawney19
2026-04-03 16:26:16 +08:00
parent 8f26e1a31f
commit 1d9c77522a
868 changed files with 1735 additions and 2433 deletions

View File

@@ -0,0 +1,23 @@
from __future__ import annotations
from src.services.payment.gateway.alipay import AlipayGateway
from src.services.payment.gateway.base import PaymentGateway
from src.services.payment.gateway.manual import ManualGateway
from src.services.payment.gateway.wechat import WeChatGateway
_GATEWAYS: dict[str, PaymentGateway] = {
"alipay": AlipayGateway(),
"wechat": WeChatGateway(),
"manual": ManualGateway(),
}
def get_payment_gateway(payment_method: str) -> PaymentGateway:
key = (payment_method or "").strip().lower()
gateway = _GATEWAYS.get(key)
if gateway is None:
raise ValueError(f"unsupported payment_method: {payment_method}")
return gateway
__all__ = ["PaymentGateway", "get_payment_gateway"]

View File

@@ -0,0 +1,21 @@
from __future__ import annotations
from typing import Any
from src.services.payment.gateway.base import PaymentGateway
class AlipayGateway(PaymentGateway):
payment_method = "alipay"
display_name = "支付宝"
def create_checkout_payload(self, *, order: Any) -> dict[str, Any]:
gateway_order_id = getattr(order, "gateway_order_id", None) or f"ali_{order.order_no}"
return {
"gateway": self.payment_method,
"display_name": self.display_name,
"gateway_order_id": gateway_order_id,
"payment_url": f"/pay/mock/alipay/{order.order_no}",
"qr_code": f"mock://alipay/{order.order_no}",
"expires_at": getattr(order, "expires_at", None),
}

View File

@@ -0,0 +1,69 @@
from __future__ import annotations
import hashlib
import hmac
import json
from abc import ABC, abstractmethod
from typing import Any
class PaymentGateway(ABC):
"""支付网关抽象。
当前阶段只提供统一结构和占位返回,便于后续接入真实 SDK。
"""
payment_method: str
display_name: str
@abstractmethod
def create_checkout_payload(self, *, order: Any) -> dict[str, Any]:
"""为前端返回统一的支付指引结构。"""
@staticmethod
def build_callback_signature(
*,
payload: dict[str, Any] | None,
callback_secret: str | None,
) -> str | None:
if payload is None:
return None
if not callback_secret:
return None
canonical = json.dumps(
payload,
sort_keys=True,
ensure_ascii=False,
separators=(",", ":"),
default=str,
)
return hmac.new(
callback_secret.encode("utf-8"),
canonical.encode("utf-8"),
hashlib.sha256,
).hexdigest()
def verify_callback_payload(
self,
*,
payload: dict[str, Any] | None,
callback_signature: str | None = None,
callback_secret: str | None = None,
) -> bool:
"""校验回调。
默认使用 HMAC-SHA256 对 payload 进行签名校验。
真实接入时可由各支付渠道覆写该方法使用官方 SDK 验签。
"""
expected_signature = self.build_callback_signature(
payload=payload,
callback_secret=callback_secret,
)
if expected_signature is None:
return False
provided = (callback_signature or "").strip()
if not provided:
return False
if provided.lower().startswith("sha256="):
provided = provided.split("=", 1)[1]
return hmac.compare_digest(provided.lower(), expected_signature.lower())

View File

@@ -0,0 +1,22 @@
from __future__ import annotations
from typing import Any
from src.services.payment.gateway.base import PaymentGateway
class ManualGateway(PaymentGateway):
payment_method = "manual"
display_name = "人工打款"
def create_checkout_payload(self, *, order: Any) -> dict[str, Any]:
gateway_order_id = getattr(order, "gateway_order_id", None) or f"manual_{order.order_no}"
return {
"gateway": self.payment_method,
"display_name": self.display_name,
"gateway_order_id": gateway_order_id,
"payment_url": None,
"qr_code": None,
"instructions": "请线下确认到账后由管理员处理",
"expires_at": getattr(order, "expires_at", None),
}

View File

@@ -0,0 +1,21 @@
from __future__ import annotations
from typing import Any
from src.services.payment.gateway.base import PaymentGateway
class WeChatGateway(PaymentGateway):
payment_method = "wechat"
display_name = "微信支付"
def create_checkout_payload(self, *, order: Any) -> dict[str, Any]:
gateway_order_id = getattr(order, "gateway_order_id", None) or f"wx_{order.order_no}"
return {
"gateway": self.payment_method,
"display_name": self.display_name,
"gateway_order_id": gateway_order_id,
"payment_url": f"/pay/mock/wechat/{order.order_no}",
"qr_code": f"mock://wechat/{order.order_no}",
"expires_at": getattr(order, "expires_at", None),
}