class BitPesa::Client

Attributes

base_url[R]
debug[RW]
host[RW]
key[RW]
secret[RW]
timeout[RW]

Public Class Methods

delete(endpoint) click to toggle source
# File lib/bitpesa/client.rb, line 44
def delete(endpoint)
  request "DELETE", request_url(endpoint)
end
get(endpoint, payload=nil) click to toggle source
# File lib/bitpesa/client.rb, line 22
def get(endpoint, payload=nil)
  url = request_url(endpoint)
  query_string = payload && payload.reduce([]) {|r,item| r << item[1].to_query(item[0])}.join("&")
  url += "?" + query_string if query_string
  request "GET", url
end
patch(endpoint, payload={}) click to toggle source
# File lib/bitpesa/client.rb, line 39
def patch(endpoint, payload={})
  body = JSON.generate(payload)
  request "PATCH", request_url(endpoint), body
end
post(endpoint, payload={}) click to toggle source
# File lib/bitpesa/client.rb, line 29
def post(endpoint, payload={})
  body = JSON.generate(payload)
  request "POST", request_url(endpoint), body
end
put(endpoint, payload={}) click to toggle source
# File lib/bitpesa/client.rb, line 34
def put(endpoint, payload={})
  body = JSON.generate(payload)
  request "PUT", request_url(endpoint), body
end

Private Class Methods

connection() click to toggle source
# File lib/bitpesa/client.rb, line 83
def connection
  connection = Net::HTTP.new(host, 443)
  connection.open_timeout = timeout
  connection.read_timeout = timeout
  connection.use_ssl = true
  connection.set_debug_output($stderr) if debug
  connection
end
generate_nonce() click to toggle source
# File lib/bitpesa/client.rb, line 54
def generate_nonce
  SecureRandom.uuid
end
handle(response) click to toggle source
# File lib/bitpesa/client.rb, line 92
def handle response
  case response
    when Net::HTTPSuccess
      (response.body != "" && JSON.parse(response.body)) || true
    when Net::HTTPUnauthorized
      raise BitPesa::Unauthorized.new ""
    else
      raise BitPesa::Error.new response.body
  end
end
headers(http_method, url, body) click to toggle source
# File lib/bitpesa/client.rb, line 69
def headers http_method, url, body
  nonce = generate_nonce
  full_url = "https://" + host + url
  body_hexdigest = OpenSSL::Digest::SHA512.hexdigest(body || "")
  {
    "Content-Type" => "application/json",
    "Accept" => "text/html",
    "User-Agent" => "BitPesa Ruby API Client",
    "Authorization-Nonce" => nonce,
    "Authorization-Key" => key,
    "Authorization-Signature" => sign(nonce, http_method, full_url, body_hexdigest)
  }
end
request(http_method, url, payload=nil) click to toggle source
# File lib/bitpesa/client.rb, line 63
def request http_method, url, payload=nil
  req = Net::HTTP.const_get(http_method.capitalize).new(url, headers(http_method, url, payload))
  req.body = payload
  handle connection.start{|h| h.request(req)}
end
request_url(endpoint) click to toggle source
# File lib/bitpesa/client.rb, line 50
def request_url endpoint
  base_url + endpoint
end
sign(*args) click to toggle source
# File lib/bitpesa/client.rb, line 58
def sign *args
  message = args.compact.join("&")
  OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA512.new, secret, message)
end