module ApRubySdk

Constants

VERSION

Attributes

api_base[RW]
api_public_key[RW]
api_secret_key[RW]

Public Class Methods

api_url(url='') click to toggle source
# File lib/ap_ruby_sdk.rb, line 95
def self.api_url(url='')
  @api_base + url
end
request(method, url, api_secret_key, api_public_key, params={}, headers={}) click to toggle source
# File lib/ap_ruby_sdk.rb, line 50
def self.request(method, url, api_secret_key, api_public_key, params={}, headers={})
  unless api_secret_key ||= @api_secret_key
    raise AuthenticationError.new('No Secret API key provided.')
  end

  unless api_public_key ||= @api_public_key
    raise AuthenticationError.new('No Public API key provided.')
  end

  url = api_url(url)

  if method.to_s.downcase.to_sym == :get
    # Make params into GET params
    url += "#{URI.parse(url).query ? '&' : '?'}#{uri_encode(params)}" if params && params.any?
    payload = nil
  elsif method.to_s.downcase.to_sym == :delete
    # Make params into expected DELETE params
  elsif method.to_s.downcase.to_sym == :put
    # Make params into expected PUT params
  else
    # Make params into POST params
    payload = MultiJson.dump(params, mode: :compat)
  end

  request_opts = {
      :headers => request_headers(api_secret_key).update(headers),
      :open_timeout => 30,
      :timeout => 80,
      :method => method,
      :payload => payload,
      :url => url
  }
  begin
    response = execute_request(request_opts)
  rescue RestClient::ExceptionWithResponse => e
    if e.http_code and e.http_body
      parse_api_error(e.http_code, e.http_body)
    else
      raise APIError.new(message + "\n\n(Network error: #{e.message})")
    end
  end

  parse(response)
end

Private Class Methods

execute_request(opts) click to toggle source
# File lib/ap_ruby_sdk.rb, line 114
def self.execute_request(opts)
  RestClient::Request.execute(opts)
end
parse(response) click to toggle source
# File lib/ap_ruby_sdk.rb, line 118
def self.parse(response)
  begin
    response = MultiJson.load(response.body)
  rescue MultiJson::DecodeError
    raise_general_error(response.code, response.body)
  end

  Util.symbolize_names(response)
end
parse_api_error(response_code, response_body) click to toggle source
# File lib/ap_ruby_sdk.rb, line 133
def self.parse_api_error(response_code, response_body)
  begin
    error = MultiJson.load(response_body)
    error = Util.symbolize_names(error)

    raise ApError.new if error[:Type].nil? # if there is no type

  rescue MultiJson::DecodeError, ApError
    raise_general_error(response_code, response_body)
  end

  case error[:Type]
    when 'payment_error'
      raise PaymentError.new(error[:Message], response_code, error[:Code])
    when 'api_error'
      raise APIError.new(error[:Message], response_code, error[:Code])
    when 'invalid_parameter_error'
      raise InvalidParameterError.new(error[:Message], response_code, error[:Code], error[:Param])
    else
      raise APIError.new(error[:Message], response_code, error[:Code]);
  end
end
raise_general_error(response_code, response_body) click to toggle source
# File lib/ap_ruby_sdk.rb, line 128
def self.raise_general_error(response_code, response_body)
  raise APIError.new("Invalid response object from API: #{response_body.inspect} " +
                         "(HTTP response code was #{response_code})", response_code)
end
request_headers(api_secret_key) click to toggle source
# File lib/ap_ruby_sdk.rb, line 106
def self.request_headers(api_secret_key)
  {
      :user_agent => "AlternativePayments Ruby SDK v#{ApRubySdk::VERSION}",
      :authorization => "Basic #{Base64.strict_encode64(api_secret_key)}",
      :content_type => :json
  }
end
uri_encode(params) click to toggle source
# File lib/ap_ruby_sdk.rb, line 101
def self.uri_encode(params)
  Util.flatten_params(params).
      map { |k, v| "#{k}=#{Util.url_encode(v)}" }.join('&')
end