flutterwave 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +102 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/flutterwave.gemspec +32 -0
- data/lib/flutterwave.rb +2 -0
- data/lib/flutterwave/account.rb +161 -0
- data/lib/flutterwave/ach.rb +83 -0
- data/lib/flutterwave/bank.rb +46 -0
- data/lib/flutterwave/bin.rb +35 -0
- data/lib/flutterwave/bvn.rb +74 -0
- data/lib/flutterwave/card.rb +272 -0
- data/lib/flutterwave/client.rb +31 -0
- data/lib/flutterwave/ip.rb +26 -0
- data/lib/flutterwave/pay.rb +121 -0
- data/lib/flutterwave/response.rb +28 -0
- data/lib/flutterwave/utils/constants.rb +64 -0
- data/lib/flutterwave/utils/encryption_manager.rb +37 -0
- data/lib/flutterwave/utils/helpers.rb +14 -0
- data/lib/flutterwave/utils/missing_key_error.rb +6 -0
- data/lib/flutterwave/utils/network_manager.rb +25 -0
- data/lib/flutterwave/version.rb +3 -0
- metadata +141 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
module Flutterwave
|
2
|
+
class BankAPI
|
3
|
+
attr_accessor :client
|
4
|
+
|
5
|
+
def initialize(client)
|
6
|
+
@client = client
|
7
|
+
end
|
8
|
+
|
9
|
+
# https://www.flutterwave.com/documentation/banks-enquiry/
|
10
|
+
def list
|
11
|
+
response = post(
|
12
|
+
Flutterwave::Utils::Constants::BANK[:list_url]
|
13
|
+
)
|
14
|
+
|
15
|
+
all_banks = response['data']
|
16
|
+
all_banks.keys.inject([]) do |list, code|
|
17
|
+
list << Bank.new(code, all_banks[code])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def find_by_code(code)
|
22
|
+
list.detect do |bank|
|
23
|
+
bank.code == code
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_by_name(name_match)
|
28
|
+
list.detect do |bank|
|
29
|
+
!(bank.name.downcase =~ /#{name_match.downcase}/).nil?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def post(url, data = {})
|
34
|
+
Flutterwave::Utils::NetworkManager.post(url, data)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Bank
|
39
|
+
attr_accessor :code, :name
|
40
|
+
|
41
|
+
def initialize(code, name)
|
42
|
+
@code = code
|
43
|
+
@name = name
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Flutterwave
|
2
|
+
class BIN
|
3
|
+
include Flutterwave::Helpers
|
4
|
+
attr_accessor :client, :options
|
5
|
+
|
6
|
+
def initialize(client)
|
7
|
+
@client = client
|
8
|
+
end
|
9
|
+
|
10
|
+
# https://www.flutterwave.com/documentation/compliance/ - Verify Card BIN API
|
11
|
+
def check(options = {})
|
12
|
+
@options = options
|
13
|
+
|
14
|
+
request_params = {
|
15
|
+
card6: encrypt(:card6)
|
16
|
+
}
|
17
|
+
|
18
|
+
response = post(
|
19
|
+
Flutterwave::Utils::Constants::BIN[:check_url],
|
20
|
+
request_params
|
21
|
+
)
|
22
|
+
|
23
|
+
Flutterwave::Response.new(response)
|
24
|
+
end
|
25
|
+
|
26
|
+
def encrypt(key)
|
27
|
+
plain_text = options[key].to_s
|
28
|
+
raise Flutterwave::Utils::MissingKeyError.new(
|
29
|
+
"#{key.capitalize} key required!"
|
30
|
+
) if plain_text.empty?
|
31
|
+
|
32
|
+
encrypt_data(plain_text, client.api_key)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Flutterwave
|
2
|
+
class BVN
|
3
|
+
include Flutterwave::Helpers
|
4
|
+
attr_accessor :client, :options
|
5
|
+
|
6
|
+
def initialize(client)
|
7
|
+
@client = client
|
8
|
+
end
|
9
|
+
|
10
|
+
# https://www.flutterwave.com/documentation/compliance/ - Verify (request a user enter their BVN for verification)
|
11
|
+
def verify(options = {})
|
12
|
+
@options = options
|
13
|
+
|
14
|
+
request_params = {
|
15
|
+
otpoption: encrypt(:otpoption),
|
16
|
+
bvn: encrypt(:bvn),
|
17
|
+
merchantid: client.merchant_key
|
18
|
+
}
|
19
|
+
|
20
|
+
response = post(
|
21
|
+
Flutterwave::Utils::Constants::BVN[:verify_url],
|
22
|
+
request_params
|
23
|
+
)
|
24
|
+
|
25
|
+
Flutterwave::Response.new(response)
|
26
|
+
end
|
27
|
+
|
28
|
+
# https://www.flutterwave.com/documentation/compliance/ - Resend OTP
|
29
|
+
def resend(options = {})
|
30
|
+
@options = options
|
31
|
+
|
32
|
+
request_params = {
|
33
|
+
validateoption: encrypt(:validateoption),
|
34
|
+
transactionreference: encrypt(:transactionreference),
|
35
|
+
merchantid: client.merchant_key
|
36
|
+
}
|
37
|
+
|
38
|
+
response = post(
|
39
|
+
Flutterwave::Utils::Constants::BVN[:resend_url],
|
40
|
+
request_params
|
41
|
+
)
|
42
|
+
|
43
|
+
Flutterwave::Response.new(response)
|
44
|
+
end
|
45
|
+
|
46
|
+
# https://www.flutterwave.com/documentation/compliance/ - Validate (This is used to validate the OTP entered by the user)
|
47
|
+
def validate(options = {})
|
48
|
+
@options = options
|
49
|
+
|
50
|
+
request_params = {
|
51
|
+
otp: encrypt(:otp),
|
52
|
+
transactionreference: encrypt(:transactionreference),
|
53
|
+
bvn: encrypt(:bvn),
|
54
|
+
merchantid: client.merchant_key
|
55
|
+
}
|
56
|
+
|
57
|
+
response = post(
|
58
|
+
Flutterwave::Utils::Constants::BVN[:validate_url],
|
59
|
+
request_params
|
60
|
+
)
|
61
|
+
|
62
|
+
Flutterwave::Response.new(response)
|
63
|
+
end
|
64
|
+
|
65
|
+
def encrypt(key)
|
66
|
+
plain_text = options[key].to_s
|
67
|
+
raise Flutterwave::Utils::MissingKeyError.new(
|
68
|
+
"#{key.capitalize} key required!"
|
69
|
+
) if plain_text.empty?
|
70
|
+
|
71
|
+
encrypt_data(plain_text, client.api_key)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
require 'flutterwave/response'
|
2
|
+
|
3
|
+
module Flutterwave
|
4
|
+
class Card
|
5
|
+
include Flutterwave::Helpers
|
6
|
+
attr_accessor :client, :options
|
7
|
+
|
8
|
+
def initialize(client)
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
# https://www.flutterwave.com/documentation/card-payments-with-preauth/#tokenize
|
13
|
+
def tokenize(options = {})
|
14
|
+
@options = options
|
15
|
+
options[:country] ||= 'NG'
|
16
|
+
|
17
|
+
request_params = {
|
18
|
+
validateoption: encrypt(:validateoption),
|
19
|
+
authmodel: encrypt(:authmodel),
|
20
|
+
cardno: encrypt(:cardno),
|
21
|
+
cvv: encrypt(:cvv),
|
22
|
+
country: encrypt(:country),
|
23
|
+
expirymonth: encrypt(:expirymonth),
|
24
|
+
expiryyear: encrypt(:expiryyear),
|
25
|
+
merchantid: client.merchant_key
|
26
|
+
}
|
27
|
+
|
28
|
+
request_params[:bvn] = encrypt(:bvn) if options[:authmodel] == 'BVN'
|
29
|
+
|
30
|
+
response = post(
|
31
|
+
Flutterwave::Utils::Constants::CARD[:tokenize_url],
|
32
|
+
request_params
|
33
|
+
)
|
34
|
+
|
35
|
+
Flutterwave::Response.new(response)
|
36
|
+
end
|
37
|
+
|
38
|
+
# https://www.flutterwave.com/documentation/card-payments-with-preauth/#preauthorize
|
39
|
+
def preauthorize(options = {})
|
40
|
+
@options = options
|
41
|
+
options[:country] ||= 'NG'
|
42
|
+
|
43
|
+
request_params = {
|
44
|
+
amount: encrypt(:amount),
|
45
|
+
currency: encrypt(:currency),
|
46
|
+
chargetoken: encrypt(:chargetoken),
|
47
|
+
country: encrypt(:country),
|
48
|
+
merchantid: client.merchant_key
|
49
|
+
}
|
50
|
+
|
51
|
+
response = post(
|
52
|
+
Flutterwave::Utils::Constants::CARD[:preauthorize_url],
|
53
|
+
request_params
|
54
|
+
)
|
55
|
+
|
56
|
+
Flutterwave::Response.new(response)
|
57
|
+
end
|
58
|
+
|
59
|
+
# https://www.flutterwave.com/documentation/card-payments-with-preauth/#capture
|
60
|
+
def capture(options = {})
|
61
|
+
@options = options
|
62
|
+
options[:country] ||= 'NG'
|
63
|
+
|
64
|
+
request_params = {
|
65
|
+
amount: encrypt(:amount),
|
66
|
+
currency: encrypt(:currency),
|
67
|
+
country: encrypt(:country),
|
68
|
+
trxreference: encrypt(:trxreference),
|
69
|
+
trxauthorizeid: encrypt(:trxauthorizeid),
|
70
|
+
chargetoken: encrypt(:chargetoken),
|
71
|
+
merchantid: client.merchant_key
|
72
|
+
}
|
73
|
+
|
74
|
+
response = post(
|
75
|
+
Flutterwave::Utils::Constants::CARD[:capture_url],
|
76
|
+
request_params
|
77
|
+
)
|
78
|
+
|
79
|
+
Flutterwave::Response.new(response)
|
80
|
+
end
|
81
|
+
|
82
|
+
# https://www.flutterwave.com/documentation/card-payments-with-preauth/#refund
|
83
|
+
def refund(options = {})
|
84
|
+
@options = options
|
85
|
+
options[:country] ||= 'NG'
|
86
|
+
|
87
|
+
request_params = {
|
88
|
+
amount: encrypt(:amount),
|
89
|
+
currency: encrypt(:currency),
|
90
|
+
country: encrypt(:country),
|
91
|
+
trxreference: encrypt(:trxreference),
|
92
|
+
trxauthorizeid: encrypt(:trxauthorizeid),
|
93
|
+
merchantid: client.merchant_key
|
94
|
+
}
|
95
|
+
|
96
|
+
response = post(
|
97
|
+
Flutterwave::Utils::Constants::CARD[:refund_url],
|
98
|
+
request_params
|
99
|
+
)
|
100
|
+
|
101
|
+
Flutterwave::Response.new(response)
|
102
|
+
end
|
103
|
+
|
104
|
+
# https://www.flutterwave.com/documentation/card-payments-with-preauth/#void
|
105
|
+
def void(options = {})
|
106
|
+
@options = options
|
107
|
+
options[:country] ||= 'NG'
|
108
|
+
|
109
|
+
request_params = {
|
110
|
+
amount: encrypt(:amount),
|
111
|
+
currency: encrypt(:currency),
|
112
|
+
country: encrypt(:country),
|
113
|
+
trxreference: encrypt(:trxreference),
|
114
|
+
trxauthorizeid: encrypt(:trxauthorizeid),
|
115
|
+
merchantid: client.merchant_key
|
116
|
+
}
|
117
|
+
|
118
|
+
response = post(
|
119
|
+
Flutterwave::Utils::Constants::CARD[:void_url],
|
120
|
+
request_params
|
121
|
+
)
|
122
|
+
|
123
|
+
Flutterwave::Response.new(response)
|
124
|
+
end
|
125
|
+
|
126
|
+
# https://www.flutterwave.com/documentation/card-enquiry/ - Card Enquiry
|
127
|
+
def enquiry(options = {})
|
128
|
+
@options = options
|
129
|
+
|
130
|
+
request_params = {
|
131
|
+
cardno: encrypt(:cardno),
|
132
|
+
cvv: encrypt(:cvv),
|
133
|
+
expirymonth: encrypt(:expirymonth),
|
134
|
+
expiryyear: encrypt(:expiryyear),
|
135
|
+
pin: encrypt(:pin),
|
136
|
+
trxreference: encrypt(:trxreference),
|
137
|
+
merchantid: client.merchant_key
|
138
|
+
}
|
139
|
+
|
140
|
+
response = post(
|
141
|
+
Flutterwave::Utils::Constants::CARD[:enquiry_url],
|
142
|
+
request_params
|
143
|
+
)
|
144
|
+
|
145
|
+
Flutterwave::Response.new(response)
|
146
|
+
end
|
147
|
+
|
148
|
+
# https://www.flutterwave.com/documentation/card-enquiry/ - Validate
|
149
|
+
def validate_enquiry(options = {})
|
150
|
+
@options = options
|
151
|
+
|
152
|
+
request_params = {
|
153
|
+
otp: encrypt(:otp),
|
154
|
+
otptransactionidentifier: encrypt(:otptransactionidentifier),
|
155
|
+
trxreference: encrypt(:trxreference),
|
156
|
+
merchantid: client.merchant_key
|
157
|
+
}
|
158
|
+
|
159
|
+
response = post(
|
160
|
+
Flutterwave::Utils::Constants::CARD[:validate_enquiry_url],
|
161
|
+
request_params
|
162
|
+
)
|
163
|
+
|
164
|
+
Flutterwave::Response.new(response)
|
165
|
+
end
|
166
|
+
|
167
|
+
# https://www.flutterwave.com/documentation/card-payments/#tokenize-and-charge
|
168
|
+
def charge(options = {})
|
169
|
+
@options = options
|
170
|
+
options[:country] ||= 'NG'
|
171
|
+
|
172
|
+
request_params = {
|
173
|
+
amount: encrypt(:amount),
|
174
|
+
authmodel: encrypt(:authmodel),
|
175
|
+
cardno: encrypt(:cardno),
|
176
|
+
currency: encrypt(:currency),
|
177
|
+
custid: encrypt(:custid),
|
178
|
+
country: encrypt(:country),
|
179
|
+
cvv: encrypt(:cvv),
|
180
|
+
expirymonth: encrypt(:expirymonth),
|
181
|
+
expiryyear: encrypt(:expiryyear),
|
182
|
+
narration: encrypt(:narration),
|
183
|
+
merchantid: client.merchant_key
|
184
|
+
}
|
185
|
+
|
186
|
+
request_params[:pin] = encrypt(:pin) if options[:authmodel] == 'PIN'
|
187
|
+
|
188
|
+
request_params[:bvn] = encrypt(:bvn) if options[:authmodel] == 'BVN'
|
189
|
+
|
190
|
+
request_params[:responseurl] = encrypt(:responseurl) if
|
191
|
+
options[:authmodel] == 'VBVSECURECODE'
|
192
|
+
|
193
|
+
request_params[:cardtype] = encrypt(:cardtype) if options[:cardtype]
|
194
|
+
|
195
|
+
response = post(
|
196
|
+
Flutterwave::Utils::Constants::CARD[:charge_url],
|
197
|
+
request_params
|
198
|
+
)
|
199
|
+
|
200
|
+
Flutterwave::Response.new(response)
|
201
|
+
end
|
202
|
+
|
203
|
+
# https://www.flutterwave.com/documentation/card-payments/#validate
|
204
|
+
def validate_charge(options = {})
|
205
|
+
@options = options
|
206
|
+
|
207
|
+
request_params = {
|
208
|
+
otp: encrypt(:otp),
|
209
|
+
otptransactionidentifier: encrypt(:otptransactionidentifier),
|
210
|
+
merchantid: client.merchant_key
|
211
|
+
}
|
212
|
+
|
213
|
+
response = post(
|
214
|
+
Flutterwave::Utils::Constants::CARD[:validate_charge_url],
|
215
|
+
request_params
|
216
|
+
)
|
217
|
+
|
218
|
+
Flutterwave::Response.new(response)
|
219
|
+
end
|
220
|
+
|
221
|
+
# https://www.flutterwave.com/documentation/card-payments/#recurrent-charge
|
222
|
+
def recurrent_charge(options = {})
|
223
|
+
@options = options
|
224
|
+
options[:country] ||= 'NG'
|
225
|
+
|
226
|
+
request_params = {
|
227
|
+
amount: encrypt(:amount),
|
228
|
+
currency: encrypt(:currency),
|
229
|
+
custid: encrypt(:custid),
|
230
|
+
country: encrypt(:country),
|
231
|
+
narration: encrypt(:narration),
|
232
|
+
chargetoken: encrypt(:chargetoken),
|
233
|
+
merchantid: client.merchant_key
|
234
|
+
}
|
235
|
+
|
236
|
+
request_params[:cardtype] = encrypt(:cardtype) if options[:cardtype]
|
237
|
+
|
238
|
+
response = post(
|
239
|
+
Flutterwave::Utils::Constants::CARD[:charge_url],
|
240
|
+
request_params
|
241
|
+
)
|
242
|
+
|
243
|
+
Flutterwave::Response.new(response)
|
244
|
+
end
|
245
|
+
|
246
|
+
# https://www.flutterwave.com/documentation/check-transaction-status/
|
247
|
+
def verify(options = {})
|
248
|
+
@options = options
|
249
|
+
|
250
|
+
request_params = {
|
251
|
+
trxreference: encrypt(:trxreference),
|
252
|
+
merchantid: client.merchant_key
|
253
|
+
}
|
254
|
+
|
255
|
+
response = post(
|
256
|
+
Flutterwave::Utils::Constants::CARD[:verify_url],
|
257
|
+
request_params
|
258
|
+
)
|
259
|
+
|
260
|
+
Flutterwave::Response.new(response)
|
261
|
+
end
|
262
|
+
|
263
|
+
def encrypt(key)
|
264
|
+
plain_text = options[key].to_s
|
265
|
+
raise Flutterwave::Utils::MissingKeyError.new(
|
266
|
+
"#{key.capitalize} key required!"
|
267
|
+
) if plain_text.empty?
|
268
|
+
|
269
|
+
encrypt_data(plain_text, client.api_key)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'flutterwave/utils/helpers'
|
2
|
+
require 'flutterwave/utils/missing_key_error'
|
3
|
+
require 'flutterwave/bvn'
|
4
|
+
require 'flutterwave/bin'
|
5
|
+
require 'flutterwave/ip'
|
6
|
+
require 'flutterwave/bank'
|
7
|
+
require 'flutterwave/card'
|
8
|
+
require 'flutterwave/account'
|
9
|
+
require 'flutterwave/ach'
|
10
|
+
require 'flutterwave/pay'
|
11
|
+
|
12
|
+
module Flutterwave
|
13
|
+
class Client
|
14
|
+
attr_accessor :merchant_key, :api_key, :bvn, :bin, :ip, :bank,
|
15
|
+
:card, :account, :ach, :pay
|
16
|
+
|
17
|
+
def initialize(merchant_key, api_key)
|
18
|
+
@merchant_key = merchant_key
|
19
|
+
@api_key = api_key
|
20
|
+
|
21
|
+
@bvn = Flutterwave::BVN.new(self)
|
22
|
+
@bin = Flutterwave::BIN.new(self)
|
23
|
+
@ip = Flutterwave::IP.new(self)
|
24
|
+
@bank = Flutterwave::BankAPI.new(self)
|
25
|
+
@card = Flutterwave::Card.new(self)
|
26
|
+
@account = Flutterwave::Account.new(self)
|
27
|
+
@ach = Flutterwave::ACH.new(self)
|
28
|
+
@pay = Flutterwave::Pay.new(self)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|