160 lines
4.0 KiB
Python
160 lines
4.0 KiB
Python
|
|
"""
|
||
|
|
Payment Provider Interface
|
||
|
|
Abstract base class for payment provider implementations
|
||
|
|
Allows easy swapping of payment SDKs (Stripe, PayPal, etc.)
|
||
|
|
"""
|
||
|
|
|
||
|
|
from abc import ABC, abstractmethod
|
||
|
|
from typing import Dict, Any, Optional
|
||
|
|
|
||
|
|
|
||
|
|
class PaymentProvider(ABC):
|
||
|
|
"""
|
||
|
|
Abstract Payment Provider Interface
|
||
|
|
Define all required methods for payment processing
|
||
|
|
"""
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def create_customer(
|
||
|
|
self,
|
||
|
|
email: str,
|
||
|
|
name: Optional[str] = None,
|
||
|
|
metadata: Optional[Dict[str, Any]] = None
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Create a customer in the payment provider"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def attach_payment_method(
|
||
|
|
self,
|
||
|
|
payment_method_id: str,
|
||
|
|
customer_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Attach a payment method to a customer"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def set_default_payment_method(
|
||
|
|
self,
|
||
|
|
customer_id: str,
|
||
|
|
payment_method_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Set the default payment method for a customer"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def create_setup_intent_for_verification(
|
||
|
|
self,
|
||
|
|
customer_id: str,
|
||
|
|
payment_method_id: str,
|
||
|
|
metadata: Optional[Dict[str, Any]] = None
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Create a SetupIntent for payment method verification (3DS support)"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def verify_setup_intent_status(
|
||
|
|
self,
|
||
|
|
setup_intent_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Verify the status of a SetupIntent"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def create_subscription_with_verified_payment(
|
||
|
|
self,
|
||
|
|
customer_id: str,
|
||
|
|
price_id: str,
|
||
|
|
payment_method_id: str,
|
||
|
|
trial_period_days: Optional[int] = None,
|
||
|
|
billing_cycle_anchor: Optional[Any] = None,
|
||
|
|
metadata: Optional[Dict[str, Any]] = None
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Create a subscription with a verified payment method
|
||
|
|
|
||
|
|
Args:
|
||
|
|
billing_cycle_anchor: Can be int (Unix timestamp), "now", or "unchanged"
|
||
|
|
"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def create_setup_intent(self) -> Dict[str, Any]:
|
||
|
|
"""Create a basic SetupIntent"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def get_setup_intent(
|
||
|
|
self,
|
||
|
|
setup_intent_id: str
|
||
|
|
) -> Any:
|
||
|
|
"""Get SetupIntent details"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def create_payment_intent(
|
||
|
|
self,
|
||
|
|
amount: float,
|
||
|
|
currency: str,
|
||
|
|
customer_id: str,
|
||
|
|
payment_method_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Create a PaymentIntent for one-time payments"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def complete_subscription_after_setup_intent(
|
||
|
|
self,
|
||
|
|
setup_intent_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Complete subscription creation after SetupIntent verification"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def cancel_subscription(
|
||
|
|
self,
|
||
|
|
subscription_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Cancel a subscription"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def update_payment_method(
|
||
|
|
self,
|
||
|
|
customer_id: str,
|
||
|
|
payment_method_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Update customer's payment method"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def update_subscription(
|
||
|
|
self,
|
||
|
|
subscription_id: str,
|
||
|
|
new_price_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Update subscription price"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def get_subscription(
|
||
|
|
self,
|
||
|
|
subscription_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Get subscription details"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def get_customer_payment_method(
|
||
|
|
self,
|
||
|
|
customer_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Get customer's payment method"""
|
||
|
|
pass
|
||
|
|
|
||
|
|
@abstractmethod
|
||
|
|
async def get_invoices(
|
||
|
|
self,
|
||
|
|
customer_id: str
|
||
|
|
) -> Dict[str, Any]:
|
||
|
|
"""Get customer invoices"""
|
||
|
|
pass
|