Module: SpreeAdyen::Gateway::PaymentSessions

Extended by:
ActiveSupport::Concern
Included in:
SpreeAdyen::Gateway
Defined in:
app/models/spree_adyen/gateway/payment_sessions.rb

Instance Method Summary collapse

Instance Method Details

#complete_payment_session(payment_session:, params: {}) ⇒ Object

Completes a payment session by checking the session result with Adyen, creating the Payment record, and transitioning the session accordingly.

Does NOT complete the order — that is handled by Carts::Complete (called by the storefront or by the webhook handler).

Parameters:

  • payment_session (Spree::PaymentSessions::Adyen)

    the session to complete

  • params (Hash) (defaults to: {})

    must include :session_result or external_data with :redirect_result

Raises:

  • (Spree::Core::GatewayError)

    if neither session_result nor redirect_result is provided



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'app/models/spree_adyen/gateway/payment_sessions.rb', line 70

def complete_payment_session(payment_session:, params: {})
  session_result = params[:session_result] || params['session_result']

  if session_result.blank?
    external_data = params[:external_data] || params['external_data'] || {}
    redirect_result = external_data[:redirect_result] || external_data['redirect_result']

    raise Spree::Core::GatewayError, 'session_result or redirect_result is required' if redirect_result.blank?

    return complete_payment_session_from_redirect(payment_session, redirect_result)
  end

  complete_payment_session_from_result(payment_session, session_result)
end

#create_payment_session(order:, amount: nil, external_data: {}) ⇒ Spree::PaymentSessions::Adyen

Creates a new Adyen payment session via the Adyen Sessions API and persists a Spree::PaymentSessions::Adyen record.

Parameters:

  • order (Spree::Order)

    the order to create a session for

  • amount (BigDecimal, nil) (defaults to: nil)

    the amount (defaults to order total minus store credits)

  • external_data (Hash) (defaults to: {})

    additional data (e.g., channel, return_url)

Returns:

  • (Spree::PaymentSessions::Adyen)

    the created payment session record



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/models/spree_adyen/gateway/payment_sessions.rb', line 21

def create_payment_session(order:, amount: nil, external_data: {})
  total = amount.presence || order.total_minus_store_credits
  channel = external_data[:channel] || external_data['channel'] || Spree::PaymentSessions::Adyen::AVAILABLE_CHANNELS[:web]
  return_url = external_data[:return_url] || external_data['return_url'] || default_return_url(order)

  response = create_adyen_session(total, order, channel, return_url)

  payment_session_class.create!(
    order: order,
    payment_method: self,
    amount: total,
    currency: order.currency,
    status: 'pending',
    external_id: response.params['id'],
    customer: order.user,
    expires_at: response.params['expiresAt'],
    external_data: {
      'session_data' => response.params['sessionData'],
      'channel' => channel,
      'return_url' => return_url
    }
  )
end

#payment_session_classObject



10
11
12
# File 'app/models/spree_adyen/gateway/payment_sessions.rb', line 10

def payment_session_class
  Spree::PaymentSessions::Adyen
end

#session_required?Boolean

Returns:

  • (Boolean)


6
7
8
# File 'app/models/spree_adyen/gateway/payment_sessions.rb', line 6

def session_required?
  true
end

#update_payment_session(payment_session:, amount: nil, external_data: {}) ⇒ Object

Updates an existing payment session amount.

Parameters:

  • payment_session (Spree::PaymentSessions::Adyen)

    the session to update

  • amount (BigDecimal, nil) (defaults to: nil)

    new amount

  • external_data (Hash) (defaults to: {})

    additional data to merge



50
51
52
53
54
55
56
57
58
59
# File 'app/models/spree_adyen/gateway/payment_sessions.rb', line 50

def update_payment_session(payment_session:, amount: nil, external_data: {})
  attrs = {}
  attrs[:amount] = amount if amount.present?

  if external_data.present?
    attrs[:external_data] = (payment_session.external_data || {}).merge(external_data.stringify_keys)
  end

  payment_session.update!(attrs) if attrs.any?
end