""" 支付渠道工厂 根据配置返回对应的支付 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"