fawry 1.1.1 → 1.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 34dc9f1782c59c274ae83ab7cb5bf7542c02df23f12d3343c0bacc06d0385acf
4
- data.tar.gz: 1e902699e6671b59e4d83ab246c6811fe4472c2b370843ce2b614e5e74811e80
3
+ metadata.gz: 47e5eac31f75494992bedc65eae9f99ea3a4fe369f8194be3e0b7f1abe445a69
4
+ data.tar.gz: 2f803d4ec113061428dab757363f3c93a6d10c25d2dcb7674be591ab98edfbd6
5
5
  SHA512:
6
- metadata.gz: e18d4c44a20192fafd829aae6b9726bdbef550f1f5a32fc28865d61bf7336f93d86c2eec07605eea53d29990ef45eabfd175c29e3e8425ca230d4f0ccd195d63
7
- data.tar.gz: 4eed6906aa47aa7e45d7b18fecf2ff2878aca3939e49f071f0e0ce16ffbc2278e0b204261cd03dbe5009f5c5c97bec7b08cc57f8faae52880229e57225fd9ecb
6
+ metadata.gz: af7bf3f371239ca3a3f9918b88725b990a169b64aba1bb38c43bc7224eb9ef42d8d06cde4426bdb8ac9b3a9e4dc7d07476ea2720780621709d174cca15da2040
7
+ data.tar.gz: ae244b3ab8ad17adfb279f0f6c2f8b15d237b178eb21503d632143b03d751e2ee792ce1278dbdbf8d71b5f542732fbd706bbb5f82015e8791c74ed33716c9fed
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ main ]
13
+ pull_request:
14
+ branches: [ main ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.6', '2.7', '3.0']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rake
data/.rubocop.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  AllCops:
2
+ NewCops: enable
2
3
  TargetRubyVersion: 2.6
3
- Metrics/LineLength:
4
+ Layout/LineLength:
4
5
  Max: 120
5
6
  Metrics/BlockLength:
6
- ExcludedMethods: ['describe', 'context']
7
+ IgnoredMethods: ['describe', 'context']
7
8
  Style/Documentation:
8
- Enabled: false
9
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,10 @@
1
+ # Fawry Changelog
2
+
3
+ ## [v1.4.0](https://github.com/fawry-api/fawry/releases/tag/v1.4.0) (24.12.2021)
4
+ - Update dependencies
5
+
6
+ ## [v1.3.1](https://github.com/fawry-api/fawry/releases/tag/v1.3.1) (15.08.2021)
7
+ - Add language param to charge request params
8
+
9
+ ## [v1.2.1](https://github.com/fawry-api/fawry/releases/tag/v1.2.1) (14.03.2021)
10
+ - Update gem and dependencies to support Ruby 3.0
data/Gemfile.lock CHANGED
@@ -1,97 +1,113 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fawry (1.1.1)
5
- dry-validation (~> 1.3, >= 1.3.1)
6
- faraday (~> 0.17.0)
4
+ fawry (1.4.0)
5
+ dry-validation (~> 1.7)
6
+ faraday (~> 1.8)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.7.0)
11
+ addressable (2.8.0)
12
12
  public_suffix (>= 2.0.2, < 5.0)
13
- ast (2.4.0)
14
- byebug (11.0.1)
15
- concurrent-ruby (1.1.7)
16
- crack (0.4.3)
17
- safe_yaml (~> 1.0.0)
18
- diff-lcs (1.3)
19
- dry-configurable (0.11.6)
13
+ ast (2.4.2)
14
+ byebug (11.1.3)
15
+ concurrent-ruby (1.1.9)
16
+ crack (0.4.5)
17
+ rexml
18
+ diff-lcs (1.5.0)
19
+ dry-configurable (0.13.0)
20
20
  concurrent-ruby (~> 1.0)
21
- dry-core (~> 0.4, >= 0.4.7)
22
- dry-equalizer (~> 0.2)
23
- dry-container (0.7.2)
21
+ dry-core (~> 0.6)
22
+ dry-container (0.9.0)
24
23
  concurrent-ruby (~> 1.0)
25
- dry-configurable (~> 0.1, >= 0.1.3)
26
- dry-core (0.4.9)
24
+ dry-configurable (~> 0.13, >= 0.13.0)
25
+ dry-core (0.7.1)
27
26
  concurrent-ruby (~> 1.0)
28
- dry-equalizer (0.3.0)
29
- dry-inflector (0.2.0)
27
+ dry-inflector (0.2.1)
30
28
  dry-initializer (3.0.4)
31
- dry-logic (1.0.8)
29
+ dry-logic (1.2.0)
32
30
  concurrent-ruby (~> 1.0)
33
- dry-core (~> 0.2)
34
- dry-equalizer (~> 0.2)
35
- dry-schema (1.5.5)
31
+ dry-core (~> 0.5, >= 0.5)
32
+ dry-schema (1.8.0)
36
33
  concurrent-ruby (~> 1.0)
37
- dry-configurable (~> 0.8, >= 0.8.3)
38
- dry-core (~> 0.4)
39
- dry-equalizer (~> 0.2)
34
+ dry-configurable (~> 0.13, >= 0.13.0)
35
+ dry-core (~> 0.5, >= 0.5)
40
36
  dry-initializer (~> 3.0)
41
37
  dry-logic (~> 1.0)
42
- dry-types (~> 1.4)
43
- dry-types (1.4.0)
38
+ dry-types (~> 1.5)
39
+ dry-types (1.5.1)
44
40
  concurrent-ruby (~> 1.0)
45
41
  dry-container (~> 0.3)
46
- dry-core (~> 0.4, >= 0.4.4)
47
- dry-equalizer (~> 0.3)
42
+ dry-core (~> 0.5, >= 0.5)
48
43
  dry-inflector (~> 0.1, >= 0.1.2)
49
44
  dry-logic (~> 1.0, >= 1.0.2)
50
- dry-validation (1.5.6)
45
+ dry-validation (1.7.0)
51
46
  concurrent-ruby (~> 1.0)
52
47
  dry-container (~> 0.7, >= 0.7.1)
53
- dry-core (~> 0.4)
54
- dry-equalizer (~> 0.2)
48
+ dry-core (~> 0.5, >= 0.5)
55
49
  dry-initializer (~> 3.0)
