class OffsitePayments::Integrations::SagePayForm::Helper

Attributes

identifier[R]

Public Class Methods

new(order, account, options={}) click to toggle source
Calls superclass method
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 74
def initialize(order, account, options={})
  @shipping_address_set = nil
  super
  @identifier = rand(0..99999).to_s.rjust(5, '0')
  add_field 'VendorTxCode', "#{order}-#{@identifier}"
end

Public Instance Methods

form_fields() click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 130
def form_fields
  fields.delete('locale')

  map_billing_address_to_shipping_address unless @shipping_address_set

  fields['DeliveryFirstnames'] ||= fields['BillingFirstnames']
  fields['DeliverySurname']    ||= fields['BillingSurname']

  fields['FailureURL'] ||= fields['SuccessURL']

  fields['BillingPostCode'] ||= "0000"
  fields['DeliveryPostCode'] ||= "0000"

  fields['ReferrerID'] = referrer_id if referrer_id

  crypt_skip = ['Vendor', 'EncryptKey', 'SendEmail']
  crypt_skip << 'BillingState'  unless fields['BillingCountry']  == 'US'
  crypt_skip << 'DeliveryState' unless fields['DeliveryCountry'] == 'US'
  crypt_skip << 'CustomerEMail' unless fields['SendEmail']
  key = fields['EncryptKey']
  @crypt ||= create_crypt_field(fields.except(*crypt_skip), key)

  {
    'VPSProtocol' => '3.00',
    'TxType' => 'PAYMENT',
    'Vendor' => @fields['Vendor'],
    'Crypt'  => @crypt
  }
end
map_billing_address_to_shipping_address() click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 124
def map_billing_address_to_shipping_address
  %w(City Address1 Address2 State PostCode Country).each do |field|
    fields["Delivery#{field}"] = fields["Billing#{field}"]
  end
end
shipping_address(params = {}) click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 115
def shipping_address(params = {})
  @shipping_address_set = true unless params.empty?

  params.each do |k, v|
    field = mappings[:shipping_address][k]
    add_field(field, v) unless field.nil?
  end
end

Private Instance Methods

create_crypt_field(fields, key) click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 162
def create_crypt_field(fields, key)
  parts = fields.map { |k, v| "#{k}=#{sanitize(k, v)}" unless v.nil? }.compact.shuffle
  parts.unshift(sage_encrypt_salt(key.length, key.length * 2))
  sage_encrypt(parts.join('&'), key)
rescue OpenSSL::Cipher::CipherError, ArgumentError => e
  if e.message == 'key length too short' || e.message == 'key must be 16 bytes'
    raise ActionViewHelperError, 'Invalid encryption key.'
  else
    raise
  end
end
sanitize(key, value) click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 174
def sanitize(key, value)
  reject = exact = nil

  case key
  when /URL$/
    # allow all
  when 'VendorTxCode'
    reject = /[^A-Za-z0-9{}._-]+/
  when /[Nn]ames?$/
    reject = %r{[^[:alpha:] /\\.'-]+}
  when /(?:Address[12]|City)$/
    reject = %r{[^[:alnum:] +'/\\:,.\n()-]+}
  when /PostCode$/
    reject = /[^A-Za-z0-9 -]+/
  when /Phone$/
    reject = /[^0-9A-Za-z+ ()-]+/
  when 'Currency'
    exact = /^[A-Z]{3}$/
  when /State$/
    exact = /^[A-Z]{2}$/
  when 'Description'
    value = value[0...100]
  else
    reject = /&+/
  end

  if exact
    raise ArgumentError, "Invalid value for #{key}: #{value.inspect}" unless value =~ exact
    value
  elsif reject
    value.gsub(reject, ' ')
  else
    value
  end
end