Class: Spree::PaymentMethod

Inherits:
Base
  • Object
show all
Includes:
Spree::Preferences::Persistable, Spree::Preferences::StaticallyConfigurable, SoftDeletable
Defined in:
app/models/spree/payment_method.rb

Overview

A base class which is used for implementing payment methods.

Uses STI (single table inheritance) to store all implemented payment methods in one table (spree_payment_methods).

This class is not meant to be instantiated. Please create instances of concrete payment methods.

Direct Known Subclasses

BillingIntegration, Check, CreditCard, StoreCredit

Defined Under Namespace

Classes: BogusCreditCard, Check, CreditCard, ModelName, SimpleBogusCreditCard, StoreCredit, UnsupportedPaymentMethod

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Spree::Preferences::StaticallyConfigurable

#preference_source=, #preferences, #preferences=

Methods inherited from Base

display_includes

Methods included from Core::Permalinks

#generate_permalink, #save_permalink

Class Method Details

.find_sti_class(type_name) ⇒ Object


65
66
67
68
69
70
71
72
73
# File 'app/models/spree/payment_method.rb', line 65

def find_sti_class(type_name)
  super(type_name)
rescue ActiveRecord::SubclassNotFound
  raise UnsupportedPaymentMethod, "Found invalid payment type '#{type_name}'.\n"\
    "This may happen after switching payment service provider, when payment methods "\
    "reference old types that are not supported any more.\n"\
    "If that is the case, consider running 'rake payment_method:deprecate_unsupported_payment_methods' "\
    "to fix the issue."
end

.model_nameObject


61
62
63
# File 'app/models/spree/payment_method.rb', line 61

def model_name
  ModelName.new(self, Spree)
end

Instance Method Details

#auto_capture?Boolean

Returns:

  • (Boolean)

156
157
158
# File 'app/models/spree/payment_method.rb', line 156

def auto_capture?
  auto_capture.nil? ? Spree::Config[:auto_capture] : auto_capture
end

#gatewayObject

Represents the gateway of this payment method

The gateway is responsible for communicating with the providers API.

It implements methods for:

- authorize
- purchase
- capture
- void
- credit

88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/models/spree/payment_method.rb', line 88

def gateway
  gateway_options = options
  gateway_options.delete :login if gateway_options.key?(:login) && gateway_options[:login].nil?

  # All environments except production considered to be test
  test_server = gateway_options[:server] != 'production'
  test_mode = gateway_options[:test_mode]

  gateway_options[:test] = (test_server || test_mode)

  @gateway ||= gateway_class.new(gateway_options)
end

#optionsObject

Represents all preferences as a Hash

Each preference is a key holding the value(s) and gets passed to the gateway via gateway_options

Returns:

  • Hash


106
107
108
# File 'app/models/spree/payment_method.rb', line 106

def options
  preferences.to_hash
end

#partial_nameObject

Used as partial name for your payment method

Currently your payment method needs to provide these partials:

1. app/views/spree/checkout/payment/_{partial_name}.html.erb
The form your customer enters the payment information in during checkout

2. app/views/spree/checkout/existing_payment/_{partial_name}.html.erb
The payment information of your customers reusable sources during checkout

3. app/views/spree/admin/payments/source_forms/_{partial_name}.html.erb
The form an admin enters payment information in when creating orders in the backend

4. app/views/spree/admin/payments/source_views/_{partial_name}.html.erb
The view that represents your payment method on orders in the backend

5. app/views/spree/api/payments/source_views/_{partial_name}.json.jbuilder
The view that represents your payment method on orders through the api

138
139
140
# File 'app/models/spree/payment_method.rb', line 138

def partial_name
  type.demodulize.underscore
end

#payment_profiles_supported?Boolean

Returns:

  • (Boolean)

142
143
144
# File 'app/models/spree/payment_method.rb', line 142

def payment_profiles_supported?
  false
end

#payment_source_classObject

The class that will store payment sources (re)usable with this payment method

Used by Spree::Payment as source (e.g. Spree::CreditCard in the case of a credit card payment method).

Returning nil means the payment method doesn't support storing sources (e.g. Spree::PaymentMethod::Check)

Raises:

  • (::NotImplementedError)

115
116
117
# File 'app/models/spree/payment_method.rb', line 115

def payment_source_class
  raise ::NotImplementedError, "You must implement payment_source_class method for #{self.class}."
end

#reusable_sources(_order) ⇒ Object

Custom gateways can redefine this method to return reusable sources for an order. See Spree::PaymentMethod::CreditCard#reusable_sources as an example


152
153
154
# File 'app/models/spree/payment_method.rb', line 152

def reusable_sources(_order)
  []
end

#source_required?Boolean

Returns:

  • (Boolean)

146
147
148
# File 'app/models/spree/payment_method.rb', line 146

def source_required?
  true
end

#store_credit?Boolean

Returns:

  • (Boolean)

188
189
190
# File 'app/models/spree/payment_method.rb', line 188

def store_credit?
  is_a? Spree::PaymentMethod::StoreCredit
end

#supports?(_source) ⇒ Boolean

Check if given source is supported by this payment method

Please implement validation logic in your payment method implementation

Returns:

  • (Boolean)

See Also:


165
166
167
# File 'app/models/spree/payment_method.rb', line 165

def supports?(_source)
  true
end

#try_void(_payment) ⇒ ActiveMerchant::Billing::Response, false

Used by Spree::Payment#cancel!

Implement `try_void` on your payment method implementation to handle void attempts. In that method return a ActiveMerchant::Billing::Response object if the void succeeds. Return false or nil if the void is not possible anymore - because it was already processed by the bank. Solidus will refund the amount of the payment in this case.

Returns:

  • (ActiveMerchant::Billing::Response)

    with true if the void succeeded

  • (ActiveMerchant::Billing::Response)

    with false if the void failed

  • (false)

    if it can't be voided at this time

Raises:

  • (::NotImplementedError)

180
181
182
183
184
185
186
# File 'app/models/spree/payment_method.rb', line 180

def try_void(_payment)
  raise ::NotImplementedError,
    "You need to implement `try_void` for #{self.class.name}. In that " \
    'return a ActiveMerchant::Billing::Response object if the void succeeds '\
    'or `false|nil` if the void is not possible anymore. ' \
    'Solidus will refund the amount of the payment then.'
end