PhoenixKit.Modules.Billing.Providers (phoenix_kit v1.7.71)

Copy Markdown View Source

Provider registry and helper functions for payment providers.

This module serves as the central point for working with payment providers. It handles provider lookup, availability checking, and configuration.

Available Providers

  • :stripe - Stripe payments (cards, wallets)
  • :paypal - PayPal payments
  • :razorpay - Razorpay payments (India)

Usage

# Get a provider module
provider = Providers.get_provider(:stripe)
provider.create_checkout_session(invoice, opts)

# List available providers
Providers.list_available_providers()
#=> [:stripe, :paypal]

# Check if provider is available
Providers.provider_enabled?(:stripe)
#=> true

Summary

Functions

Returns a list of all provider names.

Charges a saved payment method using the appropriate provider.

Creates a checkout session using the specified provider.

Creates a refund using the appropriate provider.

Creates a setup session using the specified provider.

Gets the setting key for a provider's enabled status.

Returns the provider module for the given provider name.

Handles a webhook event for the specified provider.

Returns a list of available (enabled and configured) provider names.

Checks if a provider is enabled and available.

Checks if a provider exists (regardless of availability).

Returns display information for a provider.

Checks if a provider is enabled in settings.

Verifies a webhook signature for the specified provider.

Functions

all_providers()

@spec all_providers() :: [atom()]

Returns a list of all provider names.

Examples

iex> Providers.all_providers()
[:stripe, :paypal, :razorpay]

charge_payment_method(payment_method, amount, opts \\ [])

@spec charge_payment_method(map(), Decimal.t(), keyword()) ::
  {:ok, PhoenixKit.Modules.Billing.Providers.Provider.charge_result()}
  | {:error, term()}

Charges a saved payment method using the appropriate provider.

Parameters

  • payment_method - Saved payment method record (must include :provider)
  • amount - Amount to charge
  • opts - Options passed to provider

Returns

  • {:ok, charge_result} - Charge successful
  • {:error, reason} - Charge failed

create_checkout_session(provider, invoice, opts \\ [])

@spec create_checkout_session(atom() | String.t(), map(), keyword()) ::
  {:ok, PhoenixKit.Modules.Billing.Providers.Provider.checkout_session()}
  | {:error, term()}

Creates a checkout session using the specified provider.

Convenience function that looks up the provider and calls create_checkout_session/2.

Parameters

  • provider - Provider name
  • invoice - Invoice to pay
  • opts - Options passed to provider

Returns

  • {:ok, checkout_session} - Session created
  • {:error, :provider_not_found} - Provider doesn't exist
  • {:error, :provider_not_available} - Provider not configured
  • {:error, reason} - Provider-specific error

create_refund(provider, provider_transaction_id, amount, opts \\ [])

@spec create_refund(atom() | String.t(), String.t(), Decimal.t() | nil, keyword()) ::
  {:ok, PhoenixKit.Modules.Billing.Providers.Provider.refund_result()}
  | {:error, term()}

Creates a refund using the appropriate provider.

Parameters

  • provider - Provider name
  • provider_transaction_id - Provider's transaction ID
  • amount - Amount to refund (nil for full refund)
  • opts - Options

Returns

  • {:ok, refund_result} - Refund created
  • {:error, reason} - Refund failed

create_setup_session(provider, user, opts \\ [])

@spec create_setup_session(atom() | String.t(), map(), keyword()) ::
  {:ok, PhoenixKit.Modules.Billing.Providers.Provider.setup_session()}
  | {:error, term()}

Creates a setup session using the specified provider.

Parameters

  • provider - Provider name
  • user - User to save payment method for
  • opts - Options passed to provider

Returns

  • {:ok, setup_session} - Session created
  • {:error, reason} - Failed

enabled_setting_key(provider)

@spec enabled_setting_key(atom()) :: String.t()

Gets the setting key for a provider's enabled status.

Examples

iex> Providers.enabled_setting_key(:stripe)
"billing_stripe_enabled"

get_provider(name)

@spec get_provider(atom() | String.t()) :: module() | nil

Returns the provider module for the given provider name.

Parameters

  • name - Provider name as atom or string

Returns

  • Provider module if found
  • nil if provider not found

Examples

iex> Providers.get_provider(:stripe)
PhoenixKit.Modules.Billing.Providers.Stripe

iex> Providers.get_provider("paypal")
PhoenixKit.Modules.Billing.Providers.PayPal

iex> Providers.get_provider(:unknown)
nil

handle_webhook_event(provider, payload)

@spec handle_webhook_event(atom() | String.t(), map()) ::
  {:ok, PhoenixKit.Modules.Billing.Providers.Provider.webhook_event()}
  | {:error, term()}

Handles a webhook event for the specified provider.

Parameters

  • provider - Provider name
  • payload - Decoded JSON payload

Returns

  • {:ok, webhook_event} - Event parsed
  • {:error, reason} - Failed to parse

list_available_providers()

@spec list_available_providers() :: [atom()]

Returns a list of available (enabled and configured) provider names.

Checks each provider's available?/0 callback to determine availability.

Examples

iex> Providers.list_available_providers()
[:stripe, :paypal]

provider_enabled?(name)

@spec provider_enabled?(atom() | String.t()) :: boolean()

Checks if a provider is enabled and available.

Parameters

  • name - Provider name as atom or string

Returns

  • true if provider is available
  • false if provider is not available or not found

Examples

iex> Providers.provider_enabled?(:stripe)
true

iex> Providers.provider_enabled?(:unknown)
false

provider_exists?(name)

@spec provider_exists?(atom() | String.t()) :: boolean()

Checks if a provider exists (regardless of availability).

Examples

iex> Providers.provider_exists?(:stripe)
true

iex> Providers.provider_exists?(:bitcoin)
false

provider_info(arg1)

Returns display information for a provider.

Examples

iex> Providers.provider_info(:stripe)
%{name: "Stripe", icon: "stripe", color: "#635BFF"}

setting_enabled?(provider)

@spec setting_enabled?(atom()) :: boolean()

Checks if a provider is enabled in settings.

This is a lower-level check that only looks at the setting, not whether the provider is fully configured.

Examples

iex> Providers.setting_enabled?(:stripe)
true

verify_webhook_signature(provider, payload, signature, secret)

@spec verify_webhook_signature(atom() | String.t(), binary(), String.t(), String.t()) ::
  :ok | {:error, term()}

Verifies a webhook signature for the specified provider.

Parameters

  • provider - Provider name
  • payload - Raw request body
  • signature - Signature from headers
  • secret - Webhook secret

Returns

  • :ok - Signature valid
  • {:error, :invalid_signature} - Signature invalid
  • {:error, :provider_not_found} - Provider doesn't exist