require File.dirname(__FILE__) + '/viaklix' module ActiveMerchant #:nodoc: module Billing #:nodoc: # = Elavon Virtual Merchant Gateway # # == Example use: # # gateway = ActiveMerchant::Billing::ElavonGateway.new( # :login => "my_virtual_merchant_id", # :password => "my_virtual_merchant_pin", # :user => "my_virtual_merchant_user_id" # optional # ) # # # set up credit card obj as in main ActiveMerchant example # creditcard = ActiveMerchant::Billing::CreditCard.new( # :type => 'visa', # :number => '41111111111111111', # :month => 10, # :year => 2011, # :first_name => 'Bob', # :last_name => 'Bobsen' # ) # # # run request # response = gateway.purchase(1000, creditcard) # authorize and capture 10 USD # # puts response.success? # Check whether the transaction was successful # puts response.message # Retrieve the message returned by Elavon # puts response.authorization # Retrieve the unique transaction ID returned by Elavon # class ElavonGateway < ViaklixGateway self.test_url = 'https://demo.myvirtualmerchant.com/VirtualMerchantDemo/process.do' self.live_url = 'https://www.myvirtualmerchant.com/VirtualMerchant/process.do' self.display_name = 'Elavon MyVirtualMerchant' self.supported_countries = ['US', 'CA'] self.supported_cardtypes = [:visa, :master, :american_express, :discover] self.homepage_url = 'http://www.elavon.com/' self.delimiter = "\n" self.actions = { :purchase => 'CCSALE', :credit => 'CCCREDIT', :authorize => 'CCAUTHONLY', :capture => 'CCFORCE' } # Authorize a credit card for a given amount. # # ==== Parameters # * money - The amount to be authorized as an Integer value in cents. # * credit_card - The CreditCard details for the transaction. # * options # * :billing_address - The billing address for the cardholder. def authorize(money, creditcard, options = {}) form = {} add_invoice(form, options) add_creditcard(form, creditcard) add_address(form, options) add_customer_data(form, options) add_test_mode(form, options) commit(:authorize, money, form) end # Capture authorized funds from a credit card. # # ==== Parameters # * money - The amount to be captured as an Integer value in cents. # * authorization - The approval code returned from the initial authorization. # * options # * :credit_card - The CreditCard details from the initial transaction (required). def capture(money, authorization, options = {}) requires!(options, :credit_card) form = {} add_reference(form, authorization) add_invoice(form, options) add_creditcard(form, options[:credit_card]) add_customer_data(form, options) add_test_mode(form, options) commit(:capture, money, form) end private def add_reference(form, authorization) form[:approval_code] = authorization end def authorization_from(response) response['approval_code'] end def add_verification_value(form, creditcard) form[:cvv2cvc2] = creditcard.verification_value form[:cvv2cvc2_indicator] = '1' end def add_address(form,options) billing_address = options[:billing_address] || options[:address] if billing_address form[:avs_address] = billing_address[:address1].to_s.slice(0, 30) form[:address2] = billing_address[:address2].to_s.slice(0, 30) form[:avs_zip] = billing_address[:zip].to_s.slice(0, 10) form[:city] = billing_address[:city].to_s.slice(0, 30) form[:state] = billing_address[:state].to_s.slice(0, 10) form[:company] = billing_address[:company].to_s.slice(0, 50) form[:phone] = billing_address[:phone].to_s.slice(0, 20) form[:country] = billing_address[:country].to_s.slice(0, 50) end if shipping_address = options[:shipping_address] first_name, last_name = parse_first_and_last_name(shipping_address[:name]) form[:ship_to_first_name] = first_name.to_s.slice(0, 20) form[:ship_to_last_name] = last_name.to_s.slice(0, 30) form[:ship_to_address1] = shipping_address[:address1].to_s.slice(0, 30) form[:ship_to_address2] = shipping_address[:address2].to_s.slice(0, 30) form[:ship_to_city] = shipping_address[:city].to_s.slice(0, 30) form[:ship_to_state] = shipping_address[:state].to_s.slice(0, 10) form[:ship_to_company] = shipping_address[:company].to_s.slice(0, 50) form[:ship_to_country] = shipping_address[:country].to_s.slice(0, 50) form[:ship_to_zip] = shipping_address[:zip].to_s.slice(0, 10) end end def message_from(response) success?(response) ? response['result_message'] : response['errorMessage'] end def success?(response) !response.has_key?('errorMessage') end end end end