56
- dry-schema (~> 1.5, >= 1.5.2)
57
- faraday (0.17.1)
50
+ dry-schema (~> 1.8, >= 1.8.0)
51
+ faraday (1.8.0)
52
+ faraday-em_http (~> 1.0)
53
+ faraday-em_synchrony (~> 1.0)
54
+ faraday-excon (~> 1.1)
55
+ faraday-httpclient (~> 1.0.1)
56
+ faraday-net_http (~> 1.0)
57
+ faraday-net_http_persistent (~> 1.1)
58
+ faraday-patron (~> 1.0)
59
+ faraday-rack (~> 1.0)
58
60
  multipart-post (>= 1.2, < 3)
59
- hashdiff (1.0.0)
60
- jaro_winkler (1.5.4)
61
+ ruby2_keywords (>= 0.0.4)
62
+ faraday-em_http (1.0.0)
63
+ faraday-em_synchrony (1.0.0)
64
+ faraday-excon (1.1.0)
65
+ faraday-httpclient (1.0.1)
66
+ faraday-net_http (1.0.1)
67
+ faraday-net_http_persistent (1.2.0)
68
+ faraday-patron (1.0.0)
69
+ faraday-rack (1.0.0)
70
+ hashdiff (1.0.1)
61
71
  multipart-post (2.1.1)
62
- parallel (1.18.0)
63
- parser (2.6.5.0)
64
- ast (~> 2.4.0)
65
- public_suffix (4.0.1)
72
+ parallel (1.21.0)
73
+ parser (3.0.3.2)
74
+ ast (~> 2.4.1)
75
+ public_suffix (4.0.6)
66
76
  rainbow (3.0.0)
67
- rake (13.0.1)
68
- rspec (3.9.0)
69
- rspec-core (~> 3.9.0)
70
- rspec-expectations (~> 3.9.0)
71
- rspec-mocks (~> 3.9.0)
72
- rspec-core (3.9.0)
73
- rspec-support (~> 3.9.0)
74
- rspec-expectations (3.9.0)
77
+ rake (13.0.6)
78
+ regexp_parser (2.2.0)
79
+ rexml (3.2.5)
80
+ rspec (3.10.0)
81
+ rspec-core (~> 3.10.0)
82
+ rspec-expectations (~> 3.10.0)
83
+ rspec-mocks (~> 3.10.0)
84
+ rspec-core (3.10.1)
85
+ rspec-support (~> 3.10.0)
86
+ rspec-expectations (3.10.1)
75
87
  diff-lcs (>= 1.2.0, < 2.0)
76
- rspec-support (~> 3.9.0)
77
- rspec-mocks (3.9.0)
88
+ rspec-support (~> 3.10.0)
89
+ rspec-mocks (3.10.2)
78
90
  diff-lcs (>= 1.2.0, < 2.0)
79
- rspec-support (~> 3.9.0)
80
- rspec-support (3.9.0)
91
+ rspec-support (~> 3.10.0)
92
+ rspec-support (3.10.3)
81
93
  rspec_junit_formatter (0.4.1)
82
94
  rspec-core (>= 2, < 4, != 2.12.0)
83
- rubocop (0.76.0)
84
- jaro_winkler (~> 1.5.1)
95
+ rubocop (1.24.0)
85
96
  parallel (~> 1.10)
86
- parser (>= 2.6)
97
+ parser (>= 3.0.0.0)
87
98
  rainbow (>= 2.2.2, < 4.0)
99
+ regexp_parser (>= 1.8, < 3.0)
100
+ rexml
101
+ rubocop-ast (>= 1.15.0, < 2.0)
88
102
  ruby-progressbar (~> 1.7)
89
- unicode-display_width (>= 1.4.0, < 1.7)
90
- ruby-progressbar (1.10.1)
91
- safe_yaml (1.0.5)
92
- unicode-display_width (1.6.0)
93
- webmock (3.7.6)
94
- addressable (>= 2.3.6)
103
+ unicode-display_width (>= 1.4.0, < 3.0)
104
+ rubocop-ast (1.15.0)
105
+ parser (>= 3.0.1.1)
106
+ ruby-progressbar (1.11.0)
107
+ ruby2_keywords (0.0.5)
108
+ unicode-display_width (2.1.0)
109
+ webmock (3.14.0)
110
+ addressable (>= 2.8.0)
95
111
  crack (>= 0.3.2)
96
112
  hashdiff (>= 0.4.0, < 2.0.0)
97
113
 
@@ -100,13 +116,13 @@ PLATFORMS
100
116
 
101
117
  DEPENDENCIES
102
118
  bundler (~> 2.0)
103
- byebug (~> 11.0, >= 11.0.1)
119
+ byebug (~> 11.0)
104
120
  fawry!
105
121
  rake (~> 13.0)
106
122
  rspec (~> 3.0)
107
123
  rspec_junit_formatter
108
- rubocop (~> 0.76.0)
109
- webmock (~> 3.7, >= 3.7.6)
124
+ rubocop (~> 1.11)
125
+ webmock (~> 3.12)
110
126
 
111
127
  BUNDLED WITH
112
- 2.1.4
128
+ 2.3.3
data/README-ar.md CHANGED
@@ -6,15 +6,6 @@
6
6
 
7
7
  مكتبة لتسهيل التعامل مع خدمات الدفع الخاصة بشبكة الدفع الإلكتروني فوري:
8
8
 
