class ActivePayment::Gateway

Attributes

gateway[RW]
purchase_token[RW]
transactions[RW]

Public Class Methods

cancel_purchase_from_request(gateway:, request:) click to toggle source
# File lib/active_payment/gateway.rb, line 70
def self.cancel_purchase_from_request(gateway:, request:)
  payment_gateway = ActivePayment::Gateway.new(gateway)
  external_id = payment_gateway.external_id_from_request(request)
  payment_gateway.cancel_purchase(external_id, request.remote_ip)
end
new(name) click to toggle source
# File lib/active_payment/gateway.rb, line 5
def initialize(name)
  @transactions = []

  name_str = name.to_s.strip.downcase
  raise(ArgumentError, 'A gateway provider must be specified') if name_str.blank?

  ActiveMerchant::Billing::Base.mode = :test if ActivePayment.configuration.test

  begin
    @gateway = ActivePayment::Gateways.const_get("#{name_str}".camelize).new
  rescue SyntaxError, NameError
    raise ArgumentError, "The specified gateway is not valid (#{name_str})"
  end
end
verify_purchase_from_request(gateway:, request:, data:) click to toggle source
# File lib/active_payment/gateway.rb, line 64
def self.verify_purchase_from_request(gateway:, request:, data:)
  payment_gateway = ActivePayment::Gateway.new(gateway)
  external_id = payment_gateway.external_id_from_request(request)
  payment_gateway.verify_purchase(external_id, request.remote_ip, data)
end

Public Instance Methods

cancel_purchase(external_id, remote_ip) click to toggle source
# File lib/active_payment/gateway.rb, line 48
def cancel_purchase(external_id, remote_ip)
  @transactions = ActivePayment::Transaction.where(external_id: external_id)
  fail ActivePayment::NoTransactionError unless @transactions.size > 0
  verify_ip_address(@transactions, remote_ip)

  transactions_cancel(@transactions)
end
external_id_from_request(request) click to toggle source
# File lib/active_payment/gateway.rb, line 56
def external_id_from_request(request)
  @gateway.external_id_from_request(request)
end
livemode?() click to toggle source
# File lib/active_payment/gateway.rb, line 60
def livemode?
  @gateway.livemode?
end
setup_purchase(sales, ip_address) click to toggle source
# File lib/active_payment/gateway.rb, line 20
def setup_purchase(sales, ip_address)
  amount = sales.amount_in_cents
  raise ActivePayment::InvalidAmountError unless amount >= ActivePayment.configuration.min_amount

  url = @gateway.setup_purchase(sales)
  @purchase_token = @gateway.purchase_token
  create_transactions(ip_address)

  url
end
verify_purchase(external_id, remote_ip, raw_data) click to toggle source
# File lib/active_payment/gateway.rb, line 31
def verify_purchase(external_id, remote_ip, raw_data)
  @transactions = ActivePayment::Transaction.where(external_id: external_id)
  fail ActivePayment::NoTransactionError unless @transactions.size > 0
  verify_ip_address(@transactions, remote_ip)

  if raw_data.is_a?(Hash) && raw_data[:amount].blank?
    raw_data[:amount] = @transactions.map(&:amount).inject(0, &:+)
  end

  if @gateway.verify_purchase(raw_data)
    transactions_success(@transactions)
  else
    transactions_error(@transactions)
    fail ActivePayment::InvalidGatewayResponseError
  end
end

Private Instance Methods

create_transactions(ip_address) click to toggle source
# File lib/active_payment/gateway.rb, line 78
def create_transactions(ip_address)
  fail 'You must called setup_purchase before creating a transaction' unless @gateway.sales

  @gateway.sales.each do |sale|
    @transactions << ActivePayment::Transaction.create({
      currency: sale.payable.currency,
      gateway: @gateway.class.to_s,
      amount: sale.amount_in_cents,
      ip_address: ip_address,
      payee_id: sale.payee.id,
      payer_id: sale.payer.id,
      payable_id: sale.payable.id,
      payable_type: sale.payable.class.to_s,
      reference_number: sale.payable.reference_number,
      external_id: @purchase_token,
      metadata: { description: sale.payable.description }
    })
  end
end
transactions_cancel(transactions) click to toggle source
# File lib/active_payment/gateway.rb, line 119
def transactions_cancel(transactions)
  transactions.each do |transaction|
    transaction.canceled!
  end
end
transactions_error(transactions) click to toggle source
# File lib/active_payment/gateway.rb, line 113
def transactions_error(transactions)
  transactions.each do |transaction|
    transaction.error!
  end
end
transactions_success(transactions) click to toggle source
# File lib/active_payment/gateway.rb, line 106
def transactions_success(transactions)
  transactions.each do |transaction|
    transaction.paid_at = DateTime.now
    transaction.completed!
  end
end
verify_ip_address(transactions, remote_ip) click to toggle source
# File lib/active_payment/gateway.rb, line 98
def verify_ip_address(transactions, remote_ip)
  if ActivePayment.configuration.ip_security
    transactions.each do |transaction|
      fail ActivePayment::SecurityError unless transaction.ip_address == remote_ip
    end
  end
end