flutterwave_sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +32 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +1282 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/flutterwave_sdk.gemspec +28 -0
  14. data/lib/flutterwave_sdk/error.rb +15 -0
  15. data/lib/flutterwave_sdk/flutterwave_modules/base_endpoints.rb +5 -0
  16. data/lib/flutterwave_sdk/flutterwave_modules/util.rb +26 -0
  17. data/lib/flutterwave_sdk/flutterwave_objects/account_payment.rb +55 -0
  18. data/lib/flutterwave_sdk/flutterwave_objects/bank.rb +17 -0
  19. data/lib/flutterwave_sdk/flutterwave_objects/bank_transfer.rb +30 -0
  20. data/lib/flutterwave_sdk/flutterwave_objects/base/base.rb +109 -0
  21. data/lib/flutterwave_sdk/flutterwave_objects/base/card_base.rb +49 -0
  22. data/lib/flutterwave_sdk/flutterwave_objects/beneficiaries.rb +34 -0
  23. data/lib/flutterwave_sdk/flutterwave_objects/bills.rb +86 -0
  24. data/lib/flutterwave_sdk/flutterwave_objects/card.rb +55 -0
  25. data/lib/flutterwave_sdk/flutterwave_objects/misc.rb +37 -0
  26. data/lib/flutterwave_sdk/flutterwave_objects/mobile_money.rb +49 -0
  27. data/lib/flutterwave_sdk/flutterwave_objects/otp.rb +22 -0
  28. data/lib/flutterwave_sdk/flutterwave_objects/payment_plan.rb +42 -0
  29. data/lib/flutterwave_sdk/flutterwave_objects/preauthorise.rb +26 -0
  30. data/lib/flutterwave_sdk/flutterwave_objects/qr.rb +28 -0
  31. data/lib/flutterwave_sdk/flutterwave_objects/settlements.rb +17 -0
  32. data/lib/flutterwave_sdk/flutterwave_objects/subaccount.rb +40 -0
  33. data/lib/flutterwave_sdk/flutterwave_objects/subscriptions.rb +25 -0
  34. data/lib/flutterwave_sdk/flutterwave_objects/tokenized_charge.rb +61 -0
  35. data/lib/flutterwave_sdk/flutterwave_objects/transactions.rb +47 -0
  36. data/lib/flutterwave_sdk/flutterwave_objects/transfer.rb +46 -0
  37. data/lib/flutterwave_sdk/flutterwave_objects/ussd_payment.rb +27 -0
  38. data/lib/flutterwave_sdk/flutterwave_objects/virtual_account_number.rb +34 -0
  39. data/lib/flutterwave_sdk/flutterwave_objects/virtual_card.rb +66 -0
  40. data/lib/flutterwave_sdk/version.rb +3 -0
  41. data/lib/flutterwave_sdk.rb +126 -0
  42. metadata +88 -0
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "flutterwave_sdk"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,28 @@
1
+ require_relative 'lib/flutterwave_sdk/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "flutterwave_sdk"
5
+ spec.version = FlutterwaveSdk::VERSION
6
+ spec.authors = ["Flutterwave Developers"]
7
+ spec.email = ["developers@flutterwavego.com"]
8
+
9
+ spec.date = '2020-05-10'
10
+ spec.summary = %q{Official Ruby Gem For Flutterwave APIs.}
11
+ spec.description = %q{This is the official Ruby Gem For Flutterwave Payments which includes Card, Account, Transfer, Subaccount, Subscription, Mpesa, Ghana Mobile Money, Ussd, Payment Plans, and Transfer payment methods.}
12
+ spec.homepage = "https://github.com/Flutterwave/Flutterwave-Ruby-v3."
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = spec.homepage
18
+ spec.metadata["changelog_uri"] = spec.homepage
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+ end
@@ -0,0 +1,15 @@
1
+ class FlutterwaveServerError < StandardError
2
+ attr_reader :response
3
+ def initialize(response=nil)
4
+ @response = response
5
+ end
6
+ end
7
+
8
+ class FlutterwaveBadKeyError < StandardError
9
+ end
10
+
11
+ class IncompleteParameterError < StandardError
12
+ end
13
+
14
+ class SuggestedAuthError < StandardError
15
+ end
@@ -0,0 +1,5 @@
1
+ module BASE_ENDPOINTS
2
+ FLUTTERWAVE_LIVE_URL = "https://api.flutterwave.com/v3"
3
+ FLUTTERWAVE_SANDBOX_URL = "https://api.flutterwave.com/v3"
4
+ CHARGE_ENDPOINT = "/charges"
5
+ end
@@ -0,0 +1,26 @@
1
+
2
+ require "digest"
3
+ require "openssl"
4
+ require "base64"
5
+ require 'json'
6
+ require 'securerandom'
7
+
8
+ module Util
9
+
10
+ # method to generate merchants transaction reference
11
+ def self.transaction_reference_generator
12
+ transaction_ref = "MC-" + SecureRandom.hex
13
+ return transaction_ref
14
+ end
15
+
16
+ # method for encryption algorithm
17
+ def self.encrypt(key, data)
18
+ cipher = OpenSSL::Cipher.new("des-ede3")
19
+ cipher.encrypt # Call this before setting key
20
+ cipher.key = key
21
+ data = data.to_json
22
+ ciphertext = cipher.update(data)
23
+ ciphertext << cipher.final
24
+ return Base64.encode64(ciphertext)
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class AccountPayment < Base
5
+ def initiate_charge(data)
6
+ base_url = flutterwave_object.base_url
7
+
8
+ # only update the payload with the transaction reference if it isn't already added to the payload
9
+ if !data.key?("tx_ref")
10
+ data.merge!({"tx_ref" => Util.transaction_reference_generator})
11
+ end
12
+ # check the currency to determine the type and the required parameters
13
+ currency = data["currency"]
14
+ if currency == "NGN"
15
+ required_parameters = [ "amount", "email", "account_bank", "account_number", "tx_ref", "currency"]
16
+ type = "debit_ng_account"
17
+ elsif currency == "GBP"
18
+ required_parameters = [ "amount", "email", "account_bank", "account_number", "tx_ref", "currency"]
19
+ type = "debit_uk_account"
20
+ elsif currency == "USD" || "ZAR"
21
+ required_parameters = [ "amount", "email", "country", "tx_ref", "currency"]
22
+ type = "ach_payment"
23
+ else
24
+ return "pass a valid currency"
25
+ end
26
+
27
+ check_passed_parameters(required_parameters, data)
28
+ type = type
29
+ payload = data.to_json
30
+
31
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::CHARGE_ENDPOINT}?type=#{type}", payload)
32
+ return response
33
+ end
34
+
35
+ def validate_charge(flw_ref, otp)
36
+ base_url = flutterwave_object.base_url
37
+
38
+ payload = {
39
+ "otp" => otp,
40
+ "flw_ref" => flw_ref
41
+ }
42
+
43
+ payload = payload.to_json
44
+
45
+ response = post_request("#{base_url}/validate-charge", payload)
46
+ return response
47
+ end
48
+
49
+ def verify_charge(id)
50
+ base_url = flutterwave_object.base_url
51
+
52
+ response = get_request("#{base_url}}/transactions/#{id}/verify")
53
+ return response
54
+ end
55
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class Bank < Base
5
+
6
+ def get_all_banks(country)
7
+ base_url = flutterwave_object.base_url
8
+ response = get_request("#{base_url}/banks/#{country}")
9
+ return response
10
+ end
11
+
12
+ def get_bank_branch(id)
13
+ base_url = flutterwave_object.base_url
14
+ response = get_request("#{base_url}/banks/#{id}/branches")
15
+ return response
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class BankTransfer < Base
5
+ def initiate_charge(data)
6
+ base_url = flutterwave_object.base_url
7
+
8
+ # only update the payload with the transaction reference if it isn't already added to the payload
9
+ if !data.key?("tx_ref")
10
+ data.merge!({"tx_ref" => Util.transaction_reference_generator})
11
+ end
12
+ # check the currency to determine the type and the required parameters
13
+ required_parameters = ["amount", "duration", "email", "phone_number", "frequency", "narration", "is_permanent", "tx_ref", "currency"]
14
+
15
+ check_passed_parameters(required_parameters, data)
16
+ type = "bank_transfer"
17
+ payload = data.to_json
18
+
19
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::CHARGE_ENDPOINT}?type=#{type}", payload)
20
+ return response
21
+ end
22
+
23
+ # mthod to verify transaction
24
+ def verify_charge(id)
25
+ base_url = flutterwave_object.base_url
26
+
27
+ response = get_request("#{base_url}/transactions/#{id}/verify")
28
+ return response
29
+ end
30
+ end
@@ -0,0 +1,109 @@
1
+ require 'httparty'
2
+ require_relative "../../flutterwave_modules/base_endpoints"
3
+ require "json"
4
+ require_relative "../../error"
5
+
6
+ class Base
7
+
8
+ attr_reader :flutterwave_object
9
+
10
+ # method to initialize this class
11
+
12
+ def initialize(flutterwave_object=nil)
13
+ unless !flutterwave_object.nil?
14
+ raise ArgumentError, "Flutterwave Object is required!!!"
15
+ end
16
+ @flutterwave_object = flutterwave_object
17
+ end
18
+
19
+
20
+ # method to make a get request
21
+ def get_request(endpoint)
22
+ # headers = {
23
+ # "Authorization" => "Bearer #{flutterwave_object.secret_key}"
24
+ # }
25
+ begin
26
+ response = HTTParty.get(endpoint, :headers => { "Authorization" => "Bearer #{flutterwave_object.secret_key}" })
27
+ unless (response.code == 200 || response.code == 201)
28
+ raise FlutterwaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
29
+ end
30
+
31
+ return response
32
+
33
+ unless(response.code != 0 )
34
+ raise FlutterwaveServerError.new(response), "Server Message: #{response.message}"
35
+ end
36
+
37
+ rescue JSON::ParserError => jsonerr
38
+ raise FlutterwaveServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
39
+ return response
40
+ end
41
+ end
42
+
43
+ # method to make a post request
44
+ def post_request(endpoint, data)
45
+ begin
46
+ response = HTTParty.post(endpoint, {
47
+ body: data,
48
+ headers: {
49
+ "Content-Type" => "application/json",
50
+ "Authorization" => "Bearer #{flutterwave_object.secret_key}"
51
+ }
52
+ })
53
+
54
+ unless (response.code == 200 || response.code == 201)
55
+ raise FlutterwaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
56
+ end
57
+ return response
58
+ end
59
+
60
+ end
61
+ # method to make a put request
62
+ def put_request(endpoint, data)
63
+ begin
64
+ response = HTTParty.put(endpoint, {
65
+ body: data,
66
+ headers: {
67
+ "Content-Type" => "application/json",
68
+ "Authorization" => "Bearer #{flutterwave_object.secret_key}"
69
+ }
70
+ })
71
+
72
+ unless (response.code == 200 || response.code == 201)
73
+ raise FlutterwaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
74
+ end
75
+ return response
76
+ end
77
+ end
78
+
79
+ # method to make a delete request
80
+ def delete_request(endpoint, data)
81
+ begin
82
+ response = HTTParty.delete(endpoint, {
83
+ body: data,
84
+ headers: {
85
+ "Content-Type" => "application/json",
86
+ "Authorization" => "Bearer #{flutterwave_object.secret_key}"
87
+ }
88
+ })
89
+
90
+ unless (response.code == 200 || response.code == 201)
91
+ raise FlutterwaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
92
+ end
93
+ return response
94
+ end
95
+ end
96
+
97
+ # method to check if the passed parameters is equal to the expected parameters
98
+ def check_passed_parameters(required_params, passed_params)
99
+
100
+ # This is used to check if the passed authorization parameters matches the required parameters
101
+ required_params.each do |k, v|
102
+ if !passed_params.key?(k)
103
+ raise IncompleteParameterError, "Parameters Incomplete, Missing Parameter: #{k}, Please pass in the complete parameter."
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+
@@ -0,0 +1,49 @@
1
+ require_relative "base.rb"
2
+
3
+ class CardBase < Base
4
+
5
+ # method to the passed suggested auth to the corresponding value in the available hash
6
+ def get_auth_type(suggested_auth)
7
+ auth_map = {"pin" => :pin, "avs_vbvsecurecode" => :address, "noauth_international" => :address, "avs_noauth" => :address}
8
+
9
+ # Raise Error if the right authorization type is not passed
10
+ unless !auth_map.has_key? auth_map[suggested_auth]
11
+ raise RequiredAuthError, "Required suggested authorization type not available."
12
+ end
13
+ return auth_map[suggested_auth]
14
+ end
15
+
16
+
17
+ # method to update payload
18
+ def update_payload(suggested_auth, payload, **keyword_args)
19
+ auth_type = get_auth_type(suggested_auth)
20
+
21
+ # Error is raised if the expected suggested auth is not found in the keyword arguments
22
+ if !keyword_args.key?(auth_type)
23
+ raise SuggestedAuthError, "Please pass the suggested auth."
24
+ end
25
+
26
+ # if the authorization type is equal to address symbol, update with the required parameters
27
+ if auth_type == :address
28
+ required_parameters = ["city", "address", "state", "country", "zipcode"]
29
+ check_passed_parameters(required_parameters, keyword_args[auth_type])
30
+ authorization = {}
31
+ authorization.merge!({"mode" => suggested_auth})
32
+ # puts authorization
33
+ authorization.merge!(keyword_args[auth_type])
34
+ payload["authorization"]= authorization
35
+ return payload
36
+ end
37
+
38
+
39
+ # return this updated payload if the passed authorization type isn't address symbol
40
+ authorization = {}
41
+ # authorization.merge!({"mode" => suggested_auth, "fields" => keyword_args[auth_type]})
42
+ authorization.merge!({"mode" => suggested_auth})
43
+ puts authorization
44
+ authorization.merge!(keyword_args[auth_type])
45
+ payload["authorization"]= authorization
46
+ return payload
47
+
48
+ end
49
+ end
@@ -0,0 +1,34 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class Beneficiaries < Base
5
+
6
+ def create_beneficiary(data)
7
+ base_url = flutterwave_object.base_url
8
+ required_parameters = ["account_number", "account_bank"]
9
+ check_passed_parameters(required_parameters, data)
10
+ payload = data.to_json
11
+ response = post_request("#{base_url}/beneficiaries", payload)
12
+ return response
13
+ end
14
+
15
+ def list_beneficiaries
16
+ base_url = flutterwave_object.base_url
17
+ response = get_request("#{base_url}/beneficiaries")
18
+ return response
19
+ end
20
+
21
+ def fetch_beneficiary(id)
22
+ base_url = flutterwave_object.base_url
23
+ response = get_request("#{base_url}/beneficiaries/#{id}")
24
+ return response
25
+ end
26
+
27
+ def delete_beneficiary(id)
28
+ base_url = flutterwave_object.base_url
29
+ payload = {}
30
+ payload = payload.to_json
31
+ response = delete_request("#{base_url}/beneficiaries/#{id}", payload)
32
+ return response
33
+ end
34
+ end
@@ -0,0 +1,86 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class Bills < Base
5
+
6
+ def create_bill_payment(data)
7
+ base_url = flutterwave_object.base_url
8
+ required_parameters = ["country", "customer", "amount", "recurrence", "type"]
9
+ check_passed_parameters(required_parameters, data)
10
+ payload = data.to_json
11
+ response = post_request("#{base_url}/bills", payload)
12
+ return response
13
+ end
14
+
15
+ def create_bulk_bill_payments(data)
16
+ base_url = flutterwave_object.base_url
17
+ required_parameters = ["bulk_reference", "callback_url", "bulk_data"]
18
+ check_passed_parameters(required_parameters, data)
19
+ payload = data.to_json
20
+ response = post_request("#{base_url}/bulk-bills", payload)
21
+ return response
22
+ end
23
+
24
+ def get_status_of_a_bill_payment(reference)
25
+ base_url = flutterwave_object.base_url
26
+ response = get_request("#{base_url}/bills/#{reference}")
27
+ return response
28
+ end
29
+
30
+ def update_bills_order(reference, data)
31
+ base_url = flutterwave_object.base_url
32
+ required_parameters = ["bulk_reference", "callback_url", "bulk_data"]
33
+ check_passed_parameters(required_parameters, data)
34
+ payload = data.to_json
35
+ response = post_request("#{base_url}/product-orders/#{reference}", payload)
36
+ return response
37
+ end
38
+
39
+ def validate_bill_service(item_code, data)
40
+ base_url = flutterwave_object.base_url
41
+ required_parameters = ["code", "customer"]
42
+ check_passed_parameters(required_parameters, data)
43
+ payload = data.to_json
44
+ response = post_request("#{base_url}/bill-items/#{item_code}/validate", payload)
45
+ return response
46
+ end
47
+
48
+ def get_bill_categories
49
+ base_url = flutterwave_object.base_url
50
+ response = get_request("#{base_url}/bill-categories")
51
+ return response
52
+ end
53
+
54
+ def get_bill_payment_agencies
55
+ base_url = flutterwave_object.base_url
56
+ response = get_request("#{base_url}/billers")
57
+ return response
58
+ end
59
+
60
+ def get_amount_for_a_product(id, product_id)
61
+ base_url = flutterwave_object.base_url
62
+ response = get_request("#{base_url}/billers/#{id}/products/#{product_id}")
63
+ return response
64
+ end
65
+
66
+ def get_bill_payments(data)
67
+ base_url = flutterwave_object.base_url
68
+ payload = data.to_json
69
+ response = get_request("#{base_url}/bills", payload)
70
+ return response
71
+ end
72
+
73
+ def get_products_under_an_agency(id)
74
+ base_url = flutterwave_object.base_url
75
+ response = get_request("#{base_url}/billers/#{id}/products")
76
+ return response
77
+ end
78
+
79
+ def create_order_using_billing_code_and_productid(id, product_id, data)
80
+ base_url = flutterwave_object.base_url
81
+ payload = data.to_json
82
+ response = post_request("#{base_url}/biller/#{id}/products/#{product_id}/orders", payload)
83
+ return response
84
+ end
85
+
86
+ end
@@ -0,0 +1,55 @@
1
+ require_relative "base/card_base.rb"
2
+ require 'json'
3
+
4
+ class Card < CardBase
5
+
6
+ # method to initiate card charge
7
+ def initiate_charge(data)
8
+ base_url = flutterwave_object.base_url
9
+ encryption_key = flutterwave_object.encryption_key
10
+ public_key = flutterwave_object.public_key
11
+
12
+ # only update the payload with the transaction reference if it isn't already added to the payload
13
+ if !data.key?("tx_ref")
14
+ data.merge!({"tx_ref" => Util.transaction_reference_generator})
15
+ end
16
+
17
+ data.merge!({"public_key" => public_key})
18
+
19
+ required_parameters = [ "card_number", "cvv", "expiry_month", "expiry_year", "amount", "tx_ref", "currency", "email"]
20
+ check_passed_parameters(required_parameters, data)
21
+
22
+ encrypt_data = Util.encrypt(encryption_key, data)
23
+
24
+ payload = {
25
+ "public_key" => public_key,
26
+ "client" => encrypt_data,
27
+ "alg" => "3DES-24"
28
+ }
29
+ type = "card"
30
+ payload = payload.to_json
31
+
32
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::CHARGE_ENDPOINT}?type=#{type}", payload)
33
+
34
+ return response
35
+
36
+ end
37
+
38
+ def validate_charge(flw_ref, otp)
39
+ base_url = flutterwave_object.base_url
40
+ payload = {
41
+ "otp" => otp,
42
+ "flw_ref" => flw_ref
43
+ }
44
+
45
+ payload = payload.to_json
46
+ response = post_request("#{base_url}/validate-charge", payload)
47
+ return response
48
+ end
49
+
50
+ def verify_charge(id)
51
+ base_url = flutterwave_object.base_url
52
+ response = get_request("#{base_url}/transactions/#{id}/verify")
53
+ return response
54
+ end
55
+ end
@@ -0,0 +1,37 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class Misc < Base
5
+ def get_all_wallet_balance()
6
+ base_url = flutterwave_object.base_url
7
+ response = get_request("#{base_url}/balances")
8
+ return response
9
+ end
10
+
11
+ def get_balance_per_currency(currency)
12
+ base_url = flutterwave_object.base_url
13
+ response = get_request("#{base_url}/balances/#{currency}")
14
+ return response
15
+ end
16
+
17
+ def resolve_account(data)
18
+ base_url = flutterwave_object.base_url
19
+ required_parameters = ["account_bank", "account_number"]
20
+ check_passed_parameters(required_parameters, data)
21
+ payload = data.to_json
22
+ response = post_request("#{base_url}/accounts/resolve", payload)
23
+ return response
24
+ end
25
+
26
+ def resolve_bvn(bvn)
27
+ base_url = flutterwave_object.base_url
28
+ response = get_request("#{base_url}/kyc/bvns/#{bvn}")
29
+ return response
30
+ end
31
+
32
+ def resolve_card_bin(bin)
33
+ base_url = flutterwave_object.base_url
34
+ response = get_request("#{base_url}/card-bins/#{bin}")
35
+ return response
36
+ end
37
+ end
@@ -0,0 +1,49 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class MobileMoney < Base
5
+ def initiate_charge(data)
6
+ base_url = flutterwave_object.base_url
7
+
8
+ # only update the payload with the transaction reference if it isn't already added to the payload
9
+ if !data.key?("tx_ref")
10
+ data.merge!({"tx_ref" => Util.transaction_reference_generator})
11
+ end
12
+ # check the currency to determine the type and the required parameters
13
+ if data["currency"] == "KES"
14
+ required_parameters = [ "amount", "email", "phone_number", "tx_ref", "currency"]
15
+ type = "mpesa"
16
+ elsif data["currency"] == "UGX"
17
+ required_parameters = ["amount", "email", "phone_number", "tx_ref", "currency"]
18
+ type = "mobile_money_uganda"
19
+ elsif data["currency"] == "GHS"
20
+ required_parameters = ["amount", "email", "phone_number", "tx_ref", "currency"]
21
+ type = "mobile_money_ghana"
22
+ elsif data["currency"] == "ZMW"
23
+ required_parameters = ["amount", "email", "phone_number","tx_ref", "currency"]
24
+ type = "mobile_money_zambia"
25
+ elsif data["currency"] == "RWF"
26
+ required_parameters = ["amount", "email", "phone_number","tx_ref", "currency"]
27
+ type = "mobile_money_rwanda"
28
+ elsif data["currency"] == "XAF" || data["currency"] == "XOF"
29
+ required_parameters = ["amount", "email", "phone_number", "tx_ref", "currency"]
30
+ type = "mobile_money_franco"
31
+ else
32
+ return "pass a valid currency"
33
+ end
34
+
35
+ check_passed_parameters(required_parameters, data)
36
+ type = type
37
+ payload = data.to_json
38
+
39
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::CHARGE_ENDPOINT}?type=#{type}", payload)
40
+ return response
41
+ end
42
+
43
+ # mthod to verify transaction
44
+ def verify_charge(id)
45
+
46
+ response = get_request("#{base_url}/transactions/#{id}/verify")
47
+ return response
48
+ end
49
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base/base.rb"
2
+ require 'json'
3
+
4
+ class OTP < Base
5
+ def create_otp(data)
6
+ base_url = flutterwave_object.base_url
7
+ required_parameters = ["length", "customer", "sender", "send", "medium"]
8
+ check_passed_parameters(required_parameters, data)
9
+ payload = data.to_json
10
+ response = post_request("#{base_url}/otps", payload)
11
+ return response
12
+ end
13
+
14
+ def validate_otp(reference, data)
15
+ base_url = flutterwave_object.base_url
16
+ required_parameters = ["otp"]
17
+ check_passed_parameters(required_parameters, data)
18
+ payload = data.to_json
19
+ response = post_request("#{base_url}/otps/#{reference}/validate", payload)
20
+ return response
21
+ end
22
+ end