class OffsitePayments::Integrations::DirecPay::Helper

Constants

COUNTRY
CURRENCY
EDIT_ALLOWED
ENCODED_PARAMS
OPERATING_MODE
OTHER_DETAILS
PHONE_CODES

Public Class Methods

new(order, account, options = {}) click to toggle source
Calls superclass method
# File lib/offsite_payments/integrations/direc_pay.rb, line 82
def initialize(order, account, options = {})
  super
  collaborator = OffsitePayments.mode == :test || options[:test] ? 'TOML' : 'DirecPay'
  add_field(mappings[:collaborator], collaborator)
  add_field(mappings[:country], 'IND')
  add_field(mappings[:operating_mode], OPERATING_MODE)
  add_field(mappings[:other_details], OTHER_DETAILS)
  add_field(mappings[:edit_allowed], EDIT_ALLOWED)
end

Public Instance Methods

amount=(money) click to toggle source

Need to format the amount to have 2 decimal places

# File lib/offsite_payments/integrations/direc_pay.rb, line 99
def amount=(money)
  cents = money.respond_to?(:cents) ? money.cents : money
  raise ArgumentError, "amount must be a Money object or an integer" if money.is_a?(String)
  raise ActionViewHelperError, "amount must be greater than $0.00" if cents.to_i <= 0

  add_field(mappings[:amount], sprintf("%.2f", cents.to_f/100))
end
billing_address(params = {}) click to toggle source
Calls superclass method
# File lib/offsite_payments/integrations/direc_pay.rb, line 111
def billing_address(params = {})
  super(update_address(:billing_address, params))
end
customer(params = {}) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 93
def customer(params = {})
  add_field(mappings[:customer][:name], full_name(params))
  add_field(mappings[:customer][:email], params[:email])
end
form_fields() click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 115
def form_fields
  add_failure_url
  add_request_parameters

  unencoded_parameters
end
shipping_address(params = {}) click to toggle source
Calls superclass method
# File lib/offsite_payments/integrations/direc_pay.rb, line 107
def shipping_address(params = {})
  super(update_address(:shipping_address, params))
end

Private Instance Methods

add_failure_url() click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 140
def add_failure_url
  if fields[mappings[:failure_url]].nil?
    add_field(mappings[:failure_url], fields[mappings[:return_url]])
  end
end
add_land_line_phone_for(address_type, params) click to toggle source

Split a single phone number into the country code, area code and local number as best as possible

# File lib/offsite_payments/integrations/direc_pay.rb, line 164
def add_land_line_phone_for(address_type, params)
  address_field = address_type == :billing_address ? 'custPhoneNo' : 'deliveryPhNo'

  if params.has_key?(:phone2)
    phone = normalize_phone_number(params[:phone2])
    phone_country_code, phone_area_code, phone_number = nil

    if params[:country] == 'IN' && phone =~ /(91)? *(\d{3}) *(\d{4,})$/
      phone_country_code, phone_area_code, phone_number = $1, $2, $3
    else
      numbers = phone.split(' ')
      case numbers.size
      when 3
        phone_country_code, phone_area_code, phone_number = numbers
      when 2
        phone_area_code, phone_number = numbers
      else
        phone =~ /(\d{3})(\d+)$/
        phone_area_code, phone_number = $1, $2
      end
    end

    add_field("#{address_field}1", phone_country_code || phone_code_for_country(params[:country]) || '91')
    add_field("#{address_field}2", phone_area_code)
    add_field("#{address_field}3", phone_number)
  end
end
add_request_parameters() click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 124
def add_request_parameters
  params = ENCODED_PARAMS.map{ |param| fields[mappings[param]] }
  encoded = encode_value(params.join('|'))

  add_field('requestparameter', encoded)
end
decode_value(value) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 207
def decode_value(value)
  decoded = Base64.decode64(value)
  string_to_decode = decoded[0, 1] + decoded[2, decoded.length]
  Base64.decode64(string_to_decode)
end
encode_value(value) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 201
def encode_value(value)
  encoded = Base64.strict_encode64(value)
  string_to_encode = encoded[0, 1] + "T" + encoded[1, encoded.length]
  Base64.strict_encode64(string_to_encode)
end
full_name(params) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 217
def full_name(params)
  return if params[:name].blank? && params[:first_name].blank? && params[:last_name].blank?

  params[:name] || "#{params[:first_name]} #{params[:last_name]}"
end
normalize_phone_number(phone) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 192
def normalize_phone_number(phone)
  phone.gsub(/[^\d ]+/, '') if phone
end
phone_code_for_country(country) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 213
def phone_code_for_country(country)
  PHONE_CODES[country]
end
remove_special_characters(string) click to toggle source

Special characters are NOT allowed while posting transaction parameters on DirecPay system

# File lib/offsite_payments/integrations/direc_pay.rb, line 197
def remove_special_characters(string)
  string.gsub(/[~"'&#%]/, '-')
end
unencoded_parameters() click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 131
def unencoded_parameters
  params = fields.dup
  # remove all encoded params from exported fields
  ENCODED_PARAMS.each{ |param| params.delete(mappings[param]) }
  # remove all special characters from each field value
  params = params.collect{|name, value| [name, remove_special_characters(value)] }
  Hash[params]
end
update_address(address_type, params) click to toggle source
# File lib/offsite_payments/integrations/direc_pay.rb, line 146
def update_address(address_type, params)
  params = params.dup
  address = params[:address1]
  address = "#{address} #{params[:address2]}" if params[:address2].present?
  address = "#{params[:company]} #{address}" if params[:company].present?
  params[:address1] = address

  params[:phone] = normalize_phone_number(params[:phone])
  add_land_line_phone_for(address_type, params)

  if address_type == :shipping_address
    shipping_name = full_name(params) || fields[mappings[:customer][:name]]
    add_field(mappings[:shipping_address][:name], shipping_name)
  end
  params
end