9
- - [لإجراء عملية دفع](https://github.com/fawry-api/fawry#charge-customers)
10
- - [لإجراء عملية استرداد](https://github.com/fawry-api/fawry#refund-customers)
11
- - [حالة الدفع](https://github.com/fawry-api/fawry#get-payment-status)
12
- - [عرض رموز الكروت](https://github.com/fawry-api/fawry#list-card-tokens)
13
- - [إضافة رمز كارت](https://github.com/fawry-api/fawry#create-card-token)
14
- - [حذف رمز كارت](https://github.com/fawry-api/fawry#delete-card-token)
15
- - [تحليل رد خدمة فوري V2](https://github.com/fawry-api/fawry#parse-fawry-service-callback-v2)
16
- - [طلب البيانات الخاصة بإعدادات الإستخدام](https://github.com/fawry-api/fawry#configuration-keys-as-environment-variables)
17
-
18
9
  _المكتبة تدعم النظام التجريبي لفوري ايضا_
19
10
 
20
11
  ## لإضافة وتشغيل المكتبة
@@ -33,6 +24,20 @@ gem 'fawry'
33
24
 
34
25
  $ gem install fawry
35
26
 
27
+ ## تهيئة فوري للاستخدام
28
+
29
+ لبرنامجك لتهيئة المكتبة `fawry.rb` أضف مهيئ
30
+
31
+ ```ruby
32
+ Fawry.configure do |config|
33
+ config.sandbox = Rails.env.staging?
34
+ config.fawry_secure_key = 'fawry_secure_key'
35
+ config.fawry_merchant_code = 'fawry_merchant_code'
36
+ end
37
+ ```
38
+
39
+ `FAWRY_SANDBOX`, `FAWRY_SECURE_KEY`, `FAWRY_MERCHANT_CODE` _(environment variables)_ او يمكنك بدلا من ذلك، استخدام المتغيرات البيئية
40
+
36
41
  ## طريقة الإستعمال
37
42
 
38
43
  ### لإجراء عملية دفع
@@ -45,14 +50,13 @@ params = { "merchant_code": 'merchant_code',
45
50
  "payment_method": 'PAYATFAWRY',
46
51
  "currency_code": 'EGP',
47
52
  "amount": 20,
53
+ "language": "ar-eg",
48
54
  "fawry_secure_key": 'fawry_secure_key',
49
55
  "description": 'the charge request description',
50
56
  "charge_items": [{ "item_id": 'fk3fn9flk8et9a5t9w3c5h3oc684ivho',
51
57
  "description": 'desc', "price": 20, "quantity": 1 }] }
52
58
 
53
- # استخدم خيار النظام التجريبي للاتصال بالنظام التجريبي الخاص بفوري
54
- # sandbox: true
55
- res = Fawry.charge(params, sandbox: true)
59
+ res = Fawry.charge(params)
56
60
  # => #<Fawry::FawryResponse:0x0000564257d0ea90 @type="ChargeResponse", @reference_number="931600239",
57
61
  # @merchant_ref_number="io5jxf3jp27kfh8m719arcqgw7izo7db",
58
62
  # @expiration_time=1573153206979, @status_code=200,
@@ -70,7 +74,7 @@ params = { "merchant_code": 'merchant_code',
70
74
  "refund_amount": 20,
71
75
  "fawry_secure_key": 'fawry_secure_key' }
72
76
 
73
- res = Fawry.refund(params, sandbox: true)
77
+ res = Fawry.refund(params)
74
78
  # => #<Fawry::FawryResponse:0x0000564257d0ea90 @type="ResponseDataModel", @status_code=200,
75
79
  # @status_description="Operation done successfully">
76
80
 
@@ -84,7 +88,7 @@ params = { "merchant_code": 'merchant_code',
84
88
  "merchant_ref_number": 'ssshxb98phmyvm434es62kage3nsm2cj',
85
89
  "fawry_secure_key": 'fawry_secure_key' }
86
90
 
87
- res = Fawry.payment_status(params, sandbox: true)
91
+ res = Fawry.payment_status(params)
88
92
  # => #<Fawry::FawryResponse:0x0000559974056898 @type="PaymentStatusResponse", @reference_number="931922417",
89
93
  # @merchant_ref_number="ssshxb98phmyvm434es62kage3nsm2cj",
90
94
  # @expiration_time=1573297736167, @status_code=200,
@@ -102,7 +106,7 @@ params = { "merchant_code": 'merchant_code',
102
106
  "customer_profile_id": 'customer_profile_id',
103
107
  "fawry_secure_key": 'fawry_secure_key' }
104
108
 
105
- res = Fawry.list_tokens(params, sandbox: true)
109
+ res = Fawry.list_tokens(params)
106
110
 
107
111
  #<Fawry::FawryResponse:0x0000556cb3a31798 @fawry_api_response={"type"=>"CustomerTokensResponse", "cards"=>[{"token"=>"b5sshhdsl98df96200f254c19b2718bfc825a0678888216c28962b3e66a393084ee9aed6", "creationDate"=>1599487402318, "lastFourDigits"=>"4242", "brand"=>"Visa Card"}, {"token"=>"fb98dslsksmkdds7857ed7042ce30a2a5b777e1f1ac6ac58da1c8c0199f61df7a8bc098e96", "creationDate"=>1599489158457, "lastFourDigits"=>"0001", "brand"=>"Visa Card"}, {"token"=>"cc03fwqaacbd94e468a1b756ac1cbb285a41a2428df9f1a727457b41f9447d0058c7c", "creationDate"=>1599584834346, "lastFourDigits"=>"2346", "brand"=>"MasterCard"}, {"token"=>"f04a8bc9c973f900515f4b58e52c9ff03070baf3f534bdfdad0e97679534f60ddkjk13", "creationDate"=>1600260415739, "lastFourDigits"=>"8769", "brand"=>"Visa Card"}], "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CustomerTokensResponse", @cards=[{"token"=>"b5sshhdsl98df96200f254c19b2718bfc825a0678888216c28962b3e66a393084ee9aed6", "creationDate"=>1599487402318, "lastFourDigits"=>"4242", "brand"=>"Visa Card"}, {"token"=>"fb98dslsksmkdds7857ed7042ce30a2a5b777e1f1ac6ac58da1c8c0199f61df7a8bc098e96", "creationDate"=>1599489158457, "lastFourDigits"=>"0001", "brand"=>"Visa Card"}, {"token"=>"cc03fwqaacbd94e468a1b756ac1cbb285a41a2428df9f1a727457b41f9447d0058c7c", "creationDate"=>1599584834346, "lastFourDigits"=>"2346", "brand"=>"MasterCard"}, {"token"=>"f04a8bc9c973f900515f4b58e52c9ff03070baf3f534bdfdad0e97679534f60ddkjk13", "creationDate"=>1600260415739, "lastFourDigits"=>"8769", "brand"=>"Visa Card"}], @status_code=200, @status_description="Operation done successfully">
108
112
 
@@ -121,7 +125,8 @@ params = { "merchant_code" : "merchant_code",
121
125
  "expiry_year" : "expiry_year",
122
126
  "expiry_month" : "expiry_month",
123
127
  "cvv" : "cvv" }
124
- res = Fawry.create_card_token(params, sandbox: true)
128
+
129
+ res = Fawry.create_card_token(params)
125
130
  #<Fawry::FawryResponse:0x0000556cb3eb0080 @fawry_api_response={"type"=>"CardTokenResponse", "card"=>{"token"=>"b598f96200f254c19b2718bfc825a063278888216c28962b3e66a393084ee9aed6", "creationDate"=>1607011562353, "lastFourDigits"=>"4242"}, "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CardTokenResponse", @status_code=200, @status_description="Operation done successfully", @card={"token"=>"b598f96200f254c19b2718bfc825a063278888216c28962b3e66a393084ee9aed6", "creationDate"=>1607011562353, "lastFourDigits"=>"4242"}>
126
131
 
127
132
  res.success?
@@ -135,7 +140,7 @@ params = { "merchant_code": 'merchant_code',
135
140
  "customer_profile_id": 'customer_profile_id',
136
141
  "card_token": 'card_token' }
137
142
 
138
- res = Fawry.delete_token(params, sandbox: true)
143
+ res = Fawry.delete_token(params)
139
144
  #<Fawry::FawryResponse:0x0000556cb57c2460 @fawry_api_response={"type"=>"CardTokenResponse", "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CardTokenResponse", @status_code=200, @status_description="Operation done successfully">
140
145
  res.success?
141
146
 
@@ -154,8 +159,7 @@ callback_params = { "requestId": 'c72827d084ea4b88949d91dd2db4996e', "fawryRefNu
154
159
  "orderExpiryDate": 1_533_554_719_314,
155
160
  "orderItems": [{ "itemCode": 'e6aacbd5a498487ab1a10ae71061535d', "price": 150.0, "quantity": 1 }] }
156
161
 
157
- # FAWRY_SECURE_KEY يجب تعيين متغير البيئة
158
- fawry_callback = Fawry.parse_callback(callback_params, {})
162
+ fawry_callback = Fawry.parse_callback(callback_params)
159
163
  # <Fawry::FawryCallback:0x000056339ac43730 @request_id="c72827d084ea4b88949d91dd2db4996e", @fawry_ref_number="970177",
160
164
  # @merchant_ref_number="9708f1cea8b5426cb57922df51b7f790", @customer_mobile="01004545545",
161
165
  # @customer_mail="fawry@fawry.com", @order_status="NEW", @order_amount=150.0, @fawry_fees=2.0, ...>
@@ -164,12 +168,6 @@ fawry_callback.fawry_ref_number # => 970177
164
168
  fawry_callback.order_status # => NEW
165
169
  ```
166
170
 
167
- ### طلب البيانات الخاصة بإعدادات الإستخدام
168
-
169
- يمكن إرسال بيانات تهيئة فوري مثل رمز التاجر ومفتاح الأمان خلال البيانات المعطاه (`merchant_code`, `fawry_secure_key` ) الى **charge**, **refund**, **payment_status** طرق, _أو_ يمكن تعيينها كمتغيرات لنظام التشغيل: (`FAWRY_MERCHANT_CODE`, `FAWRY_SECURE_KEY`).
170
-
171
- لتحليل fawry معاودة الاتصال ، يجب عليك ضبط متغير البيئة `FAWRY_SECURE_KEY`.
172
-
173
171
  ## الخطوات القادمة المطلوب تنفيذها:
174
172
 
175
173
  - إضافة خيار لرفع الاستثناء عند فشل الطلب
data/README.md CHANGED
@@ -8,17 +8,10 @@
8
8
 
9
9
  A plug-and-play library that makes interfacing with Fawry's payment gateway API a breeze:
10
10
 
11
- - [Charge customers](https://github.com/fawry-api/fawry#charge-customers)
12
- - [Refund customers](https://github.com/fawry-api/fawry#refund-customers)
13
- - [Get payment status](https://github.com/fawry-api/fawry#get-payment-status)
14
- - [List card tokens](https://github.com/fawry-api/fawry#list-card-tokens)
15
- - [Create card token](https://github.com/fawry-api/fawry#create-card-token)
16
- - [Delete card token](https://github.com/fawry-api/fawry#delete-card-token)
17
- - [Parse Fawry's service callback V2](https://github.com/fawry-api/fawry#parse-fawry-service-callback-v2)
18
- - [Configuration keys as environment variables](https://github.com/fawry-api/fawry#configuration-keys-as-environment-variables)
19
-
20
11
  _Fawry's production and sandbox environments are supported._
21
12
 
13
+ _This library is tested on Ruby v2.6, 2.7, 3.0_
14
+
22
15
  ## Installation
23
16
 
24
17
  Add this line to your application's Gemfile:
@@ -35,6 +28,20 @@ Or install it yourself as:
35
28
 
36
29
  $ gem install fawry
37
30
 
31
+ ## Configuration
32
+
33
+ Add an initializer `fawry.rb` in your application to configure the library:
34
+
35
+ ```ruby
36
+ Fawry.configure do |config|
37
+ config.sandbox = Rails.env.staging?
38
+ config.fawry_secure_key = 'fawry_secure_key'
39
+ config.fawry_merchant_code = 'fawry_merchant_code'
40
+ end
41
+ ```
42
+
43
+ Alternatively, you could use the environment variables: `FAWRY_SANDBOX`, `FAWRY_SECURE_KEY`, and `FAWRY_MERCHANT_CODE`.
44
+
38
45
  ## Usage
39
46
 
40
47
  ### Charge customers
@@ -47,13 +54,13 @@ params = { "merchant_code": 'merchant_code',
47
54
  "payment_method": 'PAYATFAWRY',
48
55
  "currency_code": 'EGP',
49
56
  "amount": 20,
57
+ "language": "ar-eg",
50
58
  "fawry_secure_key": 'fawry_secure_key',
51
59
  "description": 'the charge request description',
52
60
  "charge_items": [{ "item_id": 'fk3fn9flk8et9a5t9w3c5h3oc684ivho',
53
61
  "description": 'desc', "price": 20, "quantity": 1 }] }
54
62
 
55
- # use sandbox option to call Fawry's sandbox env
56
- res = Fawry.charge(params, sandbox: true)
63
+ res = Fawry.charge(params)
57
64
  # => #<Fawry::FawryResponse:0x0000564257d0ea90 @type="ChargeResponse", @reference_number="931600239",
58
65
  # @merchant_ref_number="io5jxf3jp27kfh8m719arcqgw7izo7db",
59
66
  # @expiration_time=1573153206979, @status_code=200,
@@ -71,7 +78,7 @@ params = { "merchant_code": 'merchant_code',
71
78
  "refund_amount": 20,
72
79
  "fawry_secure_key": 'fawry_secure_key' }
73
80
 
74
- res = Fawry.refund(params, sandbox: true)
81
+ res = Fawry.refund(params)
75
82
  # => #<Fawry::FawryResponse:0x0000564257d0ea90 @type="ResponseDataModel", @status_code=200,
76
83
  # @status_description="Operation done successfully">
77
84
 
@@ -85,7 +92,7 @@ params = { "merchant_code": 'merchant_code',
85
92
  "merchant_ref_number": 'ssshxb98phmyvm434es62kage3nsm2cj',
86
93
  "fawry_secure_key": 'fawry_secure_key' }
87
94
 
88
- res = Fawry.payment_status(params, sandbox: true)
95
+ res = Fawry.payment_status(params)
89
96
  # => #<Fawry::FawryResponse:0x0000559974056898 @type="PaymentStatusResponse", @reference_number="931922417",
90
97
  # @merchant_ref_number="ssshxb98phmyvm434es62kage3nsm2cj",
91
98
  # @expiration_time=1573297736167, @status_code=200,
@@ -103,7 +110,7 @@ params = { "merchant_code": 'merchant_code',
103
110
  "customer_profile_id": 'customer_profile_id',
104
111
  "fawry_secure_key": 'fawry_secure_key' }
105
112
 
106
- res = Fawry.list_tokens(params, sandbox: true)
113
+ res = Fawry.list_tokens(params)
107
114
  #<Fawry::FawryResponse:0x0000556cb3a31798 @fawry_api_response={"type"=>"CustomerTokensResponse", "cards"=>[{"token"=>"b5sshhdsl98df96200f254c19b2718bfc825a0678888216c28962b3e66a393084ee9aed6", "creationDate"=>1599487402318, "lastFourDigits"=>"4242", "brand"=>"Visa Card"}, {"token"=>"fb98dslsksmkdds7857ed7042ce30a2a5b777e1f1ac6ac58da1c8c0199f61df7a8bc098e96", "creationDate"=>1599489158457, "lastFourDigits"=>"0001", "brand"=>"Visa Card"}, {"token"=>"cc03fwqaacbd94e468a1b756ac1cbb285a41a2428df9f1a727457b41f9447d0058c7c", "creationDate"=>1599584834346, "lastFourDigits"=>"2346", "brand"=>"MasterCard"}, {"token"=>"f04a8bc9c973f900515f4b58e52c9ff03070baf3f534bdfdad0e97679534f60ddkjk13", "creationDate"=>1600260415739, "lastFourDigits"=>"8769", "brand"=>"Visa Card"}], "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CustomerTokensResponse", @cards=[{"token"=>"b5sshhdsl98df96200f254c19b2718bfc825a0678888216c28962b3e66a393084ee9aed6", "creationDate"=>1599487402318, "lastFourDigits"=>"4242", "brand"=>"Visa Card"}, {"token"=>"fb98dslsksmkdds7857ed7042ce30a2a5b777e1f1ac6ac58da1c8c0199f61df7a8bc098e96", "creationDate"=>1599489158457, "lastFourDigits"=>"0001", "brand"=>"Visa Card"}, {"token"=>"cc03fwqaacbd94e468a1b756ac1cbb285a41a2428df9f1a727457b41f9447d0058c7c", "creationDate"=>1599584834346, "lastFourDigits"=>"2346", "brand"=>"MasterCard"}, {"token"=>"f04a8bc9c973f900515f4b58e52c9ff03070baf3f534bdfdad0e97679534f60ddkjk13", "creationDate"=>1600260415739, "lastFourDigits"=>"8769", "brand"=>"Visa Card"}], @status_code=200, @status_description="Operation done successfully">
108
115
 
109
116
  res.success? # => true
@@ -121,7 +128,7 @@ params = { "merchant_code" : "merchant_code",
121
128
  "expiry_year" : "expiry_year",
122
129
  "expiry_month" : "expiry_month",
123
130
  "cvv" : "cvv" }
124
- res = Fawry.create_card_token(params, sandbox: true)
131
+ res = Fawry.create_card_token(params)
125
132
  #<Fawry::FawryResponse:0x0000556cb3eb0080 @fawry_api_response={"type"=>"CardTokenResponse", "card"=>{"token"=>"b598f96200f254c19b2718bfc825a063278888216c28962b3e66a393084ee9aed6", "creationDate"=>1607011562353, "lastFourDigits"=>"4242"}, "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CardTokenResponse", @status_code=200, @status_description="Operation done successfully", @card={"token"=>"b598f96200f254c19b2718bfc825a063278888216c28962b3e66a393084ee9aed6", "creationDate"=>1607011562353, "lastFourDigits"=>"4242"}>
126
133
 
127
134
  res.success?
@@ -136,7 +143,7 @@ params = { "merchant_code": "merchant_code",
136
143
  "card_token": "card_token",
137
144
  "fawry_secure_key": "fawry_secure_key" }
138
145
 
139
- res = Fawry.delete_token(params, sandbox: true)
146
+ res = Fawry.delete_token(params)
140
147
  #<Fawry::FawryResponse:0x0000556cb57c2460 @fawry_api_response={"type"=>"CardTokenResponse", "statusCode"=>200, "statusDescription"=>"Operation done successfully"}, @type="CardTokenResponse", @status_code=200, @status_description="Operation done successfully">
141
148
 
142
149
  res.success?
@@ -156,7 +163,6 @@ callback_params = { "requestId": 'c72827d084ea4b88949d91dd2db4996e', "fawryRefNu
156
163
  "orderExpiryDate": 1_533_554_719_314,
157
164
  "orderItems": [{ "itemCode": 'e6aacbd5a498487ab1a10ae71061535d', "price": 150.0, "quantity": 1 }] }
158
165
 
159
- # FAWRY_SECURE_KEY env var must be set
160
166
  fawry_callback = Fawry.parse_callback(callback_params)
161
167
  # <Fawry::FawryCallback:0x000056339ac43730 @request_id="c72827d084ea4b88949d91dd2db4996e", @fawry_ref_number="970177",
162
168
  # @merchant_ref_number="9708f1cea8b5426cb57922df51b7f790", @customer_mobile="01004545545",
@@ -166,15 +172,8 @@ fawry_callback.fawry_ref_number # => 970177
166
172
  fawry_callback.order_status # => NEW
167
173
  ```
168
174
 
169
- ### Configuration keys as environment variables
170
-
171
- Fawry configuration keys such as merchant code and secure key can be sent with the params (`merchant_code`, `fawry_secure_key` ) to the **charge**, **refund**, **payment_status** methods, _or_ they can be set as environment variables: (`FAWRY_MERCHANT_CODE`, `FAWRY_SECURE_KEY`).
172
-
173
- To **parse** fawry callback, you _must_ set the env var `FAWRY_SECURE_KEY`.
174
-
175
175
  ## TODO:
176
176
 
177
- - Add public API documentation to README
178
177
  - Add option to raise exception on request failure
179
178
 
180
179
  ## Development
data/Rakefile CHANGED
@@ -2,10 +2,17 @@
2
2
 
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec)
8
+ RuboCop::RakeTask.new(:rubocop)
7
9
 
8
- task default: :spec
10
+ task default: :rspec_rubocop
11
+
12
+ task :rspec_rubocop do
13
+ Rake::Task['rubocop'].invoke
14
+ Rake::Task['spec'].invoke
15
+ end
9
16
 
10
17
  desc 'Start a console session with Fawry gem loaded'
11
18
  task :console do
data/fawry.gemspec CHANGED
@@ -7,17 +7,18 @@ require 'fawry/version'
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'fawry'
9
9
  spec.version = Fawry::VERSION
10
- spec.authors = ['Amr Bakry']
11
- spec.email = ['amrrbakry17@gmail.com']
10
+ spec.authors = ['Amr El Bakry']
11
+ spec.email = ['amrr@hey.com']
12
12
 
13
13
  spec.summary = "A library to interface with Fawry's payment gateway API (charge, refund, payment status,
14
14
  service callback)."
15
15
  spec.homepage = 'https://github.com/amrrbakry/fawry'
16
16
  spec.license = 'MIT'
17
- spec.required_ruby_version = '~> 2.6'
17
+ spec.required_ruby_version = '>= 2.6'
18
18
 
19
19
  spec.metadata['homepage_uri'] = 'https://github.com/amrrbakry/fawry'
20
20
  spec.metadata['source_code_uri'] = 'https://github.com/amrrbakry/fawry'
21
+ spec.metadata['rubygems_mfa_required'] = 'true'
21
22
 
22
23
  # Specify which files should be added to the gem when it is released.
23
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -28,14 +29,14 @@ Gem::Specification.new do |spec|
28
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
30
  spec.require_paths = ['lib']
30
31
 
31
- spec.add_dependency 'dry-validation', '~> 1.3', '>= 1.3.1'
32
- spec.add_dependency 'faraday', '~> 0.17.0'
32
+ spec.add_dependency 'dry-validation', '~> 1.7'
33
+ spec.add_dependency 'faraday', '~> 1.8'
33
34
 
34
35
  spec.add_development_dependency 'bundler', '~> 2.0'
35
- spec.add_development_dependency 'byebug', '~> 11.0', '>= 11.0.1'
36
+ spec.add_development_dependency 'byebug', '~> 11.0'
36
37
  spec.add_development_dependency 'rake', '~> 13.0'
37
38
  spec.add_development_dependency 'rspec', '~> 3.0'
38
39
  spec.add_development_dependency 'rspec_junit_formatter'
39
- spec.add_development_dependency 'rubocop', '~> 0.76.0'
40
- spec.add_development_dependency 'webmock', '~> 3.7', '>= 3.7.6'
40
+ spec.add_development_dependency 'rubocop', '~> 1.11'
41
+ spec.add_development_dependency 'webmock', '~> 3.12'
41
42
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fawry
4
+ class << self
5
+ attr_accessor :configuration
6
+
7
+ def configure
8
+ self.configuration ||= Configuration.new
9
+
10
+ yield(configuration)
11
+ end
12
+ end
13
+
14
+ class Configuration
15
+ attr_accessor :sandbox, :fawry_secure_key, :fawry_merchant_code
16
+ end
17
+ end
@@ -10,8 +10,11 @@ module Fawry
10
10
  FAWRY_SANDBOX_BASE_URL = 'https://atfawry.fawrystaging.com//ECommerceWeb/Fawry/'
11
11
 
12
12
  class << self
13
+ include Utils
14
+
13
15
  def post(path, params, body, options)
14
- conn = options[:sandbox] ? sandbox_connection : connection
16
+ sandbox = Fawry.configuration.sandbox || TRUTH_VALUES.include?(ENV.fetch('FAWRY_SANDBOX', options[:sandbox]))
17
+ conn = sandbox ? sandbox_connection : connection
15
18
 
16
19
  conn.post(path) do |request|
17
20
  request.params = params
@@ -20,7 +23,8 @@ module Fawry
20
23
  end
21
24
 
22
25
  def get(path, params, body, options)
23
- conn = options[:sandbox] ? sandbox_connection : connection
26
+ sandbox = Fawry.configuration.sandbox || TRUTH_VALUES.include?(ENV.fetch('FAWRY_SANDBOX', options[:sandbox]))
27
+ conn = sandbox ? sandbox_connection : connection
24
28
 
25
29
  conn.get(path) do |request|
26
30
  request.params = params
@@ -31,7 +35,8 @@ module Fawry
31
35
  end
32
36
 
33
37
  def delete(path, params, body, options)
34
- conn = options[:sandbox] ? sandbox_connection : connection
38
+ sandbox = Fawry.configuration.sandbox || TRUTH_VALUES.include?(ENV.fetch('FAWRY_SANDBOX', options[:sandbox]))
39
+ conn = sandbox ? sandbox_connection : connection
35
40
 
36
41
  conn.delete(path) do |request|
37
42
  request.params = params
@@ -45,12 +50,12 @@ module Fawry
45
50
 
46
51
  def connection
47
52
  @connection ||= Faraday.new(url: FAWRY_BASE_URL, headers: { 'Content-Type': 'application/json',
48
- 'Accept': 'application/json' })
53
+ Accept: 'application/json' })
49
54
  end
50
55
 
51
56
  def sandbox_connection
52
57
  @sandbox_connection ||= Faraday.new(url: FAWRY_SANDBOX_BASE_URL, headers: { 'Content-Type': 'application/json',
53
- 'Accept': 'application/json' })
58
+ Accept: 'application/json' })
54
59
  end
55
60
 
56
61
  # Fawry does not understand encoded params
@@ -64,7 +69,7 @@ module Fawry
64
69
 
65
70
  def self.decode(string)
66
71
  arr = string.split('&')
67
- arr.map { |str| str.split('=') }.to_h
72
+ arr.to_h { |str| str.split('=') }
68
73
  end
69
74
  end
70
75
  end
@@ -17,6 +17,7 @@ module Fawry
17
17
  required(:price).value(:decimal)
18
18
  required(:quantity).value(:integer)
19
19
  end
20
+ optional(:language).value(included_in?: %w[ar-eg en-gb])
20
21
  optional(:merchant_code).value(:string)
21
22
  optional(:fawry_secure_key).value(:string)
22
23
  optional(:currency_code).value(:string)
@@ -39,14 +40,18 @@ module Fawry
39
40
  end
40
41
 
41
42
  rule(:fawry_secure_key) do
42
- if ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
43
- key(:fawry_secure_key).failure('fawry secure key is required as a param or an env var')
43
+ if Fawry.configuration.fawry_secure_key.nil? && ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
44
+ key(:fawry_secure_key)
45
+ .failure('fawry secure key is required in either Fawry.configuration or'\
46
+ 'as an environment variable (FAWRY_SECURE_KEY), or as an argument to this method')
44
47
  end
45
48
  end
46
49
 
47
50
  rule(:merchant_code) do
48
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
49
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
51
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
52
+ key(:merchant_code)
53
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
54
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
50
55
  end
51
56
  end
52
57
  end
@@ -23,8 +23,10 @@ module Fawry
23
23
  end
24
24
 
25
25
  rule(:merchant_code) do
26
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
27
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
26
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
27
+ key(:merchant_code)
28
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
29
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
28
30
  end
29
31
  end
30
32
  end
@@ -13,14 +13,18 @@ module Fawry
13
13
  end
14
14
 
15
15
  rule(:fawry_secure_key) do
16
- if ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
17
- key(:fawry_secure_key).failure('fawry secure key is required as a param or an env var')
16
+ if Fawry.configuration.fawry_secure_key.nil? && ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
17
+ key(:fawry_secure_key)
18
+ .failure('fawry secure key is required in either Fawry.configuration or'\
19
+ 'as an environment variable (FAWRY_SECURE_KEY), or as an argument to this method')
18
20
  end
19
21
  end
20
22
 
21
23
  rule(:merchant_code) do
22
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
23
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
24
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
25
+ key(:merchant_code)
26
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
27
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
24
28
  end
25
29
  end
26
30
  end
@@ -12,14 +12,18 @@ module Fawry
12
12
  end
13
13
 
14
14
  rule(:fawry_secure_key) do
15
- if ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
16
- key(:fawry_secure_key).failure('fawry secure key is required as a param or an env var')
15
+ if Fawry.configuration.fawry_secure_key.nil? && ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
16
+ key(:fawry_secure_key)
17
+ .failure('fawry secure key is required in either Fawry.configuration or'\
18
+ 'as an environment variable (FAWRY_SECURE_KEY), or as an argument to this method')
17
19
  end
18
20
  end
19
21
 
20
22
  rule(:merchant_code) do
21
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
22
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
23
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
24
+ key(:merchant_code)
25
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
26
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
23
27
  end
24
28
  end
25
29
  end
@@ -12,14 +12,18 @@ module Fawry
12
12
  end
13
13
 
14
14
  rule(:fawry_secure_key) do
15
- if ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
16
- key(:fawry_secure_key).failure('fawry secure key is required as a param or an env var')
15
+ if Fawry.configuration.fawry_secure_key.nil? && ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
16
+ key(:fawry_secure_key)
17
+ .failure('fawry secure key is required in either Fawry.configuration or'\
18
+ 'as an environment variable (FAWRY_SECURE_KEY), or as an argument to this method')
17
19
  end
18
20
  end
19
21
 
20
22
  rule(:merchant_code) do
21
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
22
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
23
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
24
+ key(:merchant_code)
25
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
26
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
23
27
  end
24
28
  end
25
29
  end
@@ -14,14 +14,18 @@ module Fawry
14
14
  end
15
15
 
16
16
  rule(:fawry_secure_key) do
17
- if ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
18
- key(:fawry_secure_key).failure('fawry secure key is required as a param or an env var')
17
+ if Fawry.configuration.fawry_secure_key.nil? && ENV['FAWRY_SECURE_KEY'].nil? && value.nil?
18
+ key(:fawry_secure_key)
19
+ .failure('fawry secure key is required in either Fawry.configuration or'\
20
+ 'as an environment variable (FAWRY_SECURE_KEY), or as an argument to this method')
19
21
  end
20
22
  end
21
23
 
22
24
  rule(:merchant_code) do
23
- if ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
24
- key(:merchant_code).failure('fawry merchant code is required as a param or an env var')
25
+ if Fawry.configuration.fawry_merchant_code.nil? && ENV['FAWRY_MERCHANT_CODE'].nil? && value.nil?
26
+ key(:merchant_code)
27
+ .failure('fawry merchant code is required in either Fawry.configuration or'\
28
+ 'as an environment variable (FAWRY_MERCHANT_CODE), or as an argument to this method')
25
29
  end
26
30
  end
27
31
  end
data/lib/fawry/errors.rb CHANGED
@@ -2,5 +2,6 @@
2
2
 
3
3
  module Fawry
4
4
  class InvalidFawryRequestError < StandardError; end
5
+
5
6
  class InvalidSignatureError < StandardError; end
6
7
  end
@@ -8,7 +8,7 @@ module Fawry
8
8
 
9
9
  def initialize(callback_params, opts)
10
10
  @callback_params = callback_params
11
- @fawry_secure_key = ENV.fetch('FAWRY_SECURE_KEY')
11
+ @fawry_secure_key = Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY')
12
12
  @options = opts
13
13
  end
14
14
 
@@ -18,7 +18,6 @@ module Fawry
18
18
 
19
19
  # rubocop:disable Metrics/MethodLength
20
20
  # rubocop:disable Metrics/AbcSize
21
- # rubocop:disable Metrics/CyclomaticComplexity
22
21
  def build_request
23
22
  case action
24
23
  when 'charge'
@@ -46,7 +45,6 @@ module Fawry
46
45
  validate_delete_token_params!
47
46
  @request = build_delete_token_request
48
47
  end
49
- # rubocop:enable Metrics/CyclomaticComplexity
50
48
  # rubocop:enable Metrics/AbcSize
51
49
  # rubocop:enable Metrics/MethodLength
52
50
  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])
