class ActiveMerchant::Billing::FatZebraGateway

Public Class Methods

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

Public Instance Methods

authorize(money, creditcard, options = {}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 35
def authorize(money, creditcard, options = {})
  post = {}

  add_amount(post, money, options)
  add_creditcard(post, creditcard, options)
  add_extra_options(post, options)
  add_order_id(post, options)
  add_ip(post, options)
  add_metadata(post, options)

  post[:capture] = false

  commit(:post, 'purchases', post)
end
capture(money, authorization, options = {}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 50
def capture(money, authorization, options = {})
  txn_id, _ = authorization.to_s.split('|')
  post = {}

  add_amount(post, money, options)
  add_extra_options(post, options)

  commit(:post, "purchases/#{CGI.escape(txn_id)}/capture", post)
end
purchase(money, creditcard, options = {}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 22
def purchase(money, creditcard, options = {})
  post = {}

  add_amount(post, money, options)
  add_creditcard(post, creditcard, options)
  add_extra_options(post, options)
  add_order_id(post, options)
  add_ip(post, options)
  add_metadata(post, options)

  commit(:post, 'purchases', post)
end
refund(money, authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 60
def refund(money, authorization, options={})
  txn_id, _ = authorization.to_s.split('|')
  post = {}

  add_extra_options(post, options)
  add_amount(post, money, options)
  post[:transaction_id] = txn_id
  add_order_id(post, options)

  commit(:post, 'refunds', post)
end
scrub(transcript) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 90
def scrub(transcript)
  transcript.
    gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
    gsub(%r(("card_number\\?":\\?")[^"\\]*)i, '\1[FILTERED]').
    gsub(%r(("cvv\\?":\\?")\d+), '\1[FILTERED]')
end
store(creditcard, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 78
def store(creditcard, options={})
  post = {}

  add_creditcard(post, creditcard)

  commit(:post, 'credit_cards', post)
end
supports_scrubbing?() click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 86
def supports_scrubbing?
  true
end
void(authorization, options={}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 72
def void(authorization, options={})
  txn_id, endpoint = authorization.to_s.split('|')

  commit(:post, "#{endpoint}/void?id=#{txn_id}", {})
end

Private Instance Methods

add_amount(post, money, options) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 99
def add_amount(post, money, options)
  post[:currency] = (options[:currency] || currency(money))
  post[:currency] = post[:currency].upcase if post[:currency]
  post[:amount] = money
end
add_creditcard(post, creditcard, options = {}) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 105
def add_creditcard(post, creditcard, options = {})
  if creditcard.respond_to?(:number)
    post[:card_number] = creditcard.number
    post[:card_expiry] = "#{creditcard.month}/#{creditcard.year}"
    post[:cvv] = creditcard.verification_value if creditcard.verification_value?
    post[:card_holder] = creditcard.name if creditcard.name
  elsif creditcard.is_a?(String)
    id, _ = creditcard.to_s.split('|')
    post[:card_token] = id
    post[:cvv] = options[:cvv]
  elsif creditcard.is_a?(Hash)
    ActiveMerchant.deprecated 'Passing the credit card as a Hash is deprecated. Use a String and put the (optional) CVV in the options hash instead.'
    post[:card_token] = creditcard[:token]
    post[:cvv] = creditcard[:cvv]
  else
    raise ArgumentError.new("Unknown credit card format #{creditcard.inspect}")
  end
end
add_extra_options(post, options) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 124
def add_extra_options(post, options)
  extra = {}
  extra[:ecm] = '32' if options[:recurring]
  extra[:cavv] = options[:cavv] if options[:cavv]
  extra[:xid] = options[:xid] if options[:xid]
  extra[:sli] = options[:sli] if options[:sli]
  extra[:name] = options[:merchant] if options[:merchant]
  extra[:location] = options[:merchant_location] if options[:merchant_location]
  post[:extra] = extra if extra.any?
end
add_ip(post, options) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 139
def add_ip(post, options)
  post[:customer_ip] = options[:ip] || '127.0.0.1'
end
add_metadata(post, options) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 143
def add_metadata(post, options)
  post[:metadata] = options.fetch(:metadata, {})
end
add_order_id(post, options) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 135
def add_order_id(post, options)
  post[:reference] = options[:order_id] || SecureRandom.hex(15)
end
authorization_from(response, success, uri) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 173
def authorization_from(response, success, uri)
  endpoint = uri.split('/')[0]
  if success
    id = response['response']['id'] || response['response']['token']
    "#{id}|#{endpoint}"
  else
    nil
  end
end
commit(method, uri, parameters=nil) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 147
def commit(method, uri, parameters=nil)
  response = begin
    parse(ssl_request(method, get_url(uri), parameters.to_json, headers))
  rescue ResponseError => e
    return Response.new(false, 'Invalid Login') if(e.response.code == '401')
    parse(e.response.body)
  end

  success = success_from(response)
  Response.new(
    success,
    message_from(response),
    response,
    :test => response['test'],
    :authorization => authorization_from(response, success, uri)
  )
end
get_url(uri) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 205
def get_url(uri)
  base = test? ? self.test_url : self.live_url
  base + '/' + uri
end
headers() click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 210
def headers
  {
    'Authorization' => 'Basic ' + Base64.strict_encode64(@options[:username].to_s + ':' + @options[:token].to_s).strip,
    'User-Agent' => "Fat Zebra v1.0/ActiveMerchant #{ActiveMerchant::VERSION}"
  }
end
message_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 183
def message_from(response)
  if !response['errors'].empty?
    response['errors'].join(', ')
  elsif response['response']['message']
    response['response']['message']
  else
    'Unknown Error'
  end
end
parse(response) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 193
def parse(response)
  JSON.parse(response)
rescue JSON::ParserError
  msg = 'Invalid JSON response received from Fat Zebra. Please contact support@fatzebra.com.au if you continue to receive this message.'
  msg += "  (The raw response returned by the API was #{response.inspect})"
  {
    'successful' => false,
    'response' => {},
    'errors' => [msg]
  }
end
success_from(response) click to toggle source
# File lib/active_merchant/billing/gateways/fat_zebra.rb, line 165
def success_from(response)
  (
    response['successful'] &&
    response['response'] &&
    (response['response']['successful'] || response['response']['token'] || response['response']['response_code'] == '00')
  )
end