class OffsitePayments::Integrations::AuthorizeNetSim::Helper

def add_custom_field(name, value)

this function only uses keeps the second value you called it with.
(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)

You can use the :line_title for the product name and then :name for description, if desired
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 = {})

isn't displayed.
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

displayed.
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)

'provo, :state => 'UT'}...
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)

after successful, from Authorize.Net.
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 = {})

response_url to actually work.
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)

useful.
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)

must include :transaction_key and :order_timestamp
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)

added.
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

purchaser.
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