Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@cleverlemming
Created December 10, 2011 02:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cleverlemming/1454271 to your computer and use it in GitHub Desktop.
Save cleverlemming/1454271 to your computer and use it in GitHub Desktop.
auth net gateway processor
class Gateway::AuthorizeNetCim < Gateway
preference :login, :string
preference :password, :string
preference :test_mode, :boolean, :default => false
preference :validate_on_profile_create, :boolean, :default => false
attr_accessor :spree_invoice_number
ActiveMerchant::Billing::Response.class_eval do
attr_writer :authorization
end
def provider_class
self.class
end
def options
# add :test key in the options hash, as that is what the ActiveMerchant::Billing::AuthorizeNetGateway expects
if self.prefers? :test_mode
self.class.default_preferences[:test] = true
else
self.class.default_preferences.delete(:test)
end
super
end
def authorize(amount, creditcard, gateway_options)
create_transaction(amount, creditcard, :auth_only )
#, :order => {:invoice_number => @spree_invoice_number}
end
def purchase(amount, creditcard, gateway_options)
create_transaction(amount, creditcard, :auth_capture )
end
def capture(authorization, creditcard, gateway_options)
create_transaction((authorization.amount * 100).round, creditcard, :prior_auth_capture, :trans_id => authorization.response_code)
end
def credit(amount, creditcard, response_code, gateway_options)
create_transaction(amount, creditcard, :refund, :trans_id => response_code)
end
def void(response_code, creditcard, gateway_options)
create_transaction(nil, creditcard, :void, :trans_id => response_code)
end
def payment_profiles_supported?
true
end
# Create a new CIM customer profile ready to accept a payment
# Create a new CIM customer address profile and save address_id in creditcards table
def create_profile(payment)
@spree_invoice_number = payment.order.number
if payment.source.gateway_customer_profile_id.nil?
profile_hash = create_customer_profile(payment)
logger.debug("***********************************************************\n" )
logger.debug("create_profile @spree_invoice number: #{@spree_invoice_number}\n" )
logger.debug("***********************************************************\n" )
profile_hash[:customer_address_id] = create_customer_shipping_profile(profile_hash[:customer_profile_id], payment)
payment.source.update_attributes(:gateway_customer_profile_id => profile_hash[:customer_profile_id], :gateway_payment_profile_id => profile_hash[:customer_payment_profile_id], :address_id => profile_hash[:customer_address_id], :invoice_number => @spree_invoice_number
)
end
#successfully prints variable to log:
can_access_instance_variable_here
end
# simpler form
def create_profile_from_card(card)
if card.gateway_customer_profile_id.nil?
profile_hash = create_customer_profile(card)
card.update_attributes(:gateway_customer_profile_id => profile_hash[:customer_profile_id])
end
end
def can_access_instance_variable_here
logger.debug("***********************************************************\n" )
logger.debug("can_access_instance_variable_here @spree_invoice number: #{@spree_invoice_number}\n" )
logger.debug("***********************************************************\n" )
end
private
# Create a transaction on a creditcard
# Set up a CIM profile for the card if one doesn't exist
# Valid transaction_types are :auth_only, :capture_only and :auth_capture
def create_transaction(amount, creditcard, transaction_type, options = {})
#create_profile(creditcard, creditcard.gateway_options)
creditcard.save
if amount
amount = "%.2f" % (amount/100.0) # This gateway requires formated decimal, not cents
end
transaction_options = {
:type => transaction_type,
:amount => amount,
:customer_profile_id => creditcard.gateway_customer_profile_id,
:customer_payment_profile_id => creditcard.gateway_payment_profile_id,
:order => {:invoice_number => @spree_invoice_number }
}.update(options)
#spree_invoice_number is nil here:
logger.debug("***********************************************************\n" )
logger.debug("inside create_transaction: #{transaction_options.inspect}\n" )
logger.debug("***********************************************************\n" )
t = cim_gateway.create_customer_profile_transaction(:transaction => transaction_options)
logger.debug("\nAuthorize Net CIM Transaction")
logger.debug(" transaction_options: #{transaction_options.inspect}")
#spree_invoice_number is nil here also
logger.debug(" response: #{t.inspect}\n")
#instance variable is null when called from this method:
can_access_instance_variable_here
t
end
# Create a new CIM customer profile ready to accept a payment
# now creates shipping address profile
def create_customer_profile(payment)
options = options_for_create_customer_profile(payment)
response = cim_gateway.create_customer_profile(options)
if response.success?
customer_profile_hash =
{ :customer_profile_id => response.params["customer_profile_id"],
:customer_payment_profile_id => response.params["customer_payment_profile_id_list"].values.first
}
return customer_profile_hash
else
payment.gateway_error(response) if payment.respond_to? :gateway_error
payment.source.gateway_error(response)
end
end
def create_customer_shipping_profile(profile_id, payment)
options = options_for_create_customer_shipping_address(payment.order.shipment, profile_id )
logger.debug("\n building shipping address request")
response = cim_gateway.create_customer_shipping_address(options)
if response.success?
logger.debug("\n shipping address created on CIM gatway")
address_id = response.params["customer_address_id"]
return address_id
else
payment.gateway_error(response) if payment.respond_to? :gateway_error
payment.source.gateway_error(response)
end
end
def options_for_create_customer_profile(payment)
if payment.is_a? Creditcard
info = { :bill_to => generate_address_hash(payment.address), :payment => { :credit_card => payment }}
else
info = { :bill_to => generate_address_hash(payment.order.bill_address),
:payment => { :credit_card => payment.source } }
end
validation_mode = preferred_validate_on_profile_create ? preferred_server.to_sym : :none
{ :profile => { :merchant_customer_id => "#{Time.now.to_f}",
#:ship_to_list => generate_address_hash(creditcard.checkout.ship_address),
:payment_profiles => info },
:validation_mode => validation_mode }
end
def options_for_create_customer_shipping_address(shipment, customer_profile_id )
info = { :address => generate_address_hash(shipment.address), :customer_profile_id => customer_profile_id }
end
# As in PaymentGateway but with separate name fields
def generate_address_hash(address)
return {} if address.nil?
{:first_name => address.firstname, :last_name => address.lastname, :address1 => address.address1, :address2 => address.address2, :city => address.city,
:state => address.state_text, :zip => address.zipcode, :country => address.country.iso, :phone => address.phone}
end
def cim_gateway
ActiveMerchant::Billing::Base.gateway_mode = preferred_server.to_sym
gateway_options = options
ActiveMerchant::Billing::AuthorizeNetCimGateway.new(gateway_options)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment