class ActiveMerchant::Billing::VancoGateway

Public Class Methods

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

Public Instance Methods

purchase(money, payment_method, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 23
def purchase(money, payment_method, options={})
  MultiResponse.run do |r|
    r.process { commit(login_request) }
    r.process { commit(purchase_request(money, payment_method, r.params["response_sessionid"], options)) }
  end
end
refund(money, authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 30
def refund(money, authorization, options={})
  MultiResponse.run do |r|
    r.process { commit(login_request) }
    r.process { commit(refund_request(money, authorization, r.params["response_sessionid"])) }
  end
end
scrub(transcript) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 41
def scrub(transcript)
  transcript.
    gsub(%r((<Password>).+(</Password>))i, '\1[FILTERED]\2').
    gsub(%r((<CardCVV2>).+(</CardCVV2>))i, '\1[FILTERED]\2').
    gsub(%r((<AccountNumber>).+(</AccountNumber>))i, '\1[FILTERED]\2')
end
supports_scrubbing?() click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 37
def supports_scrubbing?
  true
end

Private Instance Methods

add_amount(doc, money, options) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 177
def add_amount(doc, money, options)
  if empty?(options[:fund_id])
    doc.Amount(amount(money))
  else
    doc.Funds do
      doc.Fund do
        doc.FundID(options[:fund_id])
        doc.FundAmount(amount(money))
      end
    end
  end
end
add_auth(doc, request_type, session_id) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 163
def add_auth(doc, request_type, session_id)
  doc.Auth do
    add_request(doc, request_type)
    doc.SessionID(session_id)
  end
end
add_client_id(doc) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 241
def add_client_id(doc)
  doc.ClientID(@options[:client_id])
end
add_credit_card(doc, credit_card, options) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 198
def add_credit_card(doc, credit_card, options)
  address = options[:billing_address]

  doc.AccountNumber(credit_card.number)
  doc.CustomerName("#{credit_card.last_name}, #{credit_card.first_name}")
  doc.CardExpMonth(format(credit_card.month, :two_digits))
  doc.CardExpYear(format(credit_card.year, :two_digits))
  doc.CardCVV2(credit_card.verification_value)
  doc.CardBillingName(credit_card.name)
  doc.CardBillingAddr1(address[:address1])
  doc.CardBillingAddr2(address[:address2])
  doc.CardBillingCity(address[:city])
  doc.CardBillingState(address[:state])
  doc.CardBillingZip(address[:zip])
  doc.CardBillingCountryCode(address[:country])
  doc.AccountType("CC")
end
add_echeck(doc, echeck) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 216
def add_echeck(doc, echeck)
  if echeck.account_type == "savings"
    doc.AccountType("S")
  else
    doc.AccountType("C")
  end

  doc.CustomerName("#{echeck.last_name}, #{echeck.first_name}")
  doc.AccountNumber(echeck.account_number)
  doc.RoutingNumber(echeck.routing_number)
  doc.TransactionTypeCode("TEL")
end
add_errors_to_response(response, errors_xml) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 76
def add_errors_to_response(response, errors_xml)
  errors_hash = Hash.from_xml(errors_xml).values.first
  response[:response_errors] = errors_hash

  error = errors_hash["Error"]
  if error.kind_of?(Hash)
    response[:error_message] = error["ErrorDescription"]
    response[:error_codes] = error["ErrorCode"]
  elsif error.kind_of?(Array)
    error_str = error.map { |e| e["ErrorDescription"]}.join(". ")
    error_codes = error.map { |e| e["ErrorCode"]}.join(", ")
    response[:error_message] = "#{error_str}."
    response[:error_codes] = error_codes
  end
end
add_payment_method(doc, payment_method, options) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 190
def add_payment_method(doc, payment_method, options)
  if card_brand(payment_method) == 'check'
    add_echeck(doc, payment_method)
  else
    add_credit_card(doc, payment_method, options)
  end
end
add_purchase_noise(doc) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 229
def add_purchase_noise(doc)
  doc.StartDate("0000-00-00")
  doc.FrequencyCode("O")
end
add_reference(doc, authorization) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 170
def add_reference(doc, authorization)
  customer_ref, payment_method_ref, transaction_ref = split_authorization(authorization)
  doc.CustomerRef(customer_ref)
  doc.PaymentMethodRef(payment_method_ref)
  doc.TransactionRef(transaction_ref)
end
add_refund_noise(doc) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 234
def add_refund_noise(doc)
  doc.ContactName("Bilbo Baggins")
  doc.ContactPhone("1234567890")
  doc.ContactExtension("None")
  doc.ReasonForCredit("Refund requested")
end
add_request(doc, request_type) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 156
def add_request(doc, request_type)
  doc.RequestType(request_type)
  doc.RequestID(SecureRandom.hex(15))
  doc.RequestTime(Time.now)
  doc.Version(2)
end
authorization_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 114
def authorization_from(response)
  [
    response[:response_customerref],
    response[:response_paymentmethodref],
    response[:response_transactionref]
  ].join("|")
end
build_xml_request() { |doc| ... } click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 260
def build_xml_request
  builder = Nokogiri::XML::Builder.new
  builder.__send__("VancoWS") do |doc|
    yield(doc)
  end
  builder.to_xml
end
childnode_to_response(response, node, childnode) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 67
def childnode_to_response(response, node, childnode)
  name = "#{node.name.downcase}_#{childnode.name.downcase}"
  if name == "response_errors" && !childnode.elements.empty?
    add_errors_to_response(response, childnode.to_s)
  else
    response[name.downcase.to_sym] = childnode.text
  end
end
commit(request) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 92
def commit(request)
  response = parse(ssl_post(url, request, headers))

  succeeded = success_from(response)
  Response.new(
    succeeded,
    message_from(succeeded, response),
    response,
    authorization: authorization_from(response),
    test: test?
  )
end
headers() click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 272
def headers
  {
    'Content-Type' => 'text/xml'
  }
end
login_request() click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 245
def login_request
  build_xml_request do |doc|
    doc.Auth do
      add_request(doc, "Login")
    end

    doc.Request do
      doc.RequestVars do
        doc.UserID(@options[:user_id])
        doc.Password(@options[:password])
      end
    end
  end
end
message_from(succeeded, response) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 109
def message_from(succeeded, response)
  return "Success" if succeeded
  response[:error_message]
end
parse(xml) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 50
def parse(xml)
  response = {}

  doc = Nokogiri::XML(xml)
  doc.root.xpath('*').each do |node|
    if (node.elements.empty?)
      response[node.name.downcase.to_sym] = node.text
    else
      node.elements.each do |childnode|
        childnode_to_response(response, node, childnode)
      end
    end
  end

  response
end
purchase_request(money, payment_method, session_id, options) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 126
def purchase_request(money, payment_method, session_id, options)
  build_xml_request do |doc|
    add_auth(doc, "EFTAddCompleteTransaction", session_id)

    doc.Request do
      doc.RequestVars do
        add_client_id(doc)
        add_amount(doc, money, options)
        add_payment_method(doc, payment_method, options)
        add_purchase_noise(doc)
      end
    end
  end
end
refund_request(money, authorization, session_id) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 141
def refund_request(money, authorization, session_id)
  build_xml_request do |doc|
    add_auth(doc, "EFTAddCredit", session_id)

    doc.Request do
      doc.RequestVars do
        add_client_id(doc)
        add_amount(doc, money, options)
        add_reference(doc, authorization)
        add_refund_noise(doc)
      end
    end
  end
end
split_authorization(authorization) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 122
def split_authorization(authorization)
  authorization.to_s.split('|')
end
success_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 105
def success_from(response)
  !response[:response_errors]
end
url() click to toggle source
# File lib/active_merchant/billing/gateways/vanco.rb, line 268
def url
  (test? ? test_url : live_url)
end