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.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +1743 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/rave_ruby/error.rb +48 -0
- data/lib/rave_ruby/rave_modules/base_endpoints.rb +21 -0
- data/lib/rave_ruby/rave_modules/util.rb +46 -0
- data/lib/rave_ruby/rave_objects/account.rb +68 -0
- data/lib/rave_ruby/rave_objects/base/base.rb +106 -0
- data/lib/rave_ruby/rave_objects/base/charge_base.rb +154 -0
- data/lib/rave_ruby/rave_objects/base/mobile_money_base.rb +44 -0
- data/lib/rave_ruby/rave_objects/base/mpesa_base.rb +41 -0
- data/lib/rave_ruby/rave_objects/base/payment_plan_base.rb +86 -0
- data/lib/rave_ruby/rave_objects/base/preauth_base.rb +84 -0
- data/lib/rave_ruby/rave_objects/base/sub_account_base.rb +34 -0
- data/lib/rave_ruby/rave_objects/base/subscription_base.rb +78 -0
- data/lib/rave_ruby/rave_objects/base/transfer_base.rb +80 -0
- data/lib/rave_ruby/rave_objects/base/ussd_base.rb +60 -0
- data/lib/rave_ruby/rave_objects/card.rb +91 -0
- data/lib/rave_ruby/rave_objects/list_banks.rb +18 -0
- data/lib/rave_ruby/rave_objects/mobile_money.rb +58 -0
- data/lib/rave_ruby/rave_objects/mpesa.rb +59 -0
- data/lib/rave_ruby/rave_objects/payment_plan.rb +61 -0
- data/lib/rave_ruby/rave_objects/preauth.rb +111 -0
- data/lib/rave_ruby/rave_objects/sub_account.rb +55 -0
- data/lib/rave_ruby/rave_objects/subscription.rb +51 -0
- data/lib/rave_ruby/rave_objects/transactions.rb +24 -0
- data/lib/rave_ruby/rave_objects/transfer.rb +79 -0
- data/lib/rave_ruby/rave_objects/uganda_mobile_money.rb +58 -0
- data/lib/rave_ruby/rave_objects/ussd.rb +59 -0
- data/lib/rave_ruby/version.rb +3 -0
- data/lib/rave_ruby.rb +74 -0
- data/rave_ruby.gemspec +46 -0
- metadata +144 -0
data/Rakefile
ADDED
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,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
|