class Mobile::Pesa::StkPushViaPaybillNumber

Attributes

account_number[R]
amount[R]
pay_bill_number[R]
phone_number[R]

Public Class Methods

call(amount:, phone_number:, account_number:, pay_bill_number:) click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 15
def self.call(amount:, phone_number:, account_number:, pay_bill_number:)
  new(amount, phone_number, account_number, pay_bill_number).call
end
new(amount, phone_number, account_number, pay_bill_number) click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 19
def initialize(amount, phone_number, account_number, pay_bill_number)
  @amount = amount
  @phone_number = phone_number
  @account_number = account_number
  @pay_bill_number = pay_bill_number
end

Public Instance Methods

call() click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 26
def call
  url = URI("https://sandbox.safaricom.co.ke/mpesa/stkpush/v1/processrequest")

  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Post.new(url)
  request["Content-Type"] = 'application/json'
  request["Authorization"] = "Bearer #{token}"
  request.body = JSON.dump(body)

  response = http.request(request)
  parsed_body = JSON.parse(response.read_body)

  if parsed_body.key?("errorCode")
    error = OpenStruct.new(
      error_code: parsed_body["errorCode"],
      error_message: parsed_body["errorMessage"],
      request_id: parsed_body["requestId"]
    )
    OpenStruct.new(result: nil, error: error)
  else
    result = OpenStruct.new(
      merchant_request_id: parsed_body["MerchantRequestID"],
      checkout_request_id: parsed_body["CheckoutRequestID"],
      response_code: parsed_body["ResponseCode"],
      response_description: parsed_body["ResponseDescription"],
      customer_message: parsed_body["CustomerMessage"]
    )
    OpenStruct.new(result: result, error: nil)
  end
rescue JSON::ParserError => error
  OpenStruct.new(result: nil, error: error)
end

Private Instance Methods

body() click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 68
def body
  {
    "BusinessShortCode": pay_bill_number,
    "Password": password,
    "Timestamp": timestamp.to_s,
    "TransactionType": "CustomerPayBillOnline",
    "Amount": amount,
    "PartyA": phone_number,
    "PartyB": pay_bill_number,
    "PhoneNumber": phone_number,
    "CallBackURL": Mobile::Pesa.configuration.callback_url,
    "AccountReference": account_number,
    "TransactionDesc": "Payment of X"
  }
end
password() click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 84
def password
  Base64.strict_encode64("#{pay_bill_number}#{Mobile::Pesa.configuration.pass_key}#{timestamp}")
end
timestamp() click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 88
def timestamp
  Time.now.strftime('%Y%m%d%H%M%S').to_i
end
token() click to toggle source
# File lib/mobile/pesa/stk_push_via_paybill_number.rb, line 64
def token
  Mobile::Pesa::Authorization.call.result.access_token
end