rave_ruby 0.1.1

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 (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +1743 -0
  9. data/Rakefile +2 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/rave_ruby/error.rb +48 -0
  13. data/lib/rave_ruby/rave_modules/base_endpoints.rb +21 -0
  14. data/lib/rave_ruby/rave_modules/util.rb +46 -0
  15. data/lib/rave_ruby/rave_objects/account.rb +68 -0
  16. data/lib/rave_ruby/rave_objects/base/base.rb +106 -0
  17. data/lib/rave_ruby/rave_objects/base/charge_base.rb +154 -0
  18. data/lib/rave_ruby/rave_objects/base/mobile_money_base.rb +44 -0
  19. data/lib/rave_ruby/rave_objects/base/mpesa_base.rb +41 -0
  20. data/lib/rave_ruby/rave_objects/base/payment_plan_base.rb +86 -0
  21. data/lib/rave_ruby/rave_objects/base/preauth_base.rb +84 -0
  22. data/lib/rave_ruby/rave_objects/base/sub_account_base.rb +34 -0
  23. data/lib/rave_ruby/rave_objects/base/subscription_base.rb +78 -0
  24. data/lib/rave_ruby/rave_objects/base/transfer_base.rb +80 -0
  25. data/lib/rave_ruby/rave_objects/base/ussd_base.rb +60 -0
  26. data/lib/rave_ruby/rave_objects/card.rb +91 -0
  27. data/lib/rave_ruby/rave_objects/list_banks.rb +18 -0
  28. data/lib/rave_ruby/rave_objects/mobile_money.rb +58 -0
  29. data/lib/rave_ruby/rave_objects/mpesa.rb +59 -0
  30. data/lib/rave_ruby/rave_objects/payment_plan.rb +61 -0
  31. data/lib/rave_ruby/rave_objects/preauth.rb +111 -0
  32. data/lib/rave_ruby/rave_objects/sub_account.rb +55 -0
  33. data/lib/rave_ruby/rave_objects/subscription.rb +51 -0
  34. data/lib/rave_ruby/rave_objects/transactions.rb +24 -0
  35. data/lib/rave_ruby/rave_objects/transfer.rb +79 -0
  36. data/lib/rave_ruby/rave_objects/uganda_mobile_money.rb +58 -0
  37. data/lib/rave_ruby/rave_objects/ussd.rb +59 -0
  38. data/lib/rave_ruby/version.rb +3 -0
  39. data/lib/rave_ruby.rb +74 -0
  40. data/rave_ruby.gemspec +46 -0
  41. metadata +144 -0
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rave_ruby"
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,48 @@
1
+ class RaveServerError < StandardError
2
+ attr_reader :response
3
+ def initialize(response=nil)
4
+ @response = response
5
+ end
6
+ end
7
+
8
+ class RaveBadKeyError < StandardError
9
+ end
10
+
11
+ class IncompleteParameterError < StandardError
12
+ end
13
+
14
+ class SuggestedAuthError < StandardError
15
+ end
16
+
17
+ class RequiredAuthError < StandardError
18
+ end
19
+
20
+ class InitiateTransferError < StandardError
21
+ end
22
+
23
+ class CreatePaymentPlanError < StandardError
24
+ end
25
+
26
+ class ListPaymentPlanError < StandardError
27
+ end
28
+
29
+ class FetchPaymentPlanError < StandardError
30
+ end
31
+
32
+ class CancelPaymentPlanError < StandardError
33
+ end
34
+
35
+ class EditPaymentPlanError < StandardError
36
+ end
37
+
38
+ class ListSubscriptionError < StandardError
39
+ end
40
+
41
+ class FetchSubscriptionError < StandardError
42
+ end
43
+
44
+ class CancelSubscriptionError < StandardError
45
+ end
46
+
47
+ class ActivateSubscriptionError < StandardError
48
+ end
@@ -0,0 +1,21 @@
1
+ module BASE_ENDPOINTS
2
+ RAVE_LIVE_URL = "https://api.ravepay.co/"
3
+ RAVE_SANDBOX_URL = "https://ravesandboxapi.flutterwave.com/"
4
+ CHARGE_ENDPOINT = "flwv3-pug/getpaidx/api/charge"
5
+ TOKENISED_CHARGE_ENDPOINT = "flwv3-pug/getpaidx/api/tokenized/charge"
6
+ PREAUTH_CHARGE_ENDPOINT = "flwv3-pug/getpaidx/api/tokenized/preauth_charge"
7
+ CAPTURE_ENDPOINT = "flwv3-pug/getpaidx/api/capture"
8
+ REFUND_VOID_ENDPOINT = "flwv3-pug/getpaidx/api/refundorvoid"
9
+ CARD_VALIDATE_ENDPOINT = "flwv3-pug/getpaidx/api/validatecharge"
10
+ ACCOUNT_VALIDATE_ENDPOINT = "flwv3-pug/getpaidx/api/validate"
11
+ VERIFY_ENDPOINT = "flwv3-pug/getpaidx/api/v2/verify"
12
+ PAYMENT_PLANS_ENDPOINT = "v2/gpx/paymentplans"
13
+ SUBSCRIPTIONS_ENDPOINT = "v2/gpx/subscriptions"
14
+ TRANSFER_ENDPOINT = "v2/gpx/transfers"
15
+ SUBACCOUNT_ENDPOINT = "v2/gpx/subaccounts"
16
+ GET_FEE_ENDPOINT = "v2/gpx/transfers/fee"
17
+ GET_BALANCE_ENDPOINT = "v2/gpx/balance"
18
+ FETCH_ENDPOINT = "v2/gpx/transfers"
19
+ REFUND_ENDPOINT = "gpx/merchant/transactions"
20
+ BANKS_ENDPOINT = "flwv3-pug/getpaidx/api/flwpbf-banks.js"
21
+ end
@@ -0,0 +1,46 @@
1
+ require "digest"
2
+ require "openssl"
3
+ require "base64"
4
+ require 'json'
5
+ require 'securerandom'
6
+
7
+ module Util
8
+
9
+ # method to generate merchants transaction reference
10
+ def self.transaction_reference_generator
11
+ transaction_ref = "MC-" + SecureRandom.hex
12
+ return transaction_ref
13
+ end
14
+
15
+ # method for encryption algorithm
16
+ def self.encrypt(key, data)
17
+ cipher = OpenSSL::Cipher.new("des-ede3")
18
+ cipher.encrypt # Call this before setting key
19
+ cipher.key = key
20
+ data = data.to_json
21
+ ciphertext = cipher.update(data)
22
+ ciphertext << cipher.final
23
+ return Base64.encode64(ciphertext)
24
+ end
25
+
26
+ # def self.decrypt(key, ciphertext)
27
+
28
+ # cipher = OpenSSL::Cipher.new("des-ede3")
29
+ # cipher.encrypt # Call this before setting key or iv
30
+ # cipher.key = key
31
+ # cipher.decrypt
32
+ # plaintext = cipher.update(Base64.decode64(ciphertext))
33
+ # plaintext << cipher.final
34
+ # return plaintext
35
+
36
+ # end
37
+
38
+ # def checksum(payload)
39
+ # payload.sort_by { |k,v| k.to_s }
40
+ # hashed_payload = ''
41
+ # family.each { |k,v|
42
+ # hashed_payload << v
43
+ # }
44
+ # return Digest::SHA256.hexdigest(hashed_payload + self.secret_key)
45
+ # end
46
+ end
@@ -0,0 +1,68 @@
1
+ require_relative "base/charge_base.rb"
2
+ require 'json'
3
+
4
+ class Account < ChargeBase
5
+
6
+ # method to initiate the account payment
7
+
8
+ def initiate_charge(data)
9
+ base_url = rave_object.base_url
10
+ hashed_secret_key = get_hashed_key
11
+ public_key = rave_object.public_key
12
+
13
+
14
+ # only update the payload with the transaction reference if it isn't already added to the payload
15
+ if !data.key?("txRef")
16
+ data.merge!({"txRef" => Util.transaction_reference_generator})
17
+ end
18
+
19
+ data.merge!({"PBFPubKey" => public_key})
20
+
21
+ required_parameters = ["accountbank", "accountnumber", "amount", "email", "phonenumber", "IP"]
22
+ check_passed_parameters(required_parameters, data)
23
+
24
+ encrypt_data = Util.encrypt(hashed_secret_key, data)
25
+
26
+ payload = {
27
+ "PBFPubKey" => public_key,
28
+ "client" => encrypt_data,
29
+ "alg" => "3DES-24"
30
+ }
31
+
32
+ payload = payload.to_json
33
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::CHARGE_ENDPOINT}", payload)
34
+
35
+ return handle_charge_response(response)
36
+ end
37
+
38
+ def validate_charge(flwRef, otp)
39
+ base_url = rave_object.base_url
40
+ public_key = rave_object.public_key
41
+
42
+
43
+ payload = {
44
+ "PBFPubKey" => public_key,
45
+ "transactionreference" => flwRef,
46
+ "transaction_reference" => flwRef,
47
+ "otp" => otp,
48
+ }
49
+ payload = payload.to_json
50
+
51
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::ACCOUNT_VALIDATE_ENDPOINT}", payload)
52
+ return handle_validate_account_response(response)
53
+ end
54
+
55
+ def verify_charge(txref)
56
+ base_url = rave_object.base_url
57
+
58
+ payload = {
59
+ "txref" => txref,
60
+ "SECKEY" => rave_object.secret_key.dup,
61
+ }
62
+
63
+ payload = payload.to_json
64
+
65
+ response = post_request("#{base_url}#{BASE_ENDPOINTS::VERIFY_ENDPOINT}", payload)
66
+ return handle_verify_account_response(response)
67
+ end
68
+ end
@@ -0,0 +1,106 @@
1
+ require 'httparty'
2
+ require_relative "../../rave_modules/base_endpoints"
3
+ require "json"
4
+ require_relative "../../error"
5
+
6
+ class Base
7
+
8
+ attr_reader :rave_object, :get_hashed_key
9
+
10
+ # method to initialize this class
11
+
12
+ def initialize(rave_object=nil)
13
+ unless !rave_object.nil?
14
+ raise ArgumentError, "Rave Object is required!!!"
15
+ end
16
+ @rave_object = rave_object
17
+ end
18
+
19
+
20
+ # method to get the hashed secret key
21
+ def get_hashed_key
22
+ hash = Digest::MD5.hexdigest(rave_object.secret_key)
23
+ last_twelve = hash[hash.length-12..hash.length-1]
24
+ private_secret_key = rave_object.secret_key.dup
25
+ private_secret_key['FLWSECK-'] = ''
26
+ first_twelve = private_secret_key[0..11]
27
+ return first_twelve + last_twelve
28
+ end
29
+
30
+ # method to make a get request
31
+ def get_request(endpoint, data={})
32
+ http_params = {}
33
+ unless data.empty?
34
+ http_params[:query] = data
35
+ end
36
+
37
+ begin
38
+ response = HTTParty.get(endpoint, http_params)
39
+ unless (response.code == 200 || response.code == 201)
40
+ raise RaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
41
+ end
42
+
43
+ # response_body = response.body
44
+
45
+ return response
46
+
47
+ unless(response.code != 0 )
48
+ raise RaveServerError.new(response), "Server Message: #{response.message}"
49
+ end
50
+
51
+ rescue JSON::ParserError => jsonerr
52
+ raise RaveServerError.new(response) , "Invalid result data. Could not parse JSON response body \n #{jsonerr.message}"
53
+
54
+ # rescue RaveServerError => e
55
+ # Util.serverErrorHandler(e)
56
+ # end
57
+
58
+ return response
59
+ end
60
+ end
61
+
62
+ # method to make a post request
63
+ def post_request(endpoint, data)
64
+ begin
65
+ response = HTTParty.post(endpoint, {
66
+ body: data,
67
+ headers: {
68
+ 'Content-Type' => 'application/json'
69
+ }
70
+ })
71
+
72
+ unless (response.code == 200 || response.code == 201)
73
+ raise RaveServerError.new(response), "HTTP Code #{response.code}: #{response.body}"
74
+ end
75
+
76
+ return response
77
+ end
78
+
79
+ end
80
+
81
+ # method to check if the passed parameters is equal to the expected parameters
82
+ def check_passed_parameters(required_params, passed_params)
83
+
84
+ # This is used to check if the passed authorization parameters matches the required parameters
85
+ required_params.each do |k, v|
86
+ if !passed_params.key?(k)
87
+ raise IncompleteParameterError, "Parameters Incomplete, Missing Parameter: #{k}, Please pass in the complete parameter."
88
+ end
89
+ # return true
90
+ end
91
+ end
92
+
93
+ # method to handle list bank response
94
+ def handle_list_bank(response)
95
+ list_bank = response
96
+
97
+ if list_bank.code == 200
98
+ response = {"error" => false, "data" => JSON.parse(list_bank.body)}
99
+ return response
100
+ else
101
+ response = {"error" => true, "data" => JSON.parse(list_bank.body)}
102
+ return response
103
+ # raise InitiateTransferError, response
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,154 @@
1
+ require_relative "base.rb"
2
+
3
+ class ChargeBase < 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 = ["billingzip", "billingcity", "billingaddress", "billingstate", "billingcountry"]
29
+ check_passed_parameters(required_parameters, keyword_args[auth_type])
30
+ payload.merge!({"suggested_auth" => suggested_auth})
31
+ return payload.merge!(keyword_args[auth_type])
32
+ end
33
+
34
+ # return this updated payload if the passed authorization type isn't address symbol
35
+ return payload.merge!({"suggested_auth" => suggested_auth, auth_type.to_s => keyword_args[auth_type]})
36
+
37
+ end
38
+
39
+ # method to charge response
40
+ def handle_charge_response (response)
41
+
42
+ charge_response = response
43
+ # print charge_response
44
+ flwRef = charge_response["data"]["flwRef"]
45
+ txRef = charge_response["data"]["txRef"]
46
+ # status = charge_response["data"]["status"]
47
+ message = charge_response["message"]
48
+ status = charge_response["status"]
49
+ suggested_auth = charge_response["data"]["suggested_auth"]
50
+ amount = charge_response["data"]["amount"]
51
+ currency = charge_response["data"]["currency"]
52
+ auth_model_used = charge_response["data"]["authModelUsed"]
53
+ validate_instruction = charge_response["data"]["validateInstruction"]
54
+ payment_type = charge_response["data"]["paymentType"]
55
+ charge_response_code = charge_response["data"]["chargeResponseCode"]
56
+ charge_response_message = charge_response["data"]["chargeResponseMessage"]
57
+
58
+
59
+ if charge_response["data"]["authurl"] == "N/A"
60
+ authurl = "N/A"
61
+ else
62
+ authurl = charge_response["data"]["authurl"]
63
+ end
64
+
65
+ if charge_response_code == "00"
66
+ res = {"error": false, "status": status, "validation_required": false, "message": message, "suggested_auth": suggested_auth, "txRef": txRef, "flwRef": flwRef, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message, "amount": amount, "currency": currency, "validateInstruction": validate_instruction, "paymentType": payment_type, "authModelUsed": auth_model_used, "authurl": authurl}
67
+ return JSON.parse(res.to_json)
68
+ else
69
+ res = {"error": false, "status": status, "validation_required": true, "message": message, "suggested_auth": suggested_auth, "txRef": txRef, "flwRef": flwRef, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message, "amount": amount, "currency": currency, "validateInstruction": validate_instruction, "paymentType": payment_type, "authModelUsed": auth_model_used, "authurl": authurl}
70
+ return JSON.parse(res.to_json)
71
+ # else
72
+ # # return charge_response
73
+ # res = {"status": charge_response["status"], "message": charge_response["message"], "data": charge_response["data"]}
74
+ # return JSON.parse(res.to_json)
75
+ end
76
+ end
77
+
78
+
79
+ # method to handle validate card response
80
+ def handle_validate_response(response)
81
+
82
+ validate_response = response
83
+ flwRef = validate_response["data"]["tx"]["flwRef"]
84
+ txRef = validate_response["data"]["tx"]["txRef"]
85
+ status = validate_response["status"]
86
+ message = validate_response["message"]
87
+ amount = validate_response["data"]["tx"]["amount"]
88
+ currency = validate_response["data"]["tx"]["currency"]
89
+ charge_response_code = validate_response["data"]["tx"]["chargeResponseCode"]
90
+ charge_response_message = validate_response["data"]["tx"]["chargeResponseMessage"]
91
+
92
+ if charge_response_code == "00"
93
+ res = {"error": false, "status": status, "message": message, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message}
94
+ return JSON.parse(res.to_json)
95
+ else
96
+ res = {"error": true, "status": status, "message": message, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message}
97
+ return JSON.parse(res.to_json)
98
+ end
99
+ end
100
+
101
+
102
+ # method to handle validate account response
103
+ def handle_validate_account_response(response)
104
+
105
+ validate_response = response
106
+ flwRef = validate_response["data"]["flwRef"]
107
+ txRef = validate_response["data"]["txRef"]
108
+ status = validate_response["status"]
109
+ message = validate_response["message"]
110
+ amount = validate_response["data"]["amount"]
111
+ currency = validate_response["data"]["currency"]
112
+ charge_response_code = validate_response["data"]["chargeResponseCode"]
113
+ charge_response_message = validate_response["data"]["chargeResponseMessage"]
114
+
115
+ if charge_response_code == "00"
116
+ res = {"error": false, "status": status, "message": message, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message}
117
+ return JSON.parse(res.to_json)
118
+ else
119
+ res = {"error": true, "status": status, "message": message, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "chargeResponseCode": charge_response_code, "chargeResponseMessage": charge_response_message}
120
+ return JSON.parse(res.to_json)
121
+ end
122
+ end
123
+
124
+ # method to handle card verify response
125
+ def handle_verify_response(response)
126
+ verify_response = response
127
+ status = verify_response["data"]["status"]
128
+ charge_code = verify_response["data"]["chargecode"]
129
+
130
+
131
+ if charge_code == "00" && status == "successful"
132
+ res = {"error": false, "transaction_complete": true, "data": verify_response["data"]}
133
+ return JSON.parse(res.to_json)
134
+ else
135
+ res = {"error": true, "transaction_complete": false, "data": verify_response["data"]}
136
+ return JSON.parse(res.to_json)
137
+ end
138
+ end
139
+
140
+ # method to handle account verify response
141
+ def handle_verify_account_response(response)
142
+ verify_response = response
143
+ status = verify_response["data"]["status"]
144
+ charge_code = verify_response["data"]["chargecode"]
145
+
146
+ if charge_code == "00" && status == "successful"
147
+ res = {"error": false, "transaction_complete": true, "data": verify_response["data"]}
148
+ return JSON.parse(res.to_json)
149
+ else
150
+ res = {"error": true, "transaction_complete": false, "data": verify_response["data"]}
151
+ return JSON.parse(res.to_json)
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,44 @@
1
+ require_relative "base.rb"
2
+
3
+ class MobileMoneyBase < Base
4
+
5
+ # method to handle mobile money charge response
6
+ def handle_charge_response(response)
7
+ charge_response = response
8
+ flwRef = charge_response["data"]["flwRef"]
9
+ txRef = charge_response["data"]["txRef"]
10
+ status = charge_response["data"]["status"]
11
+ amount = charge_response["data"]["amount"]
12
+ currency = charge_response["data"]["currency"]
13
+ payment_type = charge_response["data"]["paymentType"]
14
+ validate_instruction = charge_response["data"]["validateInstruction"]
15
+ auth_model_used = charge_response["data"]["authModelUsed"]
16
+ charge_response_code = charge_response["data"]["chargeResponseCode"]
17
+ charge_response_message = charge_response["data"]["chargeResponseMessage"]
18
+
19
+
20
+ if charge_response_code == "00"
21
+ res = {"error": false, "status": status, "validation_required": false, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "validateInstruction": validate_instruction, "authModelUsed": auth_model_used, "paymentType": payment_type}
22
+ return JSON.parse(res.to_json)
23
+ else
24
+ res = {"error": false, "status": status, "validation_required": true, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "validateInstruction": validate_instruction, "authModelUsed": auth_model_used, "paymentType": payment_type}
25
+ return JSON.parse(res.to_json)
26
+ end
27
+ end
28
+
29
+
30
+ # method to handle mobile money verify response
31
+ def handle_verify_response(response)
32
+ verify_response = response
33
+ status = verify_response["data"]["status"]
34
+ charge_code = verify_response["data"]["chargecode"]
35
+
36
+ if charge_code == "00" && status == "successful"
37
+ res = {"error": false, "transaction_complete": true, "data": verify_response["data"]}
38
+ return JSON.parse(res.to_json)
39
+ else
40
+ res = {"error": false, "transaction_complete": false, "data": verify_response["data"]}
41
+ return JSON.parse(res.to_json)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ require_relative "base.rb"
2
+
3
+ class MpesaBase < Base
4
+
5
+ # method to handle mpesa charge response
6
+ def handle_charge_response(response)
7
+
8
+ charge_response = response
9
+ flwRef = charge_response["data"]["flwRef"]
10
+ txRef = charge_response["data"]["txRef"]
11
+ status = charge_response["data"]["status"]
12
+ amount = charge_response["data"]["amount"]
13
+ currency = charge_response["data"]["currency"]
14
+ payment_type = charge_response["data"]["paymentType"]
15
+
16
+
17
+ if status == "pending"
18
+ res = {"error": false, "status": status, "validation_required": true, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "paymentType": payment_type}
19
+ return JSON.parse(res.to_json)
20
+ else
21
+ res = {"error": false, "status": status, "validation_required": false, "txRef": txRef, "flwRef": flwRef, "amount": amount, "currency": currency, "paymentType": payment_type}
22
+ return JSON.parse(res.to_json)
23
+ end
24
+ end
25
+
26
+
27
+ # method to handle mpesa verify response
28
+ def handle_verify_response(response)
29
+ verify_response = response
30
+ status = verify_response["data"]["status"]
31
+ charge_code = verify_response["data"]["chargecode"]
32
+
33
+ if charge_code == "00" && status == "successful"
34
+ res = {"error": false, "transaction_complete": true, "data": verify_response["data"]}
35
+ return JSON.parse(res.to_json)
36
+ else
37
+ res = {"error": false, "transaction_complete": false, "data": verify_response["data"]}
38
+ return JSON.parse(res.to_json)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,86 @@
1
+ require_relative "base.rb"
2
+
3
+ class PaymentPlanBase < Base
4
+
5
+ # method to handle payment plan response
6
+
7
+ def handle_create_response(response)
8
+
9
+ create_response = response
10
+ statusMessage = create_response["status"]
11
+
12
+ if statusMessage == "success"
13
+ response = {"error": false, "data": create_response["data"]}
14
+ return JSON.parse(response.to_json)
15
+ else
16
+ response = {"error": true, "data": create_response["data"]}
17
+ raise CreatePaymentPlanError, JSON.parse(response.to_json)
18
+ end
19
+ end
20
+
21
+ # method to list payment plan
22
+
23
+ def handle_list_response(response)
24
+ list_response = response
25
+
26
+ status = list_response["status"]
27
+ message = list_response["message"]
28
+ data = list_response["data"]
29
+ paymentplans = list_response["data"]["paymentplans"]
30
+
31
+ if status == "success"
32
+ response = {"error": false, "status": status,"message": message, "data": data}
33
+ return JSON.parse(response.to_json)
34
+ else
35
+ response = {"error": true, "data": list_response["data"]}
36
+ raise ListPaymentPlanError, JSON.parse(response.to_json)
37
+ end
38
+ end
39
+
40
+ # method to handle fetch payment plan response
41
+ def handle_fetch_response(response)
42
+ fetch_response = response
43
+ status = fetch_response["status"]
44
+ data = fetch_response["data"]
45
+
46
+ if status == "success"
47
+ response = {"error": false, "data": data}
48
+ return JSON.parse(response.to_json)
49
+ else
50
+ response = {"error": true, "data": data}
51
+ raise FetchPaymentPlanError, JSON.parse(response.to_json)
52
+ end
53
+
54
+ end
55
+
56
+ # method to handle cancel payment response
57
+ def handle_cancel_response(response)
58
+ cancel_response = response
59
+ status = cancel_response["status"]
60
+ data = cancel_response["data"]
61
+
62
+ if status == "success"
63
+ response = {"error": false, "data": data}
64
+ return JSON.parse(response.to_json)
65
+ else
66
+ response = {"error": true, "data": data}
67
+ raise CancelPaymentPlanError, JSON.parse(response.to_json)
68
+ end
69
+ end
70
+
71
+ # method to handle edit payment plan response
72
+ def handle_edit_response(response)
73
+ edit_response = response
74
+ status = edit_response["status"]
75
+ data = edit_response["data"]
76
+
77
+ if status == "success"
78
+ response = {"error": false, "data": data}
79
+ return JSON.parse(response.to_json)
80
+ else
81
+ response = {"error": true, "data": data}
82
+ raise EditPaymentPlanError, JSON.parse(response.to_json)
83
+ end
84
+ end
85
+
86
+ end