@@ -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!
@@ -27,7 +27,6 @@ module Fawry
27
27
  @create_card_token_request ||= params
28
28
  end
29
29
 
30
- # rubocop:disable Metrics/AbcSize
31
30
  def create_card_token_request_transformed_params
32
31
  {
33
32
  merchantCode: fawry_merchant_code,
@@ -41,14 +40,12 @@ module Fawry
41
40
  }.compact
42
41
  end
43
42
 
44
- # rubocop:enable Metrics/AbcSize
45
-
46
43
  def fawry_merchant_code
47
- ENV.fetch('FAWRY_MERCHANT_CODE') { create_card_token_request[:merchant_code] }
44
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
48
45
  end
49
46
 
50
47
  def fawry_secure_key
51
- ENV.fetch('FAWRY_SECURE_KEY') { create_card_token_request[:fawry_secure_key] }
48
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
52
49
  end
53
50
 
54
51
  def validate_card_token_params!
@@ -37,11 +37,11 @@ module Fawry
37
37
  end
38
38
 
39
39
  def fawry_merchant_code
40
- ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
40
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
41
41
  end
42
42
 
43
43
  def fawry_secure_key
44
- ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
44
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
45
45
  end
46
46
 
47
47
  def card_token
@@ -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_list_tokens_params!
@@ -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!
@@ -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.keys.each do |key|
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fawry
4
- VERSION = '1.1.1'
4
+ VERSION = '1.4.0'
5
5
  end
