paystack 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a22c58ec712f84b5c59aa43d00230bda7da22145
4
- data.tar.gz: 5c4d10c1e8996380371eef9d43fa56041fb19b55
3
+ metadata.gz: 2bfffac1071ccab650bec0e73af7b5caf8ff6f57
4
+ data.tar.gz: 5c8125e3f70f8321fc66c5d5adeb758c8cad6368
5
5
  SHA512:
6
- metadata.gz: 9d00658143c04a14ae00a049f241ab268dfe06935a0bc571776c08074cc8a7401afbb39e5ab7f2b09601fe7cd33d16752fce67d08de1aca360bc25f55a1d442d
7
- data.tar.gz: f6e94b694b8a998e10c85c960ad94dcf9116507cb2af8a9cb780589f159fb319a8864bfc8d674991f82bf1f2d5173bf2241eb61049742db40fd03a55eed9bd7d
6
+ metadata.gz: 7d2e673cb05a9bd987450e392138af759619b9e855b56c419d9672bb9855ac5b1dc56af7ff99c877c4ced46c45b38021d2da81ed7ad1c124a00e125e2ebbdd71
7
+ data.tar.gz: de3ec225ab575e393e03739a916c1b6ed5d32d1d2cebfb9f24f4f30dfba489c0f798ca8004c6604c469befcd8ed5c5630e233b681e7d25da135578103491ad1a
data/README.md CHANGED
@@ -1,11 +1,8 @@
1
1
  # Paystack
2
2
 
3
3
 
