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