class OffsitePayments::Integrations::AuthorizeNetSim::Helper
def add_custom_field(name, value)
(callback) to you note that if you call it twice with the same name,
are all passed back to you verbatim when it does its relay
Adds a custom field which you submit to Authorize.Net. These fields
def add_custom_field(name, value) add_field name, value end
def add_line_item(options)
Cannot have a negative price, nor a name with "'s or $
'Item 1' or what not, the default coded here.
optional :line_title => 'special name' if you don't want it to say
Note you can't pass in a negative unit price, and you can add an
Call line add_line_item {:name => 'orange', :unit_price => 30, :tax_value => 'Y', :quantity => 3, }
Add a line item to Authorize.Net.
def add_line_item(options) raise 'needs name' unless options[:name] if @line_item_count == 30 # Add a note that we are not showing at least one -- AN doesn't # display more than 30 or so. description_of_last = @raw_html_fields[-1][1] # Pull off the second to last section, which is the description. description_of_last =~ />([^>]*)<\|>[YN]$/ # Create a new description, which can't be too big, so truncate here. @raw_html_fields[-1][1] = description_of_last.gsub($1, $1[0..200] + ' + more unshown items after this one.') end name = options[:name] quantity = options[:quantity] || 1 line_title = options[:line_title] || ('Item ' + (@line_item_count + 1).to_s) # left most field unit_price = options[:unit_price] || 0 unit_price = unit_price.to_f.round(2) tax_value = options[:tax_value] || 'N' # Sanitization, in case they include a reserved word here, following # their guidelines; unfortunately, they require 'raw' fields here, # not CGI escaped, using their own delimiters. # # Authorize.net ignores the second field (sanitized_short_name) raise 'illegal char for line item <|>' if name.include? '<|>' raise 'illegal char for line item "' if name.include? '"' raise 'cannot pass in dollar sign' if unit_price.to_s.include? '$' raise 'must have positive or 0 unit price' if unit_price.to_f < 0 # Using CGI::escape causes the output to be formated incorrectly in # the HTML presented to the end-user's browser (e.g., spaces turn # into +'s). sanitized_short_name = name[0..30] name = name[0..255] add_raw_html_field "x_line_item", "#{line_title}<|>#{sanitized_short_name}<|>#{name}<|>#{quantity}<|>#{unit_price}<|>#{tax_value}" @line_item_count += 1 end
def add_shipping_as_line_item(extra_options = {})
Displays shipping as a line item, so they can see it. Otherwise it
def add_shipping_as_line_item(extra_options = {}) raise 'must set shipping/freight before calling this' unless @fields['x_freight'] add_line_item extra_options.merge({:name => 'Shipping and Handling Cost', :quantity => 1, :unit_price => @fields['x_freight'], :line_title => 'Shipping'}) end
def add_tax_as_line_item
Displays tax as a line item, so they can see it. Otherwise it isn't
def add_tax_as_line_item raise unless @fields['x_tax'] add_line_item :name => 'Total Tax', :quantity => 1, :unit_price => @fields['x_tax'], :tax => 0, :line_title => 'Tax' end
def billing_address(options)
Set the billing address. Call like service.billing_address {:city =>
def billing_address(options) for setting in [:city, :state, :zip, :country, :po_num] do add_field 'x_' + setting.to_s, options[setting] end raise 'must use address1 and address2' if options[:address] add_field 'x_address', (options[:address1].to_s + ' ' + options[:address2].to_s).strip end
def email_merchant_from_authorizes_side(to_this_email)
If you call this it will e-mail to this address a copy of a receipt
def email_merchant_from_authorizes_side(to_this_email) add_field 'x_email_merchant', to_this_email end
def initialize(order, account, options = {})
Note that you should call #invoice and #setup_hash as well, for the
def initialize(order, account, options = {}) super raise 'missing parameter' unless order and account and options[:amount] raise 'error -- amount with no digits!' unless options[:amount].to_s =~ /\d/ add_field('x_type', 'AUTH_CAPTURE') # the only one we deal with, for now. Not refunds or anything else, currently. add_field 'x_show_form', 'PAYMENT_FORM' add_field 'x_relay_response', 'TRUE' add_field 'x_duplicate_window', '28800' # large default duplicate window. add_field 'x_currency_code', currency_code add_field 'x_version' , '3.1' # version from doc add_field 'x_amount', options[:amount].to_f.round(2) @line_item_count = 0 end
def invoice(number)
information later! They also pass back customer id, if that's
This one is necessary for the notify url to be able to parse its
def invoice(number) add_field 'x_invoice_num', number end
def setup_hash(options)
You MUST call this at some point for it to actually work. Options
def setup_hash(options) raise unless options[:transaction_key] raise unless options[:order_timestamp] amount = @fields['x_amount'] data = "#{@fields['x_login']}^#{@fields['x_fp_sequence']}^#{options[:order_timestamp].to_i}^#{amount}^#{@fields['x_currency_code']}" hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('md5'), options[:transaction_key], data) add_field 'x_fp_hash', hmac add_field 'x_fp_timestamp', options[:order_timestamp].to_i end
def ship_to_address(options)
Add ship_to_address in the same format as the normal address is
def ship_to_address(options) for setting in [:first_name, :last_name, :company, :city, :state, :zip, :country] do if options[setting] then add_field 'x_ship_to_' + setting.to_s, options[setting] end end raise 'must use :address1 and/or :address2' if options[:address] add_field 'x_ship_to_address', (options[:address1].to_s + ' ' + options[:address2].to_s).strip end
def yes_email_customer_from_authorizes_side
For this to work you must have also passed in an email for the
def yes_email_customer_from_authorizes_side add_field 'x_email_customer', 'TRUE' end