Files
2026-03-15 19:12:12 -05:00

80 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
支付渠道工厂
根据配置返回对应的支付 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"