feat(wallet): 钱包系统替代配额系统,新增支付与退款机制

- 新增钱包余额管理、充值、扣费、退款完整流程
- 新增支付网关抽象层(支持手动/支付宝/微信)
- 用量计费从配额系统迁移到钱包余额扣费
- 新增管理员钱包管理与支付订单管理页面
- 新增用户钱包中心页面
- 移除独立 Key 锁定机制,统一由钱包余额控制
- 新增相关 API 路由、序列化器与数据库迁移
- 新增钱包、支付、退款相关测试
This commit is contained in:
LewisPen
2026-03-08 00:05:48 +08:00
committed by fawney19
parent 9cdcce1b5f
commit 783f654953
108 changed files with 13152 additions and 3372 deletions

View File

@@ -39,6 +39,7 @@ from src.services.auth.service import AuthService
from src.services.gemini_files_mapping import delete_file_key_mapping, store_file_key_mapping
from src.services.provider.transport import redact_url_for_log
from src.services.scheduling.aware_scheduler import CacheAwareScheduler, ProviderCandidate
from src.services.usage.service import UsageService
@dataclass
@@ -111,6 +112,22 @@ def _build_upstream_headers(
return headers
def _ensure_balance_access(db: Session, user: User, api_key: ApiKey) -> None:
access_ok, message = UsageService.check_request_balance(db, user, api_key=api_key)
if access_ok:
return
raise HTTPException(
status_code=429,
detail={
"error": {
"code": 429,
"message": message or "Insufficient balance",
"status": "RESOURCE_EXHAUSTED",
}
},
)
def _build_upstream_url(
base_url: str,
path: str,
@@ -276,6 +293,7 @@ async def _resolve_upstream_context(
)
user, user_api_key = auth_result
_ensure_balance_access(db, user, user_api_key)
model_name = _resolve_files_model_name(db, user_api_key, user)
if not model_name:
raise HTTPException(
@@ -728,6 +746,7 @@ async def download_file(
)
user, _user_api_key = auth_result
_ensure_balance_access(db, user, _user_api_key)
# 根据前缀判断处理方式
if file_id.startswith("aev_"):