class ActiveMerchant::Billing::BorgunGateway

Constants

CURRENCY_CODES

Public Class Methods

new(options={}) click to toggle source
Calls superclass method ActiveMerchant::Billing::Gateway::new
# File lib/active_merchant/billing/gateways/borgun.rb, line 19
def initialize(options={})
  requires!(options, :processor, :merchant_id, :username, :password)
  super
end

Public Instance Methods

authorize(money, payment, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 32
def authorize(money, payment, options={})
  post = {}
  post[:TransType] = '5'
  add_invoice(post, money, options)
  add_payment_method(post, payment)
  commit('authonly', post)
end
capture(money, authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 40
def capture(money, authorization, options={})
  post = {}
  post[:TransType] = '1'
  add_invoice(post, money, options)
  add_reference(post, authorization)
  commit('capture', post)
end
purchase(money, payment, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 24
def purchase(money, payment, options={})
  post = {}
  post[:TransType] = '1'
  add_invoice(post, money, options)
  add_payment_method(post, payment)
  commit('sale', post)
end
refund(money, authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 48
def refund(money, authorization, options={})
  post = {}
  post[:TransType] = '3'
  add_invoice(post, money, options)
  add_reference(post, authorization)
  commit('refund', post)
end
scrub(transcript) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 71
def scrub(transcript)
  transcript.gsub(%r((<PAN>)[^&]*(</PAN>))i, '\1[FILTERED]\2').
    gsub(%r((<CVC2>)[^&]*(</CVC2>))i, '\1[FILTERED]\2').
    gsub(%r(((?:\r\n)?Authorization: Basic )[^\r\n]+(\r\n)?), '\1[FILTERED]\2')
end
supports_scrubbing() click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 67
def supports_scrubbing
  true
end
void(authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 56
def void(authorization, options={})
  post = {}
  # TransType, TrAmount, and currency must match original values from auth or purchase.
  _, _, _, _, _, transtype, tramount, currency = split_authorization(authorization)
  post[:TransType] = transtype
  options[:currency] = options[:currency] || CURRENCY_CODES.key(currency)
  add_invoice(post, tramount.to_i, options)
  add_reference(post, authorization)
  commit('void', post)
end

Private Instance Methods

add_invoice(post, money, options) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 84
def add_invoice(post, money, options)
  post[:TrAmount] = amount(money)
  post[:TrCurrency] = CURRENCY_CODES[options[:currency] || currency(money)]
  post[:TerminalID] = options[:terminal_id] || '1'
end
add_payment_method(post, payment_method) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 90
def add_payment_method(post, payment_method)
  post[:PAN] = payment_method.number
  post[:ExpDate] = format(payment_method.year, :two_digits) + format(payment_method.month, :two_digits)
  post[:CVC2] = payment_method.verification_value
  post[:DateAndTime] = Time.now.strftime('%y%m%d%H%M%S')
  post[:RRN] = 'AMRCNT' + six_random_digits
end
add_reference(post, authorization) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 98
def add_reference(post, authorization)
  dateandtime, _batch, transaction, rrn, authcode, _, _, _ = split_authorization(authorization)
  post[:DateAndTime] = dateandtime
  post[:Transaction] = transaction
  post[:RRN] = rrn
  post[:AuthCode] = authcode
end
authorization_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 159
def authorization_from(response)
  [
    response[:dateandtime],
    response[:batch],
    response[:transaction],
    response[:rrn],
    response[:authcode],
    response[:transtype],
    response[:tramount],
    response[:trcurrency]
  ].join('|')
end
build_request(action, post) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 183
def build_request(action, post)
  mode = action == 'void' ? 'cancel' : 'get'
  xml = Builder::XmlMarkup.new :indent => 18
  xml.instruct!(:xml, :version => '1.0', :encoding => 'utf-8')
  xml.tag!("#{mode}Authorization") do
    post.each do |field, value|
      xml.tag!(field, value)
    end
  end
  inner = CGI.escapeHTML(xml.target!)
  envelope(mode).sub(/{{ :body }}/, inner)
end
commit(action, post) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 128
def commit(action, post)
  post[:Version] = '1000'
  post[:Processor] = @options[:processor]
  post[:MerchantID] = @options[:merchant_id]

  request = build_request(action, post)
  raw = ssl_post(url(action), request, headers)
  pairs = parse(raw)
  success = success_from(pairs)

  Response.new(
    success,
    message_from(success, pairs),
    pairs,
    authorization: authorization_from(pairs),
    test: test?
  )
end
envelope(mode) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 196
      def envelope(mode)
        <<-EOS
          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://Borgun/Heimir/pub/ws/Authorization">
            <soapenv:Header/>
            <soapenv:Body>
              <aut:#{mode}AuthorizationInput>
                <#{mode}AuthReqXml>
                {{ :body }}
                </#{mode}AuthReqXml>
              </aut:#{mode}AuthorizationInput>
            </soapenv:Body>
          </soapenv:Envelope>
        EOS
      end
headers() click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 177
def headers
  {
    'Authorization' => 'Basic ' + Base64.strict_encode64(@options[:username].to_s + ':' + @options[:password].to_s),
  }
end
message_from(succeeded, response) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 151
def message_from(succeeded, response)
  if succeeded
    'Succeeded'
  else
    response[:message] || "Error with ActionCode=#{response[:actioncode]}"
  end
end
parse(xml) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 106
def parse(xml)
  response = {}

  doc = Nokogiri::XML(CGI.unescapeHTML(xml))
  body = doc.xpath('//getAuthorizationReply')
  body = doc.xpath('//cancelAuthorizationReply') if body.length == 0
  body.children.each do |node|
    if node.text?
      next
    elsif node.elements.size == 0
      response[node.name.downcase.to_sym] = node.text
    else
      node.elements.each do |childnode|
        name = "#{node.name.downcase}_#{childnode.name.downcase}"
        response[name.to_sym] = childnode.text
      end
    end
  end

  response
end
six_random_digits() click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 215
def six_random_digits
  (0...6).map { rand(48..57).chr }.join
end
split_authorization(authorization) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 172
def split_authorization(authorization)
  dateandtime, batch, transaction, rrn, authcode, transtype, tramount, currency = authorization.split('|')
  [dateandtime, batch, transaction, rrn, authcode, transtype, tramount, currency]
end
success_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 147
def success_from(response)
  (response[:actioncode] == '000')
end
url(action) click to toggle source
# File lib/active_merchant/billing/gateways/borgun.rb, line 211
def url(action)
  (test? ? test_url : live_url)
end