paystack 0.1.3 → 0.1.10
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 +5 -5
- data/.gitignore +1 -0
- data/.rspec +2 -2
- data/.travis.yml +16 -0
- data/README.md +475 -20
- data/Rakefile +1 -2
- data/bin/console +0 -0
- data/bin/setup +0 -0
- data/lib/paystack.rb +58 -84
- data/lib/paystack/error.rb +11 -12
- data/lib/paystack/modules/api.rb +14 -7
- data/lib/paystack/objects/balance.rb +12 -0
- data/lib/paystack/objects/banks.rb +12 -0
- data/lib/paystack/objects/base.rb +103 -102
- data/lib/paystack/objects/card.rb +105 -105
- data/lib/paystack/objects/customers.rb +37 -37
- data/lib/paystack/objects/plans.rb +39 -41
- data/lib/paystack/objects/recipients.rb +26 -0
- data/lib/paystack/objects/settlements.rb +12 -0
- data/lib/paystack/objects/subaccounts.rb +37 -0
- data/lib/paystack/objects/subscriptions.rb +40 -0
- data/lib/paystack/objects/transactions.rb +63 -70
- data/lib/paystack/objects/transfers.rb +75 -0
- data/lib/paystack/utils/utils.rb +104 -105
- data/lib/paystack/version.rb +2 -2
- data/paystack.gemspec +8 -6
- metadata +19 -15
- data/key.pem +0 -0
- data/lib/paystack/modules/crypto.rb +0 -11
- data/lib/paystack/modules/tokenmanager.rb +0 -60
data/lib/paystack/utils/utils.rb
CHANGED
@@ -1,105 +1,104 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
t
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
year_int
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
1
|
+
require 'paystack/error.rb'
|
2
|
+
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
def Utils.nullifyString(value)
|
6
|
+
if value.nil?
|
7
|
+
return nil
|
8
|
+
end
|
9
|
+
|
10
|
+
if (value.strip.eql? "")
|
11
|
+
return nil
|
12
|
+
end
|
13
|
+
return value;
|
14
|
+
end
|
15
|
+
|
16
|
+
def Utils.isWholePositiveNumber(value)
|
17
|
+
if(value == nil)
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
length = value.length;
|
21
|
+
|
22
|
+
for i in 0..(length-1)
|
23
|
+
c = value[i]
|
24
|
+
|
25
|
+
if((c =~ /[[:digit:]]/) == nil)
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return true
|
30
|
+
end
|
31
|
+
|
32
|
+
def Utils.isLuhnValidNumber(number)
|
33
|
+
sum = 0
|
34
|
+
length = number.strip.length;
|
35
|
+
|
36
|
+
for i in 0..(length-1)
|
37
|
+
c = number[length - 1 -i]
|
38
|
+
|
39
|
+
if((c =~ /[[:digit:]]/) == nil)
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
digit = c.to_i
|
43
|
+
if (i % 2 == 1)
|
44
|
+
digit *= 2
|
45
|
+
end
|
46
|
+
sum += digit > 9 ? digit - 9 : digit
|
47
|
+
end
|
48
|
+
|
49
|
+
return (sum % 10 == 0)
|
50
|
+
end
|
51
|
+
|
52
|
+
def Utils.isEmpty(value)
|
53
|
+
return (value.nil? || value.strip.eql?(""))
|
54
|
+
end
|
55
|
+
|
56
|
+
def Utils.hasYearPassed(year)
|
57
|
+
return year < Time.new.year
|
58
|
+
end
|
59
|
+
def Utils.hasMonthPassed(year, month)
|
60
|
+
t = Time.new
|
61
|
+
return hasYearPassed(year) || year == t.year && month < (t.month)
|
62
|
+
end
|
63
|
+
|
64
|
+
def Utils.hasCardExpired(year, month)
|
65
|
+
# Normalize Year value e.g 14 becomes 2014 or 2114 etc.
|
66
|
+
year_int = year.strip.to_i
|
67
|
+
if(year_int < 100 && year_int >= 0)
|
68
|
+
cal_year = Time.new.year.to_s
|
69
|
+
year_int = ("#{cal_year[0..1]}#{year.strip}").to_i
|
70
|
+
end
|
71
|
+
|
72
|
+
# Check for expiration
|
73
|
+
return !hasYearPassed(year_int) && !hasMonthPassed(year_int, month.to_i)
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
def Utils.serverErrorHandler(e)
|
82
|
+
|
83
|
+
if(e.response == nil)
|
84
|
+
raise e
|
85
|
+
return
|
86
|
+
end
|
87
|
+
error = PaystackServerError.new(e.response);
|
88
|
+
case e.response.code
|
89
|
+
when 400
|
90
|
+
raise error, "HTTP Code 400: A validation or client side error occurred and the request was not fulfilled. "
|
91
|
+
when 401
|
92
|
+
raise error, "HTTP Code 401: The request was not authorized. This can be triggered by passing an invalid secret key in the authorization header or the lack of one"
|
93
|
+
when 404
|
94
|
+
raise error, "HTTP Code 404: Request could not be fulfilled as the request resource does not exist."
|
95
|
+
when 500, 501,502,503,504
|
96
|
+
raise error, "HTTP Code #{e.response.code}: Request could not be fulfilled due to an error on Paystack's end. This shouldn't happen so please report as soon as you encounter any instance of this."
|
97
|
+
else
|
98
|
+
raise error, "HTTP Code #{e.response.code}: #{e.response.body}"
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
data/lib/paystack/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.1.
|
1
|
+
class Paystack
|
2
|
+
VERSION = "0.1.10"
|
3
3
|
end
|
data/paystack.gemspec
CHANGED
@@ -6,7 +6,7 @@ require 'paystack/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "paystack"
|
8
8
|
spec.version = Paystack::VERSION
|
9
|
-
spec.authors = ["Victor"]
|
9
|
+
spec.authors = ["Victor Ikoro"]
|
10
10
|
spec.email = ["ikoro.victor@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{PayStack.co gem for Ruby/Rails}
|
@@ -20,11 +20,13 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
22
|
#Dev dependencies
|
23
|
-
spec.add_development_dependency "bundler", "~>
|
23
|
+
spec.add_development_dependency "bundler", "~> 2.2"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
-
spec.add_development_dependency
|
26
|
-
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
26
|
+
|
27
27
|
#Dependencies
|
28
|
-
spec.
|
29
|
-
|
28
|
+
spec.required_ruby_version = '>= 2.0.0'
|
29
|
+
spec.add_runtime_dependency 'rest-client', '~> 2.0'
|
30
|
+
|
31
|
+
|
30
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paystack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Victor
|
7
|
+
- Victor Ikoro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.2'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,28 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '3.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rest-client
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '2.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '2.0'
|
69
69
|
description: Client Library Gem for PayStack.co
|
70
70
|
email:
|
71
71
|
- ikoro.victor@gmail.com
|
@@ -75,6 +75,7 @@ extra_rdoc_files: []
|
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
77
|
- ".rspec"
|
78
|
+
- ".travis.yml"
|
78
79
|
- CODE_OF_CONDUCT.md
|
79
80
|
- Gemfile
|
80
81
|
- LICENSE.txt
|
@@ -82,17 +83,21 @@ files:
|
|
82
83
|
- Rakefile
|
83
84
|
- bin/console
|
84
85
|
- bin/setup
|
85
|
-
- key.pem
|
86
86
|
- lib/paystack.rb
|
87
87
|
- lib/paystack/error.rb
|
88
88
|
- lib/paystack/modules/api.rb
|
89
|
-
- lib/paystack/
|
90
|
-
- lib/paystack/
|
89
|
+
- lib/paystack/objects/balance.rb
|
90
|
+
- lib/paystack/objects/banks.rb
|
91
91
|
- lib/paystack/objects/base.rb
|
92
92
|
- lib/paystack/objects/card.rb
|
93
93
|
- lib/paystack/objects/customers.rb
|
94
94
|
- lib/paystack/objects/plans.rb
|
95
|
+
- lib/paystack/objects/recipients.rb
|
96
|
+
- lib/paystack/objects/settlements.rb
|
97
|
+
- lib/paystack/objects/subaccounts.rb
|
98
|
+
- lib/paystack/objects/subscriptions.rb
|
95
99
|
- lib/paystack/objects/transactions.rb
|
100
|
+
- lib/paystack/objects/transfers.rb
|
96
101
|
- lib/paystack/utils/utils.rb
|
97
102
|
- lib/paystack/version.rb
|
98
103
|
- paystack.gemspec
|
@@ -108,15 +113,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
113
|
requirements:
|
109
114
|
- - ">="
|
110
115
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
116
|
+
version: 2.0.0
|
112
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
118
|
requirements:
|
114
119
|
- - ">="
|
115
120
|
- !ruby/object:Gem::Version
|
116
121
|
version: '0'
|
117
122
|
requirements: []
|
118
|
-
|
119
|
-
rubygems_version: 2.4.5
|
123
|
+
rubygems_version: 3.0.8
|
120
124
|
signing_key:
|
121
125
|
specification_version: 4
|
122
126
|
summary: PayStack.co gem for Ruby/Rails
|
data/key.pem
DELETED
File without changes
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'rest-client'
|
2
|
-
require 'paystack/modules/crypto.rb'
|
3
|
-
require 'paystack/modules/api.rb'
|
4
|
-
require 'paystack/objects/card.rb'
|
5
|
-
|
6
|
-
module TokenManager
|
7
|
-
|
8
|
-
CONCATENATOR = '*'
|
9
|
-
RSA_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANIsL+RHqfkBiKGn/D1y1QnNrMkKzxWP\n2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ==\n-----END PUBLIC KEY-----\n"
|
10
|
-
|
11
|
-
def TokenManager.create(card, publishableKey)
|
12
|
-
if(card == nil)
|
13
|
-
raise PayStackCardError, "Card cannot be null"
|
14
|
-
elsif !card.isValidCard()
|
15
|
-
raise PayStackCardError, "Invalid card details"
|
16
|
-
end
|
17
|
-
|
18
|
-
card_str = concatCardFields(card)
|
19
|
-
enc_card_str = Crypto.encrypt_string(card_str, RSA_PUBLIC_KEY)
|
20
|
-
return createServerToken enc_card_str, publishableKey
|
21
|
-
end
|
22
|
-
|
23
|
-
def TokenManager.concatCardFields(card)
|
24
|
-
raise PayStackCardError, 'Invalid Card' unless (!card.nil? && card.instance_of?(PaystackCard))
|
25
|
-
|
26
|
-
number = Utils.nullifyString(card.number)
|
27
|
-
cvc = card.cvc
|
28
|
-
expiryMonth = card.expiryMonth
|
29
|
-
expiryYear = card.expiryYear
|
30
|
-
|
31
|
-
raise PayStackCardError, 'Card number cannot be empty or null' unless (!number.nil?)
|
32
|
-
|
33
|
-
return "#{number}#{CONCATENATOR}#{cvc}#{CONCATENATOR}#{expiryMonth}#{CONCATENATOR}#{expiryYear}"
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def TokenManager.createServerToken(encrypted_card, publishableKey)
|
38
|
-
token = nil;
|
39
|
-
begin
|
40
|
-
response = RestClient.post "#{API::TOKEN_URL}", :clientdata => encrypted_card, :publishablekey => publishableKey
|
41
|
-
unless (response.code == 200 || response.code == 201)
|
42
|
-
raise PayStackServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
|
43
|
-
end
|
44
|
-
result = JSON.parse(response.body)
|
45
|
-
unless(result['status'] != '0' )
|
46
|
-
raise PayStackServerError.new(response), "Server Message: #{result['message']}"
|
47
|
-
end
|
48
|
-
token = {:token => result['token'], :last4 => result['last4']}
|
49
|
-
rescue JSON::ParserError => jsonerr
|
50
|
-
raise PayStackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
|
51
|
-
|
52
|
-
rescue PayStackServerError => e
|
53
|
-
puts e.response.code
|
54
|
-
Utils.serverErrorHandler(e)
|
55
|
-
end
|
56
|
-
return token
|
57
|
-
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|