data/lib/fawry.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'fawry/version'
4
+ require 'fawry/utils'
4
5
  require 'fawry/connection'
6
+ require 'fawry/config'
5
7
  require 'fawry/errors'
6
- require 'fawry/utils'
7
8
  require 'fawry/fawry_request'
8
9
  require 'fawry/fawry_response'
9
10
  require 'fawry/fawry_callback'
@@ -21,6 +22,12 @@ require 'fawry/contracts/list_tokens_request_contract'
21
22
  require 'fawry/contracts/delete_token_request_contract'
22
23
 
23
24
  module Fawry
25
+ configure do |config|
26
+ config.sandbox = false
27
+ config.fawry_secure_key = nil
28
+ config.fawry_merchant_code = nil
29
+ end
30
+
24
31
  class << self
25
32
  # Sends a charge request to Fawry API
26
33
  # performs param validation and builds
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.1.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
- - Amr Bakry
7
+ - Amr El Bakry
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-07 00:00:00.000000000 Z
11
+ date: 2021-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-validation
@@ -16,34 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 1.3.1
19
+ version: '1.7'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '1.3'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 1.3.1
26
+ version: '1.7'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: faraday
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: 0.17.0
33
+ version: '1.8'
40
34
  type: :runtime
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: 0.17.0
40
+ version: '1.8'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: bundler
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -65,9 +59,6 @@ dependencies:
65
59
  - - "~>"
66
60
  - !ruby/object:Gem::Version
67
61
  version: '11.0'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 11.0.1
71
62
  type: :development
72
63
  prerelease: false
73
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -75,9 +66,6 @@ dependencies:
75
66
  - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: '11.0'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 11.0.1
81
69
  - !ruby/object:Gem::Dependency
82
70
  name: rake
83
71
  requirement: !ruby/object:Gem::Requirement
@@ -126,45 +114,40 @@ dependencies:
126
114
  requirements:
127
115
  - - "~>"
128
116
  - !ruby/object:Gem::Version
129
- version: 0.76.0
117
+ version: '1.11'
130
118
  type: :development
131
119
  prerelease: false
132
120
  version_requirements: !ruby/object:Gem::Requirement
133
121
  requirements:
134
122
  - - "~>"
135
123
  - !ruby/object:Gem::Version
136
- version: 0.76.0
124
+ version: '1.11'
137
125
  - !ruby/object:Gem::Dependency
138
126
  name: webmock
139
127
  requirement: !ruby/object:Gem::Requirement
140
128
  requirements:
141
129
  - - "~>"
142
130
  - !ruby/object:Gem::Version
143
- version: '3.7'
144
- - - ">="
145
- - !ruby/object:Gem::Version
146
- version: 3.7.6
131
+ version: '3.12'
147
132
  type: :development
