class OffsitePayments::Integrations::SagePayForm::Helper
Public Instance Methods
form_fields()
click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 123 def form_fields 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" 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) result = { 'VPSProtocol' => '3.00', 'TxType' => 'PAYMENT', 'Vendor' => @fields['Vendor'], 'Crypt' => @crypt } result['ReferrerID'] = referrer_id if referrer_id result end
map_billing_address_to_shipping_address()
click to toggle source
# File lib/offsite_payments/integrations/sage_pay_form.rb, line 117 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 108 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 153 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 => e if e.message == 'key length too short' 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 165 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