fix: auto-fix code issues (cron)
- 修复重复导入/字段 - 修复异常处理 - 修复PEP8格式问题 - 添加类型注解
This commit is contained in:
@@ -10,19 +10,19 @@ InsightFlow Phase 8 - 订阅与计费系统模块
|
||||
作者: InsightFlow Team
|
||||
"""
|
||||
|
||||
import sqlite3
|
||||
import json
|
||||
import uuid
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, List, Dict, Any
|
||||
from dataclasses import dataclass
|
||||
from enum import Enum
|
||||
import logging
|
||||
import sqlite3
|
||||
import uuid
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timedelta
|
||||
from enum import StrEnum
|
||||
from typing import Any
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SubscriptionStatus(str, Enum):
|
||||
class SubscriptionStatus(StrEnum):
|
||||
"""订阅状态"""
|
||||
ACTIVE = "active" # 活跃
|
||||
CANCELLED = "cancelled" # 已取消
|
||||
@@ -32,7 +32,7 @@ class SubscriptionStatus(str, Enum):
|
||||
PENDING = "pending" # 待支付
|
||||
|
||||
|
||||
class PaymentProvider(str, Enum):
|
||||
class PaymentProvider(StrEnum):
|
||||
"""支付提供商"""
|
||||
STRIPE = "stripe" # Stripe
|
||||
ALIPAY = "alipay" # 支付宝
|
||||
@@ -40,7 +40,7 @@ class PaymentProvider(str, Enum):
|
||||
BANK_TRANSFER = "bank_transfer" # 银行转账
|
||||
|
||||
|
||||
class PaymentStatus(str, Enum):
|
||||
class PaymentStatus(StrEnum):
|
||||
"""支付状态"""
|
||||
PENDING = "pending" # 待支付
|
||||
PROCESSING = "processing" # 处理中
|
||||
@@ -50,7 +50,7 @@ class PaymentStatus(str, Enum):
|
||||
PARTIAL_REFUNDED = "partial_refunded" # 部分退款
|
||||
|
||||
|
||||
class InvoiceStatus(str, Enum):
|
||||
class InvoiceStatus(StrEnum):
|
||||
"""发票状态"""
|
||||
DRAFT = "draft" # 草稿
|
||||
ISSUED = "issued" # 已开具
|
||||
@@ -60,7 +60,7 @@ class InvoiceStatus(str, Enum):
|
||||
CREDIT_NOTE = "credit_note" # 贷项通知单
|
||||
|
||||
|
||||
class RefundStatus(str, Enum):
|
||||
class RefundStatus(StrEnum):
|
||||
"""退款状态"""
|
||||
PENDING = "pending" # 待处理
|
||||
APPROVED = "approved" # 已批准
|
||||
@@ -79,12 +79,12 @@ class SubscriptionPlan:
|
||||
price_monthly: float # 月付价格
|
||||
price_yearly: float # 年付价格
|
||||
currency: str # CNY/USD
|
||||
features: List[str] # 功能列表
|
||||
limits: Dict[str, Any] # 资源限制
|
||||
features: list[str] # 功能列表
|
||||
limits: dict[str, Any] # 资源限制
|
||||
is_active: bool
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
metadata: Dict[str, Any]
|
||||
metadata: dict[str, Any]
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -97,14 +97,14 @@ class Subscription:
|
||||
current_period_start: datetime
|
||||
current_period_end: datetime
|
||||
cancel_at_period_end: bool
|
||||
canceled_at: Optional[datetime]
|
||||
trial_start: Optional[datetime]
|
||||
trial_end: Optional[datetime]
|
||||
payment_provider: Optional[str]
|
||||
provider_subscription_id: Optional[str] # 支付提供商的订阅ID
|
||||
canceled_at: datetime | None
|
||||
trial_start: datetime | None
|
||||
trial_end: datetime | None
|
||||
payment_provider: str | None
|
||||
provider_subscription_id: str | None # 支付提供商的订阅ID
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
metadata: Dict[str, Any]
|
||||
metadata: dict[str, Any]
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -117,8 +117,8 @@ class UsageRecord:
|
||||
unit: str # minutes/mb/count
|
||||
recorded_at: datetime
|
||||
cost: float # 费用
|
||||
description: Optional[str]
|
||||
metadata: Dict[str, Any]
|
||||
description: str | None
|
||||
metadata: dict[str, Any]
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -126,18 +126,18 @@ class Payment:
|
||||
"""支付记录数据类"""
|
||||
id: str
|
||||
tenant_id: str
|
||||
subscription_id: Optional[str]
|
||||
invoice_id: Optional[str]
|
||||
subscription_id: str | None
|
||||
invoice_id: str | None
|
||||
amount: float
|
||||
currency: str
|
||||
provider: str
|
||||
provider_payment_id: Optional[str]
|
||||
provider_payment_id: str | None
|
||||
status: str
|
||||
payment_method: Optional[str]
|
||||
payment_details: Dict[str, Any]
|
||||
paid_at: Optional[datetime]
|
||||
failed_at: Optional[datetime]
|
||||
failure_reason: Optional[str]
|
||||
payment_method: str | None
|
||||
payment_details: dict[str, Any]
|
||||
paid_at: datetime | None
|
||||
failed_at: datetime | None
|
||||
failure_reason: str | None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
@@ -147,7 +147,7 @@ class Invoice:
|
||||
"""发票数据类"""
|
||||
id: str
|
||||
tenant_id: str
|
||||
subscription_id: Optional[str]
|
||||
subscription_id: str | None
|
||||
invoice_number: str
|
||||
status: str
|
||||
amount_due: float
|
||||
@@ -156,11 +156,11 @@ class Invoice:
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
description: str
|
||||
line_items: List[Dict[str, Any]]
|
||||
line_items: list[dict[str, Any]]
|
||||
due_date: datetime
|
||||
paid_at: Optional[datetime]
|
||||
voided_at: Optional[datetime]
|
||||
void_reason: Optional[str]
|
||||
paid_at: datetime | None
|
||||
voided_at: datetime | None
|
||||
void_reason: str | None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
@@ -171,18 +171,18 @@ class Refund:
|
||||
id: str
|
||||
tenant_id: str
|
||||
payment_id: str
|
||||
invoice_id: Optional[str]
|
||||
invoice_id: str | None
|
||||
amount: float
|
||||
currency: str
|
||||
reason: str
|
||||
status: str
|
||||
requested_by: str
|
||||
requested_at: datetime
|
||||
approved_by: Optional[str]
|
||||
approved_at: Optional[str]
|
||||
completed_at: Optional[datetime]
|
||||
provider_refund_id: Optional[str]
|
||||
metadata: Dict[str, Any]
|
||||
approved_by: str | None
|
||||
approved_at: str | None
|
||||
completed_at: datetime | None
|
||||
provider_refund_id: str | None
|
||||
metadata: dict[str, Any]
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
@@ -199,7 +199,7 @@ class BillingHistory:
|
||||
reference_id: str # 关联的订阅/支付/退款ID
|
||||
balance_after: float # 操作后余额
|
||||
created_at: datetime
|
||||
metadata: Dict[str, Any]
|
||||
metadata: dict[str, Any]
|
||||
|
||||
|
||||
class SubscriptionManager:
|
||||
@@ -542,7 +542,7 @@ class SubscriptionManager:
|
||||
|
||||
# ==================== 订阅计划管理 ====================
|
||||
|
||||
def get_plan(self, plan_id: str) -> Optional[SubscriptionPlan]:
|
||||
def get_plan(self, plan_id: str) -> SubscriptionPlan | None:
|
||||
"""获取订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -557,7 +557,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_plan_by_tier(self, tier: str) -> Optional[SubscriptionPlan]:
|
||||
def get_plan_by_tier(self, tier: str) -> SubscriptionPlan | None:
|
||||
"""通过层级获取订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -572,7 +572,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_plans(self, include_inactive: bool = False) -> List[SubscriptionPlan]:
|
||||
def list_plans(self, include_inactive: bool = False) -> list[SubscriptionPlan]:
|
||||
"""列出所有订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -591,8 +591,8 @@ class SubscriptionManager:
|
||||
|
||||
def create_plan(self, name: str, tier: str, description: str,
|
||||
price_monthly: float, price_yearly: float,
|
||||
currency: str = "CNY", features: List[str] = None,
|
||||
limits: Dict[str, Any] = None) -> SubscriptionPlan:
|
||||
currency: str = "CNY", features: list[str] = None,
|
||||
limits: dict[str, Any] = None) -> SubscriptionPlan:
|
||||
"""创建新订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -639,7 +639,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def update_plan(self, plan_id: str, **kwargs) -> Optional[SubscriptionPlan]:
|
||||
def update_plan(self, plan_id: str, **kwargs) -> SubscriptionPlan | None:
|
||||
"""更新订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -685,7 +685,7 @@ class SubscriptionManager:
|
||||
# ==================== 订阅管理 ====================
|
||||
|
||||
def create_subscription(self, tenant_id: str, plan_id: str,
|
||||
payment_provider: Optional[str] = None,
|
||||
payment_provider: str | None = None,
|
||||
trial_days: int = 0,
|
||||
billing_cycle: str = "monthly") -> Subscription:
|
||||
"""创建新订阅"""
|
||||
@@ -785,7 +785,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_subscription(self, subscription_id: str) -> Optional[Subscription]:
|
||||
def get_subscription(self, subscription_id: str) -> Subscription | None:
|
||||
"""获取订阅信息"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -800,7 +800,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_tenant_subscription(self, tenant_id: str) -> Optional[Subscription]:
|
||||
def get_tenant_subscription(self, tenant_id: str) -> Subscription | None:
|
||||
"""获取租户的当前订阅"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -819,7 +819,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def update_subscription(self, subscription_id: str, **kwargs) -> Optional[Subscription]:
|
||||
def update_subscription(self, subscription_id: str, **kwargs) -> Subscription | None:
|
||||
"""更新订阅"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -862,7 +862,7 @@ class SubscriptionManager:
|
||||
conn.close()
|
||||
|
||||
def cancel_subscription(self, subscription_id: str,
|
||||
at_period_end: bool = True) -> Optional[Subscription]:
|
||||
at_period_end: bool = True) -> Subscription | None:
|
||||
"""取消订阅"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -904,7 +904,7 @@ class SubscriptionManager:
|
||||
conn.close()
|
||||
|
||||
def change_plan(self, subscription_id: str, new_plan_id: str,
|
||||
prorate: bool = True) -> Optional[Subscription]:
|
||||
prorate: bool = True) -> Subscription | None:
|
||||
"""更改订阅计划"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -950,8 +950,8 @@ class SubscriptionManager:
|
||||
|
||||
def record_usage(self, tenant_id: str, resource_type: str,
|
||||
quantity: float, unit: str,
|
||||
description: Optional[str] = None,
|
||||
metadata: Optional[Dict] = None) -> UsageRecord:
|
||||
description: str | None = None,
|
||||
metadata: dict | None = None) -> UsageRecord:
|
||||
"""记录用量"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -989,8 +989,8 @@ class SubscriptionManager:
|
||||
conn.close()
|
||||
|
||||
def get_usage_summary(self, tenant_id: str,
|
||||
start_date: Optional[datetime] = None,
|
||||
end_date: Optional[datetime] = None) -> Dict[str, Any]:
|
||||
start_date: datetime | None = None,
|
||||
end_date: datetime | None = None) -> dict[str, Any]:
|
||||
"""获取用量汇总"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1061,10 +1061,10 @@ class SubscriptionManager:
|
||||
# ==================== 支付管理 ====================
|
||||
|
||||
def create_payment(self, tenant_id: str, amount: float, currency: str,
|
||||
provider: str, subscription_id: Optional[str] = None,
|
||||
invoice_id: Optional[str] = None,
|
||||
payment_method: Optional[str] = None,
|
||||
payment_details: Optional[Dict] = None) -> Payment:
|
||||
provider: str, subscription_id: str | None = None,
|
||||
invoice_id: str | None = None,
|
||||
payment_method: str | None = None,
|
||||
payment_details: dict | None = None) -> Payment:
|
||||
"""创建支付记录"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1113,7 +1113,7 @@ class SubscriptionManager:
|
||||
conn.close()
|
||||
|
||||
def confirm_payment(self, payment_id: str,
|
||||
provider_payment_id: Optional[str] = None) -> Optional[Payment]:
|
||||
provider_payment_id: str | None = None) -> Payment | None:
|
||||
"""确认支付完成"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1160,7 +1160,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def fail_payment(self, payment_id: str, reason: str) -> Optional[Payment]:
|
||||
def fail_payment(self, payment_id: str, reason: str) -> Payment | None:
|
||||
"""标记支付失败"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1179,7 +1179,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_payment(self, payment_id: str) -> Optional[Payment]:
|
||||
def get_payment(self, payment_id: str) -> Payment | None:
|
||||
"""获取支付记录"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1187,8 +1187,8 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_payments(self, tenant_id: str, status: Optional[str] = None,
|
||||
limit: int = 100, offset: int = 0) -> List[Payment]:
|
||||
def list_payments(self, tenant_id: str, status: str | None = None,
|
||||
limit: int = 100, offset: int = 0) -> list[Payment]:
|
||||
"""列出支付记录"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1212,7 +1212,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def _get_payment_internal(self, conn: sqlite3.Connection, payment_id: str) -> Optional[Payment]:
|
||||
def _get_payment_internal(self, conn: sqlite3.Connection, payment_id: str) -> Payment | None:
|
||||
"""内部方法:获取支付记录"""
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT * FROM payments WHERE id = ?", (payment_id,))
|
||||
@@ -1225,10 +1225,10 @@ class SubscriptionManager:
|
||||
# ==================== 发票管理 ====================
|
||||
|
||||
def _create_invoice_internal(self, conn: sqlite3.Connection, tenant_id: str,
|
||||
subscription_id: Optional[str], amount: float,
|
||||
subscription_id: str | None, amount: float,
|
||||
currency: str, period_start: datetime,
|
||||
period_end: datetime, description: str,
|
||||
line_items: Optional[List[Dict]] = None) -> Invoice:
|
||||
line_items: list[dict] | None = None) -> Invoice:
|
||||
"""内部方法:创建发票"""
|
||||
invoice_id = str(uuid.uuid4())
|
||||
invoice_number = self._generate_invoice_number()
|
||||
@@ -1275,7 +1275,7 @@ class SubscriptionManager:
|
||||
|
||||
return invoice
|
||||
|
||||
def get_invoice(self, invoice_id: str) -> Optional[Invoice]:
|
||||
def get_invoice(self, invoice_id: str) -> Invoice | None:
|
||||
"""获取发票"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1290,7 +1290,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_invoice_by_number(self, invoice_number: str) -> Optional[Invoice]:
|
||||
def get_invoice_by_number(self, invoice_number: str) -> Invoice | None:
|
||||
"""通过发票号获取发票"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1305,8 +1305,8 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_invoices(self, tenant_id: str, status: Optional[str] = None,
|
||||
limit: int = 100, offset: int = 0) -> List[Invoice]:
|
||||
def list_invoices(self, tenant_id: str, status: str | None = None,
|
||||
limit: int = 100, offset: int = 0) -> list[Invoice]:
|
||||
"""列出发票"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1330,7 +1330,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def void_invoice(self, invoice_id: str, reason: str) -> Optional[Invoice]:
|
||||
def void_invoice(self, invoice_id: str, reason: str) -> Invoice | None:
|
||||
"""作废发票"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1442,7 +1442,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def approve_refund(self, refund_id: str, approved_by: str) -> Optional[Refund]:
|
||||
def approve_refund(self, refund_id: str, approved_by: str) -> Refund | None:
|
||||
"""批准退款"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1469,7 +1469,7 @@ class SubscriptionManager:
|
||||
conn.close()
|
||||
|
||||
def complete_refund(self, refund_id: str,
|
||||
provider_refund_id: Optional[str] = None) -> Optional[Refund]:
|
||||
provider_refund_id: str | None = None) -> Refund | None:
|
||||
"""完成退款"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1507,7 +1507,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def reject_refund(self, refund_id: str, reason: str) -> Optional[Refund]:
|
||||
def reject_refund(self, refund_id: str, reason: str) -> Refund | None:
|
||||
"""拒绝退款"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1530,7 +1530,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def get_refund(self, refund_id: str) -> Optional[Refund]:
|
||||
def get_refund(self, refund_id: str) -> Refund | None:
|
||||
"""获取退款记录"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1538,8 +1538,8 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def list_refunds(self, tenant_id: str, status: Optional[str] = None,
|
||||
limit: int = 100, offset: int = 0) -> List[Refund]:
|
||||
def list_refunds(self, tenant_id: str, status: str | None = None,
|
||||
limit: int = 100, offset: int = 0) -> list[Refund]:
|
||||
"""列出退款记录"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1563,7 +1563,7 @@ class SubscriptionManager:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def _get_refund_internal(self, conn: sqlite3.Connection, refund_id: str) -> Optional[Refund]:
|
||||
def _get_refund_internal(self, conn: sqlite3.Connection, refund_id: str) -> Refund | None:
|
||||
"""内部方法:获取退款记录"""
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT * FROM refunds WHERE id = ?", (refund_id,))
|
||||
@@ -1593,9 +1593,9 @@ class SubscriptionManager:
|
||||
))
|
||||
|
||||
def get_billing_history(self, tenant_id: str,
|
||||
start_date: Optional[datetime] = None,
|
||||
end_date: Optional[datetime] = None,
|
||||
limit: int = 100, offset: int = 0) -> List[BillingHistory]:
|
||||
start_date: datetime | None = None,
|
||||
end_date: datetime | None = None,
|
||||
limit: int = 100, offset: int = 0) -> list[BillingHistory]:
|
||||
"""获取账单历史"""
|
||||
conn = self._get_connection()
|
||||
try:
|
||||
@@ -1626,7 +1626,7 @@ class SubscriptionManager:
|
||||
|
||||
def create_stripe_checkout_session(self, tenant_id: str, plan_id: str,
|
||||
success_url: str, cancel_url: str,
|
||||
billing_cycle: str = "monthly") -> Dict[str, Any]:
|
||||
billing_cycle: str = "monthly") -> dict[str, Any]:
|
||||
"""创建 Stripe Checkout 会话(占位实现)"""
|
||||
# 这里应该集成 Stripe SDK
|
||||
# 简化实现,返回模拟数据
|
||||
@@ -1638,7 +1638,7 @@ class SubscriptionManager:
|
||||
}
|
||||
|
||||
def create_alipay_order(self, tenant_id: str, plan_id: str,
|
||||
billing_cycle: str = "monthly") -> Dict[str, Any]:
|
||||
billing_cycle: str = "monthly") -> dict[str, Any]:
|
||||
"""创建支付宝订单(占位实现)"""
|
||||
# 这里应该集成支付宝 SDK
|
||||
plan = self.get_plan(plan_id)
|
||||
@@ -1654,7 +1654,7 @@ class SubscriptionManager:
|
||||
}
|
||||
|
||||
def create_wechat_order(self, tenant_id: str, plan_id: str,
|
||||
billing_cycle: str = "monthly") -> Dict[str, Any]:
|
||||
billing_cycle: str = "monthly") -> dict[str, Any]:
|
||||
"""创建微信支付订单(占位实现)"""
|
||||
# 这里应该集成微信支付 SDK
|
||||
plan = self.get_plan(plan_id)
|
||||
@@ -1669,7 +1669,7 @@ class SubscriptionManager:
|
||||
"provider": "wechat"
|
||||
}
|
||||
|
||||
def handle_webhook(self, provider: str, payload: Dict[str, Any]) -> bool:
|
||||
def handle_webhook(self, provider: str, payload: dict[str, Any]) -> bool:
|
||||
"""处理支付提供商的 Webhook(占位实现)"""
|
||||
# 这里应该实现实际的 Webhook 处理逻辑
|
||||
logger.info(f"Received webhook from {provider}: {payload.get('event_type', 'unknown')}")
|
||||
|
||||
Reference in New Issue
Block a user