148
133
  prerelease: false
149
134
  version_requirements: !ruby/object:Gem::Requirement
150
135
  requirements:
151
136
  - - "~>"
152
137
  - !ruby/object:Gem::Version
153
- version: '3.7'
154
- - - ">="
155
- - !ruby/object:Gem::Version
156
- version: 3.7.6
138
+ version: '3.12'
157
139
  description:
158
140
  email:
159
- - amrrbakry17@gmail.com
141
+ - amrr@hey.com
160
142
  executables: []
161
143
  extensions: []
162
144
  extra_rdoc_files: []
163
145
  files:
164
- - ".circleci/config.yml"
146
+ - ".github/workflows/ruby.yml"
165
147
  - ".gitignore"
166
148
  - ".rspec"
167
149
  - ".rubocop.yml"
150
+ - CHANGELOG.md
168
151
  - CODE_OF_CONDUCT.md
169
152
  - Gemfile
170
153
  - Gemfile.lock
@@ -176,6 +159,7 @@ files:
176
159
  - bin/setup
177
160
  - fawry.gemspec
178
161
  - lib/fawry.rb
162
+ - lib/fawry/config.rb
179
163
  - lib/fawry/connection.rb
180
164
  - lib/fawry/contracts/charge_request_contract.rb
181
165
  - lib/fawry/contracts/create_card_token_request_contract.rb