4
- A ruby gem for easy integration of Paystack with your Ruby / Rails application.
4
+ A ruby gem for easy integration of [Paystack](https://paystack.co/).
5
5
 
6
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/paystack`. To experiment with that code, run `bin/console` for an interactive prompt.
7
-
8
- TODO: Delete this and the text above, and describe your gem
9
6
 
10
7
  ## Installation
11
8
 
@@ -23,25 +20,30 @@ Or install it yourself as:
23
20
 
24
21
  $ gem install paystack
25
22
 
26
- ## Usage
23
+ ## Basic Usage
27
24
 
28
- ### 1. Instantiate Paystack Object
29
25
 
30
- paystack = Paystack.new(public_key, secret_key)
31
26
 
32
- A more secure way is to set your public and private keys as environmental variables `PAYSTACK_PUBLIC_KEY` and `PAYSTACK_PRIVATE_KEY` respectively. Then you instantiate without parameters
27
+ ### Instantiate Paystack Object
33
28
 
34
29
  ```ruby
35
30
 
36
- paystack = Paystack.new
31
+ paystackObj = Paystack.new(public_key, secret_key)
37
32
 
38
33
  ```
39
34
 
40
- Methods available in the Paystack class include
35
+ A secure way is to set your public and private keys as environmental variables `PAYSTACK_PUBLIC_KEY` and `PAYSTACK_PRIVATE_KEY` respectively. Then you instantiate without parameters
36
+
37
+ ```ruby
41
38
 
39
+ paystackObj = Paystack.new
42
40
 
41
+ ```
42
+ It throws a `PaystackBadKeyError` when either of the keys are invalid or cannot be found as environment variables.
43
43
 
44
- ### 2. Instantiate a Card object
44
+
45
+
46
+ ### Instantiate a Card object
45
47
 
46
48
  ```ruby
47
49
  card = new PaystackCard(
@@ -50,16 +52,213 @@ Methods available in the Paystack class include
50
52
  :expiryMonth => "07",
51
53
  :expiryYear => "19"
52
54
  )
55
+
56
+ isvalid = card.isValidCard
57
+ ```
58
+ The `isValidCard` method determines validity of the card i.e. Expiry status, Luhn checksum validity etc.
59
+ All card values/fields should be String literals.
60
+
61
+
62
+
63
+ ### Initialize transaction and get Authorization URL
64
+
65
+ ```ruby
66
+
67
+ transactions = PaystackTransactions.new(paystackObj)
68
+ result = transactions.initializeTransaction(
69
+ :reference => "blablablabla-YOUR-UNIQUE-REFERENCE-HERE",
70
+ :amount => 300000,
71
+ :email => "xxxxxx@gmail.com",
72
+ )
73
+ auth_url = results['data']['authorization_url']
74
+ ```
75
+ NOTE: Amount is in kobo i.e. `100000 = 100000 kobo = 1000 naira`
76
+
77
+
78
+
79
+ ### Charge using Authorization code for returning customers
80
+
81
+ ```ruby
82
+
83
+ result = transactions.chargeAuthorization(
84
+ "WwdkojpoAJo", # Authorization code
85
+ "xxxxxx@gmail.com", # Customer email
86
+ 2000000, # Amount
87
+ :reference => "blablablabla-YOUR-UNIQUE-REFERENCE-HERE"
88
+ )
89
+ ```
90
+
91
+
92
+
93
+ ## Transactions
94
+
95
+
96
+
97
+ ### List transactions
98
+
99
+ ```ruby
100
+
101
+ page_number = 1
102
+ transactions = PaystackTransactions.new(paystackObj)
103
+ result = transactions.list(page_number) #Optional `page_number` parameter
104
+
105
+ ```
106
+
107
+ ### Get a transaction
108
+
109
+ ```ruby
110
+
111
+ transaction_id = ""123456778""
112
+ transactions = PaystackTransactions.new(paystackObj)
113
+ result = transactions.get(transaction_id)
114
+
115
+ ```
116
+
117
+ ### Verify a transaction
118
+
119
+ ```ruby
120
+
121
+ transaction_reference = "blablablabla-YOUR-VALID-UNIQUE-REFERENCE-HERE"
122
+ transactions = PaystackTransactions.new(paystackObj)
123
+ result = transactions.verify(transaction_reference)
124
+
125
+ ```
126
+
127
+
128
+ ### Get transaction totals
129
+
130
+ ```ruby
131
+
132
+ transactions = PaystackTransactions.new(paystackObj)
133
+ result = transactions.totals()
134
+
53
135
  ```
54
136
 
55
137
 
138
+ ## Customers
56
139
 
57
140
 
58
- ## Development
141
+ ### List Customers
142
+
143
+ ```ruby
144
+
145
+ page_number = 1
146
+ customers = PaystackCustomers.new(paystackObj)
147
+ result = customers.list(page_number) #Optional `page_number` parameter, 50 items per page
148
+ customers_list = result['data']
149
+
150
+ ```
151
+
152
+ ### Get a customer
153
+
154
+ ```ruby
155
+
156
+ customer_id = "123456778"
157
+ customers = PaystackCustomers.new(paystackObj)
158
+ result = customers.get(customer_id)
159
+ customer = result['data']
160
+
161
+ ```
162
+
163
+ ### Create new customer
164
+
165
+ ```ruby
166
+
167
+ customers = PaystackCustomers.new(paystackObj)
168
+ result = customers.create(
169
+ :first_name => "Victor",
170
+ :last_name => "Ikoro",
171
+ :phone => "+234707666669"
172
+ :email => "xxxxx@gmail.com"
173
+ )
174
+
175
+ ```
176
+
177
+ ### Update customer details
178
+
179
+ ```ruby
180
+
181
+ customer_id = "123456778"
182
+ customers = PaystackCustomers.new(paystackObj)
183
+ # Updating last name and email of customer
184
+ result = customers.update(
185
+ customer_id,
186
+ :last_name => "Ikorodu",
187
+ :email => "xxxxx-modified@gmail.com"
188
+ )
189
+
190
+ ```
191
+
192
+ ## Plans
193
+
194
+ ### List Plans
195
+
196
+ ```ruby
197
+
198
+ page_number = 1
199
+ plans = PaystackPlans.new(paystackObj)
200
+ result = plans.list(page_number) #Optional `page_number` parameter, 50 items per page
201
+ plans_list = result['data']
202
+
203
+ ```
204
+
205
+ ### Get plan detail
206
+
207
+ ```ruby
208
+
209
+ plan_id = "123456778"
210
+ plans = PaystackPlans.new(paystackObj)
211
+ result = plans.get(plan_id)
212
+ plan = result['data']
213
+
214
+ ```
215
+
216
+ ### Create new plan
217
+
218
+ ```ruby
219
+
220
+ plans = PaystackPlans.new(paystackObj)
221
+ result = plans.create(
222
+
223
+ :name => "Test Plan",
224
+ :description => "Dev Test Plan",
225
+ :amount => 30000, #in KOBO
226
+ :interval => "monthly", #monthly, yearly, quarterly, weekly etc
227
+ :currency => "NGN"
228
+ )
229
+
230
+ ```
231
+
232
+ ### Update plan details
233
+
234
+ ```ruby
235
+
236
+ plan_id = ""123456778""
237
+ plans = PaystackPlans.new(paystackObj)
238
+ result = plans.update(
239
+ plan_id,
240
+ :name => "Test Plan Updated",
241
+ :amount => 500000, #in KOBO
242
+ :interval => "weekly"
243
+ )
244
+
245
+ ```
246
+
247
+
248
+ ## Static methods
249
+ `PaystackTransactions`, `PaystackCustomers` and `PaystackPlans` methods can be called statically, You just need to pass the paystack object as the first parameter e.g. `verify` method in `PaystackTransactions` can be called like this
250
+
251
+
252
+ ```ruby
253
+
254
+ transaction_reference = "blablablabla-YOUR-VALID-UNIQUE-REFERENCE-HERE"
255
+ result = PaystackTransactions.verify(paystackObj, transaction_reference)
256
+ puts result['message']
257
+
258
+ ```
259
+
59
260
 
60
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
61
261
 
62
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
63
262
 
64
263
  ## Contributing
65
264
 
@@ -1,8 +1,7 @@
1
1
  require 'rest-client'
2
- require 'paystack/modules/tokenmanager.rb'
3
2
  require 'paystack/error.rb'
3
+ require 'paystack/modules/api.rb'
4
4
  require 'paystack/utils/utils.rb'
5
-
6
5
  require 'paystack/objects/card.rb'
7
6
  require 'paystack/objects/customers.rb'
8
7
  require 'paystack/objects/plans.rb'
@@ -43,9 +42,6 @@ class Paystack
43
42
 
44
43
  end
45
44
 
46
- def getToken card
47
- return TokenManager.create(card, @public_key)
48
- end
49
45
 
50
46
  def setPublicKey public_key
51
47
  @public_key = public_key
@@ -55,30 +51,4 @@ class Paystack
55
51
  @public_key = public_key
56
52
  end
57
53
 
58
- # def chargeToken(token, amount,args = {})
59
- # token = token;
60
- # amount = amount
61
- # email = args[:email]
62
- # reference = args[:reference]
63
- # result = nil;
64
- #
65
- # begin
66
- # response = RestClient.post "#{API::BASE_URL}#{API::TRANSACTION_PATH}/charge_token", {:token => token, :amount => amount, :email => email, :reference => reference}.to_json, :Authorization => "Bearer #{@private_key}", :content_type => :json, :accept => :json
67
- # unless (response.code == 200 || response.code == 201)
68
- # raise PaystackServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
69
- # end
70
- # result = JSON.parse(response.body)
71
- # unless(result['status'] != 0 )
72
- # raise PaystackServerError.new(response), "Server Message: #{result['message']}"
73
- # end
74
- #
75
- # rescue JSON::ParserError => jsonerr
76
- # raise PaystackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
77
- #
78
- # rescue PaystackServerError => e
79
- # Utils.serverErrorHandler(e)
80
- # end
81
- # return result
82
- # end
83
-
84
54
  end
@@ -26,7 +26,7 @@ class PaystackBaseObject
26
26
  rescue JSON::ParserError => jsonerr
27
27
  raise PaystackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
28
28
 
29
- rescue PayStackServerError => e
29
+ rescue PaystackServerError => e
30
30
  Utils.serverErrorHandler(e)
31
31
  end
32
32
  return result
@@ -52,7 +52,7 @@ class PaystackBaseObject
52
52
  rescue JSON::ParserError => jsonerr
53
53
  raise PaystackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
54
54
 
55
- rescue PayStackServerError => e
55
+ rescue PaystackServerError => e
56
56
  Utils.serverErrorHandler(e)
57
57
  end
58
58
  return result
@@ -73,7 +73,7 @@ class PaystackBaseObject
73
73
  rescue JSON::ParserError => jsonerr
74
74
  raise PaystackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
75
75
 
76
- rescue PayStackServerError => e
76
+ rescue PaystackServerError => e
77
77
  Utils.serverErrorHandler(e)
78
78
  end
79
79
  return result
@@ -94,7 +94,7 @@ class PaystackBaseObject
94
94
  rescue JSON::ParserError => jsonerr
95
95
  raise PaystackServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
96
96
 
97
- rescue PayStackServerError => e
97
+ rescue PaystackServerError => e
98
98
  Utils.serverErrorHandler(e)
99
99
  end
100
100
  return result
@@ -71,7 +71,7 @@ class PaystackCard
71
71
  end
72
72
  formatted_number = @number.gsub(/\s+|-/) {|s| '' }.strip
73
73
 
74
- if(Utils.isEmpty(formatted_number) || !Utils.isWholePositiveNumber(formatted_number) || !Utils.isLuthValidNumber(formatted_number))
74
+ if(Utils.isEmpty(formatted_number) || !Utils.isWholePositiveNumber(formatted_number) || !Utils.isLuhnValidNumber(formatted_number))
75
75
 
76
76
  return false
77
77
  end
@@ -22,9 +22,6 @@ class PaystackTransactions < PaystackBaseObject
22
22
  return PaystackTransactions.totals(@paystack, page)
23
23
  end
24
24
 
25
- def chargeToken(token, amount,args = {})
26
- return PaystackTransactions.chargeToken(@paystack,token, amount, args)
27
- end
28
25
 
29
26
  def chargeAuthorization(authorization_code, email, amount,args = {})
30
27
  return PaystackTransactions.chargeAuthorization(@paystack,authorization_code,email, amount, args)
@@ -56,10 +53,6 @@ class PaystackTransactions < PaystackBaseObject
56
53
  initGetRequest(paystackObj, "#{API::TRANSACTION_PATH}/totals?page=#{page}")
57
54
  end
58
55
 
59
- def PaystackTransactions.chargeToken(paystackObj,token, amount,args = {})
60
- hash = {:token => token, :amount => amount}.merge(args)
61
- initPostRequest(paystackObj,"#{API::TRANSACTION_PATH}/charge_token", hash, true)
62
- end
63
56
  def PaystackTransactions.chargeAuthorization(paystackObj,authorization_code,email, amount,args = {})
64
57
  hash = {:authorization_code => authorization_code, :amount => amount, :email => email}.merge(args)
65
58
  initPostRequest(paystackObj,"#{API::TRANSACTION_PATH}/charge_authorization", hash, true)
@@ -30,7 +30,7 @@ module Utils
30
30
  return true
31
31
  end
32
32
 
33
- def Utils.isLuthValidNumber(number)
33
+ def Utils.isLuhnValidNumber(number)
34
34
  sum = 0
35
35
  length = number.strip.length;
36
36
 
@@ -1,3 +1,3 @@
1
1
  module Paystack
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  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.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-10 00:00:00.000000000 Z
11
+ date: 2016-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,8 +86,6 @@ files:
86
86
  - lib/paystack.rb
87
87
  - lib/paystack/error.rb
88
88
  - lib/paystack/modules/api.rb
89
- - lib/paystack/modules/crypto.rb
90
- - lib/paystack/modules/tokenmanager.rb
91
89
  - lib/paystack/objects/base.rb
92
90
  - lib/paystack/objects/card.rb
93
91
  - lib/paystack/objects/customers.rb
@@ -1,11 +0,0 @@
1
- require "Base64"
2
- require "openssl"
3
-
4
- module Crypto
5
-
6
- def Crypto.encrypt_string(message, public_key)
7
-
8
- rsa = OpenSSL::PKey::RSA.new public_key
9
- return Base64::encode64(rsa.public_encrypt(message)).rstrip
10
- end
11
- end
@@ -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
-