require 'net/http'
require 'net/https'
require 'active_merchant/billing/response'
module ActiveMerchant #:nodoc:
module Billing #:nodoc:
# The Gateway class is the base class for all ActiveMerchant gateway
# implementations. The list of gateway functions that concrete
# gateway classes can and should implement include the following:
#
# === Core operations supported by most gateways
# * purchase(money, creditcard, options = {})
# * authorize(money, creditcard, options = {})
# * capture(money, authorization, options = {})
# * void(identification, options = {})
# * credit(money, identification, options = {})
class Gateway
include PostsData
include RequiresParameters
# The format of the amounts used by the gateway
# :dollars => '12.50'
# :cents => '1250'
class_inheritable_accessor :money_format
self.money_format = :dollars
# Return the matching gateway for the provider
# * bogus: BogusGateway - Does nothing ( for testing)
# * moneris: MonerisGateway
# * authorize_net: AuthorizeNetGateway
# * trust_commerce: TrustCommerceGateway
#
# ActiveMerchant::Base.gateway('moneris').new
def self.gateway(name)
ActiveMerchant::Billing.const_get("#{name.to_s.downcase}_gateway".camelize)
end
# Does this gateway support credit cards of the passed type?
def self.supports?(type)
supported_cardtypes.include?(type.intern)
end
# Get a list of supported credit card types for this gateway
def self.supported_cardtypes
[]
end
attr_reader :options
# Initialize a new gateway
#
# See the documentation for the gateway you will be using to make sure there
# are no other required options
def initialize(options = {})
@ssl_strict = options[:ssl_strict] || false
end
# Are we running in test mode?
def test?
Base.gateway_mode == :test
end
private
def name
self.class.name.scan(/\:\:(\w+)Gateway/).flatten.first
end
def test_result_from_cc_number(number)
return false unless test?
case number.to_s
when '1', 'success'
Response.new(true, 'Successful test mode response', {:receiptid => '#0001'}, :test => true, :authorization => '5555')
when '2', 'failure'
Response.new(false, 'Failed test mode response', {:receiptid => '#0001'}, :test => true)
when '3', 'error'
raise Error, 'big bad exception'
else
false
end
end
# Return a string with the amount in the appropriate format
def amount(money)
return nil if money.nil?
cents = money.respond_to?(:cents) ? money.cents : money
if money.is_a?(String) or cents.to_i < 0
raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
end
case self.money_format
when :cents
cents.to_s
else
sprintf("%.2f", cents.to_f/100)
end
end
end
end
end