Skip to content

Models

PaymentState

Bases: str, Enum

Normalised payment lifecycle states.

Source code in merchants/models.py
class PaymentState(str, Enum):
    """Normalised payment lifecycle states."""

    PENDING = "pending"
    PROCESSING = "processing"
    SUCCEEDED = "succeeded"
    FAILED = "failed"
    CANCELLED = "cancelled"
    REFUNDED = "refunded"
    UNKNOWN = "unknown"

CheckoutSession

Bases: BaseModel

A hosted-checkout session returned by a provider.

Source code in merchants/models.py
class CheckoutSession(BaseModel):
    """A hosted-checkout session returned by a provider."""

    session_id: str
    redirect_url: str
    provider: str
    amount: Decimal
    currency: str
    metadata: dict[str, Any] = Field(default_factory=dict)
    raw: dict[str, Any] = Field(default_factory=dict)
    initial_state: PaymentState = PaymentState.PENDING

PaymentStatus

Bases: BaseModel

Normalised status of a payment retrieved from a provider.

Source code in merchants/models.py
class PaymentStatus(BaseModel):
    """Normalised status of a payment retrieved from a provider."""

    payment_id: str
    state: PaymentState
    provider: str
    amount: Decimal | None = None
    currency: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)
    raw: dict[str, Any] = Field(default_factory=dict)

    @property
    def is_final(self) -> bool:
        """Return True when no further state transitions are expected."""
        return self.state in (
            PaymentState.SUCCEEDED,
            PaymentState.FAILED,
            PaymentState.CANCELLED,
            PaymentState.REFUNDED,
        )

    @property
    def is_success(self) -> bool:
        """Return True only when the payment definitively succeeded."""
        return self.state is PaymentState.SUCCEEDED

Attributes

is_final property

is_final: bool

Return True when no further state transitions are expected.

is_success property

is_success: bool

Return True only when the payment definitively succeeded.

WebhookEvent

Bases: BaseModel

Parsed, normalised webhook event from a provider.

Source code in merchants/models.py
class WebhookEvent(BaseModel):
    """Parsed, normalised webhook event from a provider."""

    event_id: str | None = None
    event_type: str
    payment_id: str | None = None
    state: PaymentState = PaymentState.UNKNOWN
    provider: str = "unknown"
    raw: dict[str, Any] = Field(default_factory=dict)