数据库与模型:新增多版迁移(章节证据快照、对话血缘、记忆事实/时间线 lineage 等),把「成稿 ↔ 对话/记忆」的溯源信息落到表结构里。 业务链路:会话与 WS、回忆录/故事流水线、记忆写入与 enrichment 等跟着接上线索与快照;新增章节证据快照与评测侧 EvalTraceService 等模块,方便组评审用的证据包。 内部评测:自动化 run 与手工 memoir 评审共用可追溯证据;rubric/ judge 相关脚本与文档有配套调整。 app-eval-web:Memoir/实验详情里能展开看证据摘要与 evidence_trace(含对话轮次 id);Vite 代理与 development.sh 注入的 API 端口与当前默认内部评测端口一致,避免改端口后页面连错服务。 工程杂项:GitHub Actions / 仓库说明有更新;各适配器与支付/配额/plan 等多处为小改动或跟随主改动的收尾;新增/扩充了?
93 lines
3.3 KiB
Python
93 lines
3.3 KiB
Python
"""
|
||
统一支付服务门面(从 payment 迁入 app)
|
||
"""
|
||
|
||
from typing import Dict, Optional
|
||
|
||
from app.core.logging import get_logger
|
||
from app.features.payment.alipay_client import AlipayClient
|
||
from app.features.payment.payment_config import PaymentConfig
|
||
from app.features.payment.payment_exceptions import PaymentError
|
||
from app.features.payment.schemas import NotifyResult, PaymentResult, PaymentStatus
|
||
from app.features.payment.wechat_client import WeChatPayClient
|
||
|
||
logger = get_logger(__name__)
|
||
|
||
PAYMENT_METHOD_WECHAT = "wechat"
|
||
PAYMENT_METHOD_ALIPAY = "alipay"
|
||
SUPPORTED_METHODS = {PAYMENT_METHOD_WECHAT, PAYMENT_METHOD_ALIPAY}
|
||
|
||
|
||
class PaymentService:
|
||
def __init__(self, config: PaymentConfig):
|
||
self._config = config
|
||
self._wechat_client: Optional[WeChatPayClient] = None
|
||
self._alipay_client: Optional[AlipayClient] = None
|
||
|
||
@property
|
||
def wechat_client(self) -> WeChatPayClient:
|
||
if self._wechat_client is None:
|
||
self._wechat_client = WeChatPayClient(self._config.wechat)
|
||
return self._wechat_client
|
||
|
||
@property
|
||
def alipay_client(self) -> AlipayClient:
|
||
if self._alipay_client is None:
|
||
self._alipay_client = AlipayClient(self._config.alipay)
|
||
return self._alipay_client
|
||
|
||
def create_payment(
|
||
self,
|
||
method: str,
|
||
out_trade_no: str,
|
||
total_amount: int,
|
||
description: str,
|
||
) -> PaymentResult:
|
||
self._validate_method(method)
|
||
if method == PAYMENT_METHOD_WECHAT:
|
||
return self.wechat_client.create_app_order(
|
||
out_trade_no=out_trade_no,
|
||
total_amount=total_amount,
|
||
description=description,
|
||
)
|
||
return self.alipay_client.create_app_order(
|
||
out_trade_no=out_trade_no,
|
||
total_amount=total_amount,
|
||
subject=description,
|
||
)
|
||
|
||
def handle_wechat_notify(self, headers: Dict[str, str], body: str) -> NotifyResult:
|
||
return self.wechat_client.verify_notify(headers=headers, body=body)
|
||
|
||
def handle_alipay_notify(self, params: Dict[str, str]) -> NotifyResult:
|
||
return self.alipay_client.verify_notify(params=params)
|
||
|
||
def query_payment(self, method: str, out_trade_no: str) -> PaymentStatus:
|
||
self._validate_method(method)
|
||
if method == PAYMENT_METHOD_WECHAT:
|
||
return self.wechat_client.query_order(out_trade_no=out_trade_no)
|
||
return self.alipay_client.query_order(out_trade_no=out_trade_no)
|
||
|
||
def close_payment(self, method: str, out_trade_no: str) -> bool:
|
||
self._validate_method(method)
|
||
if method == PAYMENT_METHOD_WECHAT:
|
||
return self.wechat_client.close_order(out_trade_no=out_trade_no)
|
||
return self.alipay_client.close_order(out_trade_no=out_trade_no)
|
||
|
||
def is_method_available(self, method: str) -> bool:
|
||
if method == PAYMENT_METHOD_WECHAT:
|
||
return self._config.wechat.is_configured
|
||
if method == PAYMENT_METHOD_ALIPAY:
|
||
if getattr(self._config, "alipay_under_development", True):
|
||
return False
|
||
return self._config.alipay.is_configured
|
||
return False
|
||
|
||
@staticmethod
|
||
def _validate_method(method: str):
|
||
if method not in SUPPORTED_METHODS:
|
||
raise PaymentError(
|
||
f"不支持的支付方式: {method}",
|
||
code="UNSUPPORTED_METHOD",
|
||
)
|