80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
"""
|
||
支付渠道工厂
|
||
根据配置返回对应的支付 Provider
|
||
默认使用 zpay 替代 xorpay
|
||
"""
|
||
from ..config import (
|
||
PAYMENT_PROVIDER,
|
||
XORPAY_AID,
|
||
XORPAY_SECRET,
|
||
XORPAY_CASHIER_URL,
|
||
ZPAY_PID,
|
||
ZPAY_KEY,
|
||
)
|
||
from .base import PaymentProvider
|
||
from .xorpay import XorPayProvider
|
||
from .zpay import ZPayProvider
|
||
|
||
_provider_instance: PaymentProvider | None = None
|
||
|
||
|
||
def get_payment_provider() -> PaymentProvider:
|
||
"""获取当前配置的支付渠道实例(单例)"""
|
||
global _provider_instance
|
||
if _provider_instance is not None:
|
||
return _provider_instance
|
||
if PAYMENT_PROVIDER == "zpay":
|
||
_provider_instance = ZPayProvider(pid=ZPAY_PID, key=ZPAY_KEY)
|
||
else:
|
||
_provider_instance = XorPayProvider(
|
||
aid=XORPAY_AID,
|
||
secret=XORPAY_SECRET,
|
||
cashier_url=XORPAY_CASHIER_URL,
|
||
)
|
||
return _provider_instance
|
||
|
||
|
||
def get_payment_provider_by_name(name: str) -> PaymentProvider:
|
||
"""按名称获取 Provider(用于 per-request 覆盖)"""
|
||
if name == "xorpay":
|
||
return XorPayProvider(
|
||
aid=XORPAY_AID,
|
||
secret=XORPAY_SECRET,
|
||
cashier_url=XORPAY_CASHIER_URL,
|
||
)
|
||
return ZPayProvider(pid=ZPAY_PID, key=ZPAY_KEY)
|
||
|
||
|
||
def reset_provider():
|
||
"""重置 Provider(用于测试或切换渠道)"""
|
||
global _provider_instance
|
||
_provider_instance = None
|
||
|
||
|
||
def resolve_provider(
|
||
device: str | None = None,
|
||
req_provider: str | None = None,
|
||
user_agent: str | None = None,
|
||
) -> PaymentProvider:
|
||
"""
|
||
根据设备解析支付渠道:
|
||
- 微信内(device=wechat 或 UA 含 MicroMessenger) → xorpay
|
||
- PC/手机浏览器 → zpay
|
||
显式传入的 provider 优先。
|
||
"""
|
||
req = (req_provider or "").strip().lower()
|
||
if req in ("xorpay", "zpay"):
|
||
return get_payment_provider_by_name(req)
|
||
dev = (device or "pc").lower()
|
||
if dev == "wechat":
|
||
return get_payment_provider_by_name("xorpay")
|
||
ua = (user_agent or "").lower()
|
||
if "micromessenger" in ua:
|
||
return get_payment_provider_by_name("xorpay")
|
||
return get_payment_provider_by_name("zpay")
|
||
|
||
|
||
def resolve_channel(item_channel: str | None) -> str:
|
||
"""支付方式固定为微信支付,支付宝暂不提供"""
|
||
return "wxpay"
|