fawry 1.0.0 → 1.3.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 +4 -4
- data/.github/workflows/ruby.yml +35 -0
- data/.rubocop.yml +4 -3
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +57 -56
- data/README-ar.md +184 -0
- data/README.md +75 -22
- data/Rakefile +8 -1
- data/fawry.gemspec +7 -7
- data/lib/fawry.rb +100 -1
- data/lib/fawry/config.rb +17 -0
- data/lib/fawry/connection.rb +22 -6
- data/lib/fawry/contracts/charge_request_contract.rb +7 -4
- data/lib/fawry/contracts/create_card_token_request_contract.rb +33 -0
- data/lib/fawry/contracts/delete_token_request_contract.rb +30 -0
- data/lib/fawry/contracts/list_tokens_request_contract.rb +29 -0
- data/lib/fawry/contracts/payment_status_request_contract.rb +6 -4
- data/lib/fawry/contracts/refund_request_contract.rb +6 -4
- data/lib/fawry/errors.rb +1 -0
- data/lib/fawry/fawry_callback.rb +1 -1
- data/lib/fawry/fawry_request.rb +14 -0
- data/lib/fawry/requests/charge_request.rb +5 -4
- data/lib/fawry/requests/create_card_token_request.rb +57 -0
- data/lib/fawry/requests/delete_token_request.rb +62 -0
- data/lib/fawry/requests/list_tokens_request.rb +57 -0
- data/lib/fawry/requests/payment_status_request.rb +3 -3
- data/lib/fawry/requests/refund_request.rb +3 -3
- data/lib/fawry/utils.rb +3 -1
- data/lib/fawry/version.rb +1 -1
- metadata +26 -29
- data/.github/workflows/greetings.yml +0 -13
data/lib/fawry/fawry_request.rb
CHANGED
@@ -17,6 +17,7 @@ module Fawry
|
|
17
17
|
private
|
18
18
|
|
19
19
|
# rubocop:disable Metrics/MethodLength
|
20
|
+
# rubocop:disable Metrics/AbcSize
|
20
21
|
def build_request
|
21
22
|
case action
|
22
23
|
when 'charge'
|
@@ -31,7 +32,20 @@ module Fawry
|
|
31
32
|
self.class.include Requests::PaymentStatusRequest
|
32
33
|
validate_payment_status_params!
|
33
34
|
@request = build_payment_status_request
|
35
|
+
when 'create_card_token'
|
36
|
+
self.class.include Requests::CreateCardTokenRequest
|
37
|
+
validate_card_token_params!
|
38
|
+
@request = build_create_card_token_request
|
39
|
+
when 'list_tokens'
|
40
|
+
self.class.include Requests::ListTokensRequest
|
41
|
+
validate_list_tokens_params!
|
42
|
+
@request = build_list_tokens_request
|
43
|
+
when 'delete_token'
|
44
|
+
self.class.include Requests::DeleteTokenRequest
|
45
|
+
validate_delete_token_params!
|
46
|
+
@request = build_delete_token_request
|
34
47
|
end
|
48
|
+
# rubocop:enable Metrics/AbcSize
|
35
49
|
# rubocop:enable Metrics/MethodLength
|
36
50
|
end
|
37
51
|
end
|
@@ -5,7 +5,7 @@ require 'digest'
|
|
5
5
|
module Fawry
|
6
6
|
module Requests
|
7
7
|
module ChargeRequest
|
8
|
-
DEFAULTS = { payment_method: 'PAYATFAWRY', currency_code: 'EGP' }.freeze
|
8
|
+
DEFAULTS = { payment_method: 'PAYATFAWRY', currency_code: 'EGP', language: 'ar-eg' }.freeze
|
9
9
|
|
10
10
|
def fire_charge_request
|
11
11
|
fawry_api_response = Connection.post(request[:path], request[:params], request[:body], request[:options])
|
@@ -18,7 +18,7 @@ module Fawry
|
|
18
18
|
|
19
19
|
def build_charge_request
|
20
20
|
{
|
21
|
-
path: 'charge',
|
21
|
+
path: 'payments/charge',
|
22
22
|
params: {},
|
23
23
|
body: charge_request_transformed_params,
|
24
24
|
options: options
|
@@ -45,6 +45,7 @@ module Fawry
|
|
45
45
|
paymentExpiry: request_params[:payment_expiry],
|
46
46
|
chargeItems: charge_items,
|
47
47
|
currencyCode: request_params[:currency_code],
|
48
|
+
language: request_params[:language],
|
48
49
|
signature: charge_request_signature
|
49
50
|
}.compact
|
50
51
|
end
|
@@ -52,11 +53,11 @@ module Fawry
|
|
52
53
|
# rubocop:enable Metrics/AbcSize
|
53
54
|
|
54
55
|
def fawry_merchant_code
|
55
|
-
ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
56
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
56
57
|
end
|
57
58
|
|
58
59
|
def fawry_secure_key
|
59
|
-
ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
60
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
60
61
|
end
|
61
62
|
|
62
63
|
def validate_charge_params!
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module Fawry
|
6
|
+
module Requests
|
7
|
+
module CreateCardTokenRequest
|
8
|
+
def fire_create_card_token_request
|
9
|
+
fawry_api_response = Connection.post(request[:path], request[:params], request[:body], request[:options])
|
10
|
+
response_body = JSON.parse(fawry_api_response.body)
|
11
|
+
|
12
|
+
FawryResponse.new(response_body)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def build_create_card_token_request
|
18
|
+
{
|
19
|
+
path: 'cards/cardToken',
|
20
|
+
params: {},
|
21
|
+
body: create_card_token_request_transformed_params,
|
22
|
+
options: options
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_card_token_request
|
27
|
+
@create_card_token_request ||= params
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_card_token_request_transformed_params
|
31
|
+
{
|
32
|
+
merchantCode: fawry_merchant_code,
|
33
|
+
customerProfileId: create_card_token_request[:customer_profile_id],
|
34
|
+
customerMobile: create_card_token_request[:customer_mobile],
|
35
|
+
customerEmail: create_card_token_request[:customer_email],
|
36
|
+
cardNumber: create_card_token_request[:card_number],
|
37
|
+
expiryYear: create_card_token_request[:expiry_year],
|
38
|
+
expiryMonth: create_card_token_request[:expiry_month],
|
39
|
+
cvv: create_card_token_request[:cvv]
|
40
|
+
}.compact
|
41
|
+
end
|
42
|
+
|
43
|
+
def fawry_merchant_code
|
44
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
45
|
+
end
|
46
|
+
|
47
|
+
def fawry_secure_key
|
48
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate_card_token_params!
|
52
|
+
contract = Contracts::CreateCardTokenRequestContract.new.call(create_card_token_request)
|
53
|
+
raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module Fawry
|
6
|
+
module Requests
|
7
|
+
module DeleteTokenRequest
|
8
|
+
def fire_delete_token_request
|
9
|
+
fawry_api_response = Connection.delete(request[:path], request[:params], request[:body], request[:options])
|
10
|
+
response_body = JSON.parse(fawry_api_response.body)
|
11
|
+
|
12
|
+
FawryResponse.new(response_body)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def build_delete_token_request
|
18
|
+
{
|
19
|
+
path: 'cards/cardToken',
|
20
|
+
params: {},
|
21
|
+
body: delete_token_request_transformed_params,
|
22
|
+
options: options
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def request_params
|
27
|
+
@request_params = params
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_token_request_transformed_params
|
31
|
+
{
|
32
|
+
merchantCode: fawry_merchant_code,
|
33
|
+
customerProfileId: request_params[:customer_profile_id],
|
34
|
+
signature: delete_token_request_signature,
|
35
|
+
cardToken: request_params[:card_token]
|
36
|
+
}.compact
|
37
|
+
end
|
38
|
+
|
39
|
+
def fawry_merchant_code
|
40
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
41
|
+
end
|
42
|
+
|
43
|
+
def fawry_secure_key
|
44
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
45
|
+
end
|
46
|
+
|
47
|
+
def card_token
|
48
|
+
request_params[:card_token]
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate_delete_token_params!
|
52
|
+
contract = Contracts::ListTokensRequestContract.new.call(request_params)
|
53
|
+
raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
|
54
|
+
end
|
55
|
+
|
56
|
+
def delete_token_request_signature
|
57
|
+
Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:customer_profile_id]}"\
|
58
|
+
"#{card_token}#{fawry_secure_key}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'digest'
|
4
|
+
|
5
|
+
module Fawry
|
6
|
+
module Requests
|
7
|
+
module ListTokensRequest
|
8
|
+
def fire_list_tokens_request
|
9
|
+
fawry_api_response = Connection.get(request[:path], request[:params], request[:body], request[:options])
|
10
|
+
response_body = JSON.parse(fawry_api_response.body)
|
11
|
+
|
12
|
+
FawryResponse.new(response_body)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def build_list_tokens_request
|
18
|
+
{
|
19
|
+
path: 'cards/cardToken',
|
20
|
+
params: list_tokens_request_transformed_params,
|
21
|
+
body: {},
|
22
|
+
options: options
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def request_params
|
27
|
+
@request_params = params
|
28
|
+
end
|
29
|
+
|
30
|
+
def list_tokens_request_transformed_params
|
31
|
+
{
|
32
|
+
merchantCode: fawry_merchant_code,
|
33
|
+
customerProfileId: request_params[:customer_profile_id],
|
34
|
+
signature: list_tokens_request_signature
|
35
|
+
}.compact
|
36
|
+
end
|
37
|
+
|
38
|
+
def fawry_merchant_code
|
39
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
40
|
+
end
|
41
|
+
|
42
|
+
def fawry_secure_key
|
43
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate_list_tokens_params!
|
47
|
+
contract = Contracts::ListTokensRequestContract.new.call(request_params)
|
48
|
+
raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
|
49
|
+
end
|
50
|
+
|
51
|
+
def list_tokens_request_signature
|
52
|
+
Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:customer_profile_id]}"\
|
53
|
+
"#{fawry_secure_key}")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -16,7 +16,7 @@ module Fawry
|
|
16
16
|
|
17
17
|
def build_payment_status_request
|
18
18
|
{
|
19
|
-
path: 'status',
|
19
|
+
path: 'payments/status',
|
20
20
|
params: payment_status_request_transformed_params,
|
21
21
|
body: {},
|
22
22
|
options: options
|
@@ -36,11 +36,11 @@ module Fawry
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def fawry_merchant_code
|
39
|
-
ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
39
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
40
40
|
end
|
41
41
|
|
42
42
|
def fawry_secure_key
|
43
|
-
ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
43
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
44
44
|
end
|
45
45
|
|
46
46
|
def validate_payment_status_params!
|
@@ -16,7 +16,7 @@ module Fawry
|
|
16
16
|
|
17
17
|
def build_refund_request
|
18
18
|
{
|
19
|
-
path: 'refund',
|
19
|
+
path: 'payments/refund',
|
20
20
|
params: {},
|
21
21
|
body: refund_request_transformed_params,
|
22
22
|
options: options
|
@@ -38,11 +38,11 @@ module Fawry
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def fawry_merchant_code
|
41
|
-
ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
41
|
+
Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
|
42
42
|
end
|
43
43
|
|
44
44
|
def fawry_secure_key
|
45
|
-
ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
45
|
+
Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
|
46
46
|
end
|
47
47
|
|
48
48
|
def validate_refund_params!
|
data/lib/fawry/utils.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Fawry
|
4
4
|
module Utils
|
5
|
+
TRUTH_VALUES = [true, 'true', '1', 't'].freeze
|
6
|
+
|
5
7
|
# Adds keys from fawry API response as methods
|
6
8
|
# on object instance that return the value
|
7
9
|
# of each key
|
@@ -17,7 +19,7 @@ module Fawry
|
|
17
19
|
# fawry_res.status_code => 200
|
18
20
|
# fawry_res.reference_number => 1234567
|
19
21
|
def enrich_object(fawry_params)
|
20
|
-
fawry_params.
|
22
|
+
fawry_params.each_key do |key|
|
21
23
|
method_name = key.to_s.split(/(?=[A-Z])/).map(&:downcase).join('_') # statusCode => status_code
|
22
24
|
instance_variable_set("@#{method_name}", fawry_params[key])
|
23
25
|
method_body = proc { instance_variable_get("@#{method_name}") }
|
data/lib/fawry/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fawry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Amr Bakry
|
8
|
-
autorequire:
|
7
|
+
- Amr El Bakry
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-validation
|
@@ -65,9 +65,6 @@ dependencies:
|
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '11.0'
|
68
|
-
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 11.0.1
|
71
68
|
type: :development
|
72
69
|
prerelease: false
|
73
70
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -75,23 +72,20 @@ dependencies:
|
|
75
72
|
- - "~>"
|
76
73
|
- !ruby/object:Gem::Version
|
77
74
|
version: '11.0'
|
78
|
-
- - ">="
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: 11.0.1
|
81
75
|
- !ruby/object:Gem::Dependency
|
82
76
|
name: rake
|
83
77
|
requirement: !ruby/object:Gem::Requirement
|
84
78
|
requirements:
|
85
79
|
- - "~>"
|
86
80
|
- !ruby/object:Gem::Version
|
87
|
-
version: '
|
81
|
+
version: '13.0'
|
88
82
|
type: :development
|
89
83
|
prerelease: false
|
90
84
|
version_requirements: !ruby/object:Gem::Requirement
|
91
85
|
requirements:
|
92
86
|
- - "~>"
|
93
87
|
- !ruby/object:Gem::Version
|
94
|
-
version: '
|
88
|
+
version: '13.0'
|
95
89
|
- !ruby/object:Gem::Dependency
|
96
90
|
name: rspec
|
97
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -126,58 +120,58 @@ dependencies:
|
|
126
120
|
requirements:
|
127
121
|
- - "~>"
|
128
122
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
123
|
+
version: '1.11'
|
130
124
|
type: :development
|
131
125
|
prerelease: false
|
132
126
|
version_requirements: !ruby/object:Gem::Requirement
|
133
127
|
requirements:
|
134
128
|
- - "~>"
|
135
129
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
130
|
+
version: '1.11'
|
137
131
|
- !ruby/object:Gem::Dependency
|
138
132
|
name: webmock
|
139
133
|
requirement: !ruby/object:Gem::Requirement
|
140
134
|
requirements:
|
141
135
|
- - "~>"
|
142
136
|
- !ruby/object:Gem::Version
|
143
|
-
version: '3.
|
144
|
-
- - ">="
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: 3.7.6
|
137
|
+
version: '3.12'
|
147
138
|
type: :development
|
148
139
|
prerelease: false
|
149
140
|
version_requirements: !ruby/object:Gem::Requirement
|
150
141
|
requirements:
|
151
142
|
- - "~>"
|
152
143
|
- !ruby/object:Gem::Version
|
153
|
-
version: '3.
|
154
|
-
|
155
|
-
- !ruby/object:Gem::Version
|
156
|
-
version: 3.7.6
|
157
|
-
description:
|
144
|
+
version: '3.12'
|
145
|
+
description:
|
158
146
|
email:
|
159
|
-
-
|
147
|
+
- amrr@hey.com
|
160
148
|
executables: []
|
161
149
|
extensions: []
|
162
150
|
extra_rdoc_files: []
|
163
151
|
files:
|
164
152
|
- ".circleci/config.yml"
|
165
|
-
- ".github/workflows/
|
153
|
+
- ".github/workflows/ruby.yml"
|
166
154
|
- ".gitignore"
|
167
155
|
- ".rspec"
|
168
156
|
- ".rubocop.yml"
|
157
|
+
- CHANGELOG.md
|
169
158
|
- CODE_OF_CONDUCT.md
|
170
159
|
- Gemfile
|
171
160
|
- Gemfile.lock
|
172
161
|
- LICENSE.txt
|
162
|
+
- README-ar.md
|
173
163
|
- README.md
|
174
164
|
- Rakefile
|
175
165
|
- bin/console
|
176
166
|
- bin/setup
|
177
167
|
- fawry.gemspec
|
178
168
|
- lib/fawry.rb
|
169
|
+
- lib/fawry/config.rb
|
179
170
|
- lib/fawry/connection.rb
|
180
171
|
- lib/fawry/contracts/charge_request_contract.rb
|
172
|
+
- lib/fawry/contracts/create_card_token_request_contract.rb
|
173
|
+
- lib/fawry/contracts/delete_token_request_contract.rb
|
174
|
+
- lib/fawry/contracts/list_tokens_request_contract.rb
|
181
175
|
- lib/fawry/contracts/payment_status_request_contract.rb
|
182
176
|
- lib/fawry/contracts/refund_request_contract.rb
|
183
177
|
- lib/fawry/errors.rb
|
@@ -185,6 +179,9 @@ files:
|
|
185
179
|
- lib/fawry/fawry_request.rb
|
186
180
|
- lib/fawry/fawry_response.rb
|
187
181
|
- lib/fawry/requests/charge_request.rb
|
182
|
+
- lib/fawry/requests/create_card_token_request.rb
|
183
|
+
- lib/fawry/requests/delete_token_request.rb
|
184
|
+
- lib/fawry/requests/list_tokens_request.rb
|
188
185
|
- lib/fawry/requests/payment_status_request.rb
|
189
186
|
- lib/fawry/requests/refund_request.rb
|
190
187
|
- lib/fawry/utils.rb
|
@@ -195,13 +192,13 @@ licenses:
|
|
195
192
|
metadata:
|
196
193
|
homepage_uri: https://github.com/amrrbakry/fawry
|
197
194
|
source_code_uri: https://github.com/amrrbakry/fawry
|
198
|
-
post_install_message:
|
195
|
+
post_install_message:
|
199
196
|
rdoc_options: []
|
200
197
|
require_paths:
|
201
198
|
- lib
|
202
199
|
required_ruby_version: !ruby/object:Gem::Requirement
|
203
200
|
requirements:
|
204
|
-
- - "
|
201
|
+
- - ">="
|
205
202
|
- !ruby/object:Gem::Version
|
206
203
|
version: '2.6'
|
207
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -210,8 +207,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
207
|
- !ruby/object:Gem::Version
|
211
208
|
version: '0'
|
212
209
|
requirements: []
|
213
|
-
rubygems_version: 3.
|
214
|
-
signing_key:
|
210
|
+
rubygems_version: 3.1.4
|
211
|
+
signing_key:
|
215
212
|
specification_version: 4
|
216
213
|
summary: A library to interface with Fawry's payment gateway API (charge, refund,
|
217
214
|
payment status, service callback).
|