class OffsitePayments::Integrations::PayULatam::Helper

Public Class Methods

new(order, merchant_id, options = {}) click to toggle source

These credentials are mandatory:

credential2: api_login credential3: api_key credential4: account_id

Calls superclass method
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 78
def initialize(order, merchant_id, options = {})
  super
  @merchant_id = merchant_id
  @options     = options

  add_field 'language', 'en'
end

Public Instance Methods

account_id() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 94
def account_id
  @options[:credential4]
end
api_key() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 90
def api_key
  @options[:credential3]
end
api_login() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 86
def api_login
  @options[:credential2]
end
form_fields() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 106
def form_fields
  cash_request = send_request(PayULatam.service_url, build_cash_request)

  raise ActionViewHelperError, "Invalid response: #{cash_request}" unless success_cash_request_response?(cash_request)

  {
      :order_id        => cash_request['transactionResponse']['orderId'],
      :transaction_id  => cash_request['transactionResponse']['transactionId'],
      :url             => cash_request['transactionResponse']['extraParameters']['URL_PAYMENT_RECEIPT_HTML'],
      :expiration_date => cash_request['transactionResponse']['extraParameters']['EXPIRATION_DATE'],
  }
end
form_method() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 102
def form_method
  'GET'
end
merchant_id() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 98
def merchant_id
  @merchant_id
end
order_status(order_id) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 119
def order_status(order_id)
  request_status = send_request(PayULatam.queries_url, build_query_request(:orderId, order_id))

  raise ActionViewHelperError, "Invalid response: #{request_status}" unless success_response?(request_status)
  # Not found?
  return nil if request_status['result'].nil? or request_status['result']['payload'].nil?

  {
      :order_id       => request_status['result']['payload']['id'],
      :status         => request_status['result']['payload']['status'],
      :reference_code => request_status['result']['payload']['referenceCode'],
      :description    => request_status['result']['payload']['description']
  }
end
orders_statuses(reference_code) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 148
def orders_statuses(reference_code)
  request_status = send_request(PayULatam.queries_url, build_query_request(:referenceCode, reference_code))

  raise ActionViewHelperError, "Invalid response: #{request_status}" unless success_response?(request_status)
  # Not found?
  return nil if request_status['result'].nil?

  request_status['result']['payload']
end
transaction_status(transaction_id) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 134
def transaction_status(transaction_id)
  request_status = send_request(PayULatam.queries_url, build_query_request(:transactionId, transaction_id))

  raise ActionViewHelperError, "Invalid response: #{request_status}" unless success_response?(request_status)
  # Not found?
  return nil if request_status['result'].nil? or request_status['result']['payload'].nil?

  {
      :status            => request_status['result']['payload']['state'],
      :traceability_code => request_status['result']['payload']['trazabilityCode'],
      :authorization     => request_status['result']['payload']['authorizationCode']
  }
end

Private Instance Methods

build_base_request(command) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 221
def build_base_request(command)
  request            = {}
  request[:language] = @fields['language']
  request[:command]  = command
  # Should always be false, even in test mode
  request[:test]     = 'false'
  request[:merchant] = {:apiLogin => api_login, :apiKey => api_key}
  request
end
build_cash_request() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 178
def build_cash_request
  shipping_address           = {}
  shipping_address[:street1] = @fields['address1'] unless @fields['address1'].nil?
  shipping_address[:city]    = @fields['city'] unless @fields['city'].nil?
  shipping_address[:state]   = @fields['state'] unless @fields['state'].nil?
  shipping_address[:country] = @fields['country'] unless @fields['country'].nil?
  shipping_address[:phone]   = @fields['phone'] unless @fields['phone'].nil?

  buyer                   = {}
  buyer[:fullName]        = @fields['name'] unless @fields['name'].nil?
  buyer[:emailAddress]    = @fields['email'] unless @fields['email'].nil?
  buyer[:dniNumber]       = @fields['dniNumber'] unless @fields['dniNumber'].nil?
  buyer[:shippingAddress] = shipping_address

  order                    = {}
  order[:accountId]        = account_id
  order[:referenceCode]    = @fields['order']
  order[:description]      = @fields['description']
  order[:language]         = @fields['language']
  order[:signature]        = signature
  order[:shippingAddress]  = {:country => @fields['country']} unless @fields['country'].nil?
  order[:buyer]            = buyer
  order[:additionalValues] = {:TX_VALUE => {:value => @fields['amount'].to_i, :currency => @fields['currency']}}

  transaction                  = {}
  transaction[:order]          = order
  transaction[:type]           = 'AUTHORIZATION_AND_CAPTURE'
  transaction[:paymentMethod]  = @fields['paymentMethod']
  transaction[:expirationDate] = @fields['expirationDate'] unless @fields['expirationDate'].nil?

  request               = build_base_request('SUBMIT_TRANSACTION')
  request[:transaction] = transaction

  request.to_json
end
build_query_request(key, value) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 214
def build_query_request(key, value)
  request           = build_base_request(QUERY_COMMANDS[key])
  request[:details] = {key => value}

  request.to_json
end
send_request(url, request_body) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 160
def send_request(url, request_body)
  uri              = URI.parse(url)
  http             = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl     = true
  # PayULatam's test server has an improperly installed cert
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE if test?

  request              = Net::HTTP::Post.new(uri.request_uri)
  request['Accept']    = 'application/json'
  request.content_type = 'application/json'
  request.body         = request_body

  response = http.request(request)
  JSON.parse(response.body)
rescue JSON::ParserError
  response.body
end
signature() click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 231
def signature
  raw = "#{api_key}~#{merchant_id}~#{@fields['order']}~#{@fields['amount']}~#{@fields['currency']}"
  Digest::MD5.hexdigest(raw)
end
success_cash_request_response?(cash_request_response) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 236
def success_cash_request_response?(cash_request_response)
  success_response?(cash_request_response) and cash_request_response['transactionResponse'].is_a?(Hash) and cash_request_response['transactionResponse']['errorCode'].nil?
end
success_response?(response) click to toggle source
# File lib/offsite_payments/integrations/pay_u_latam.rb, line 240
def success_response?(response)
  response.is_a?(Hash) and response['code'] == 'SUCCESS' and response['error'].nil?
end