@@ -201,13 +185,14 @@ licenses:
201
185
  metadata:
202
186
  homepage_uri: https://github.com/amrrbakry/fawry
203
187
  source_code_uri: https://github.com/amrrbakry/fawry
188
+ rubygems_mfa_required: 'true'
204
189
  post_install_message:
205
190
  rdoc_options: []
206
191
  require_paths:
207
192
  - lib
208
193
  required_ruby_version: !ruby/object:Gem::Requirement
209
194
  requirements:
210
- - - "~>"
195
+ - - ">="
211
196
  - !ruby/object:Gem::Version
212
197
  version: '2.6'
213
198
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -216,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
201
  - !ruby/object:Gem::Version
217
202
  version: '0'
218
203
  requirements: []
219
- rubygems_version: 3.0.8
204
+ rubygems_version: 3.2.32
220
205
  signing_key:
221
206
  specification_version: 4
222
207
  summary: A library to interface with Fawry's payment gateway API (charge, refund,
data/.circleci/config.yml DELETED
@@ -1,57 +0,0 @@
1
- version: 2
2
- jobs:
3
- build:
4
- docker:
5
- - image: circleci/ruby:2.6.0
6
-
7
- working_directory: ~/repo
8
-
9
- steps:
10
- - checkout
11
-
12
- # Download and cache dependencies
13
- - restore_cache:
14
- keys:
15
- - v1-dependencies-{{ checksum "Gemfile.lock" }}
16
- # fallback to using the latest cache if no exact match is found
17
- - v1-dependencies-
18
-
19
- - run:
20
- name: install bundler
21
- command: gem install bundler
22
-
23
- - run:
24
- name: install dependencies
25
- command: |
26
- bundle install --jobs=4 --retry=3 --path vendor/bundle
27
-
28
- - save_cache:
29
- paths:
30
- - ./vendor/bundle
31
- key: v1-dependencies-{{ checksum "Gemfile.lock" }}
32
-
33
- # run tests!
34
- - run:
35
- name: run tests
36
- command: |
37
- mkdir /tmp/test-results
38
- TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
39
- circleci tests split --split-by=timings)"
40
-
41
- bundle exec rspec \
42
- --format progress \
43
- --format RspecJunitFormatter \
44
- --out /tmp/test-results/rspec.xml \
45
- --format progress \
46
- $TEST_FILES
47
-
48
- - run:
49
- name: run rubocop
50
- command: bundle exec rubocop
51
-
52
- # collect reports
53
- - store_test_results:
54
- path: /tmp/test-results
55
- - store_artifacts:
56
- path: /tmp/test-results
57
- destination: test-results