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.
- checksums.yaml +7 -0
- data/.gitignore +32 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +21 -0
- data/README.md +1282 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/flutterwave_sdk.gemspec +28 -0
- data/lib/flutterwave_sdk/error.rb +15 -0
- data/lib/flutterwave_sdk/flutterwave_modules/base_endpoints.rb +5 -0
- data/lib/flutterwave_sdk/flutterwave_modules/util.rb +26 -0
- data/lib/flutterwave_sdk/flutterwave_objects/account_payment.rb +55 -0
- data/lib/flutterwave_sdk/flutterwave_objects/bank.rb +17 -0
- data/lib/flutterwave_sdk/flutterwave_objects/bank_transfer.rb +30 -0
- data/lib/flutterwave_sdk/flutterwave_objects/base/base.rb +109 -0
- data/lib/flutterwave_sdk/flutterwave_objects/base/card_base.rb +49 -0
- data/lib/flutterwave_sdk/flutterwave_objects/beneficiaries.rb +34 -0
- data/lib/flutterwave_sdk/flutterwave_objects/bills.rb +86 -0
- data/lib/flutterwave_sdk/flutterwave_objects/card.rb +55 -0
- data/lib/flutterwave_sdk/flutterwave_objects/misc.rb +37 -0
- data/lib/flutterwave_sdk/flutterwave_objects/mobile_money.rb +49 -0
- data/lib/flutterwave_sdk/flutterwave_objects/otp.rb +22 -0
- data/lib/flutterwave_sdk/flutterwave_objects/payment_plan.rb +42 -0
- data/lib/flutterwave_sdk/flutterwave_objects/preauthorise.rb +26 -0
- data/lib/flutterwave_sdk/flutterwave_objects/qr.rb +28 -0
- data/lib/flutterwave_sdk/flutterwave_objects/settlements.rb +17 -0
- data/lib/flutterwave_sdk/flutterwave_objects/subaccount.rb +40 -0
- data/lib/flutterwave_sdk/flutterwave_objects/subscriptions.rb +25 -0
- data/lib/flutterwave_sdk/flutterwave_objects/tokenized_charge.rb +61 -0
- data/lib/flutterwave_sdk/flutterwave_objects/transactions.rb +47 -0
- data/lib/flutterwave_sdk/flutterwave_objects/transfer.rb +46 -0
- data/lib/flutterwave_sdk/flutterwave_objects/ussd_payment.rb +27 -0
- data/lib/flutterwave_sdk/flutterwave_objects/virtual_account_number.rb +34 -0
- data/lib/flutterwave_sdk/flutterwave_objects/virtual_card.rb +66 -0
- data/lib/flutterwave_sdk/version.rb +3 -0
- data/lib/flutterwave_sdk.rb +126 -0
- metadata +88 -0
data/Rakefile
ADDED
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,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,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
|