class OffsitePayments::Integrations::PagSeguro::Helper

Public Class Methods

new(order_id, account, options) click to toggle source
Calls superclass method
# File lib/offsite_payments/integrations/pag_seguro.rb, line 49
def initialize(order_id, account, options)
  super
  @account = account

  add_field('itemAmount1', sprintf("%0.02f", options[:amount]))
  add_field('itemId1', '1')
  add_field('itemQuantity1', '1')
  add_field('shippingType', '3')
  add_field('currency', 'BRL')
end

Public Instance Methods

area_code_and_number(phone) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 118
def area_code_and_number(phone)
  return if phone.nil?
  phone.gsub!(/[^\d]/, '')

  ddd    = phone.slice(0..1)
  number = phone.slice(2..12)

  [ddd, number]
end
check_for_errors(response, xml) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 128
def check_for_errors(response, xml)
  return if response.code == "200"

  case response.code
  when "400"
    raise ActionViewHelperError, humanize_errors(xml)
  when "401"
    raise ActionViewHelperError, "Token do PagSeguro inválido."
  else
    raise ActiveUtils::ResponseError, response
  end
end
customer(params = {}) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 87
def customer(params = {})
  full_name = remove_excessive_whitespace("#{params[:first_name]} #{params[:last_name]}")

  if phone = area_code_and_number(params[:phone])
    add_field("senderAreaCode", phone[0])
    add_field("senderPhone", phone[1])
  end

  add_field("senderEmail", params[:email])
  add_field('senderName', full_name)
end
extract_token(xml) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 141
def extract_token(xml)
  xml.css("code").text
end
fetch_token() click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 99
def fetch_token
  uri = URI.parse(PagSeguro.invoicing_url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true

  request = Net::HTTP::Post.new(uri.request_uri)
  request.content_type = "application/x-www-form-urlencoded"
  request.set_form_data @fields

  response = http.request(request)
  xml = Nokogiri::XML.parse(response.body)

  check_for_errors(response, xml)

  extract_token(xml)
rescue Timeout::Error, Errno::ECONNRESET, Errno::ETIMEDOUT
  raise ActionViewHelperError, "Erro ao conectar-se ao PagSeguro. Por favor, tente novamente."
end
form_fields() click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 77
def form_fields
  invoice_id = fetch_token

  {"code" => invoice_id}
end
humanize_errors(xml) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 145
def humanize_errors(xml)
  # reference: https://pagseguro.uol.com.br/v2/guia-de-integracao/codigos-de-erro.html

  xml.css("errors").children.map do |error|
    case error.css('code').text
    when "11013"
      "Código de área inválido"
    when "11014"
      "Número de telefone inválido. Formato esperado: (DD) XXXX-XXXX"
    when "11017"
      "Código postal (CEP) inválido."
    else
      error.css('message').text
    end
  end.join(", ")
end
remove_excessive_whitespace(text) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 162
def remove_excessive_whitespace(text)
  text.gsub(/\s{2,}/, ' ').strip
end
shipping(value) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 83
def shipping(value)
  add_field("shippingCost", sprintf("%0.02f", value))
end
shipping_address(params = {}) click to toggle source
# File lib/offsite_payments/integrations/pag_seguro.rb, line 69
def shipping_address(params = {})
  add_field('shippingAddressCity',       params[:city].slice(0, 60))     if params[:city]
  add_field('shippingAddressStreet',     params[:address1].slice(0, 80)) if params[:address1]
  add_field('shippingAddressComplement', params[:address2].slice(0, 40)) if params[:address2]
  add_field('shippingAddressState',      params[:state])
  add_field('shippingAddressPostalCode', params[:zip].delete("^0-9").slice(0, 8)) if params[:zip]
end