smartpay 0.2.17 → 0.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: 4d28befc09bec0649be0542e440f1acbcde630f38984e375986809f94a9bedec
4
- data.tar.gz: 7888dac202c056b57e476039d731a3b297833eacde05b98631300d0de1258270
3
+ metadata.gz: 794e3de526f66e64a6c05638932f2c3c8a3cb7bcea3708f8df266ad9f02e7d4a
4
+ data.tar.gz: f04b6f575b3be6e2320336a343fa9db842560654c5c7076d6b7bf07b2fcdab70
5
5
  SHA512:
6
- metadata.gz: 7c7fe94acaa28d87d3568c3e5fedc49fb61ae7ab85b401fbbbf985bda50664620c5afa8a194d6f7cb2d503fe8f7298bb782cdd7cd067a8a106e1b48d928578a0
7
- data.tar.gz: cb754e4460b339788a8cec5e688b08725dfb684156651539cf005b4b8dbe6950d5ffb22f852c0ec6035496a40d8194d80d81b6cbc44c6b10ddc2cb3a2874817f
6
+ metadata.gz: 54c1bd5ae7e587b67409e4eb9eed4c50d36690f09958e9003f3b9e9aadf927c429a41dc8c7b9fb18581f5594653f15fa0b3271896486f1276b07c1dd022f8910
7
+ data.tar.gz: 7cefc78c6463a95317d3f87abfc3e9ccc83cf5aeac7f2efed30194fba42faa2069e8e35ce695720ed9a83cdb523cec27a494b0611d51cee90d92bd62ecefd0a9
data/.rubocop.yml CHANGED
@@ -1,13 +1,13 @@
1
- AllCops:
2
- TargetRubyVersion: 2.5
3
-
4
- Style/StringLiterals:
5
- Enabled: true
6
- EnforcedStyle: double_quotes
7
-
8
- Style/StringLiteralsInInterpolation:
9
- Enabled: true
10
- EnforcedStyle: double_quotes
11
-
12
- Layout/LineLength:
13
- Max: 120
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+
4
+ Style/StringLiterals:
5
+ Enabled: true
6
+ EnforcedStyle: double_quotes
7
+
8
+ Style/StringLiteralsInInterpolation:
9
+ Enabled: true
10
+ EnforcedStyle: double_quotes
11
+
12
+ Layout/LineLength:
13
+ Max: 120
data/Gemfile CHANGED
@@ -10,3 +10,5 @@ gem "rake", "~> 13.0"
10
10
  gem "rspec", "~> 3.0"
11
11
 
12
12
  gem "rubocop", "~> 1.7"
13
+
14
+ gem "thin"
@@ -36,8 +36,8 @@ class SmartpaysController < ApplicationController
36
36
  country: "JP"
37
37
  },
38
38
  reference: "order_ref_1234567",
39
- successURL: "https://docs.smartpay.co/example-pages/checkout-successful",
40
- cancelURL: "https://docs.smartpay.co/example-pages/checkout-canceled",
39
+ successUrl: "https://docs.smartpay.co/example-pages/checkout-successful",
40
+ cancelUrl: "https://docs.smartpay.co/example-pages/checkout-canceled",
41
41
  test: true
42
42
  })
43
43
  redirect_to session.redirect_url
data/lib/smartpay/api.rb CHANGED
@@ -1,13 +1,42 @@
1
- # frozen_string_literal: true
2
-
3
- module Smartpay
4
- class Api
5
- class << self
6
- def create_checkout_session(payload)
7
- Responses::CheckoutSession.new(
8
- Client.post("/checkout-sessions", Requests::CheckoutSession.new(payload).as_hash)
9
- )
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ class Api
5
+ class << self
6
+ def create_checkout_session(payload)
7
+ Responses::CheckoutSession.new(
8
+ Client.post("/checkout-sessions", Requests::CheckoutSession.new(payload).as_hash)
9
+ )
10
+ end
11
+
12
+ def get_orders(page_token: nil, max_results: nil, expand: '' )
13
+ Responses::Base.new(Client.get("/orders", { pageToken: page_token, maxResults: max_results, expand: expand }))
14
+ end
15
+
16
+ def get_order(id, expand: '' )
17
+ Responses::Base.new(Client.get("/orders/%s" % id, { expand: expand }))
18
+ end
19
+
20
+ def create_payment(payload)
21
+ Responses::Base.new(
22
+ Client.post("/payments", Requests::Payment.new(payload).as_hash)
23
+ )
24
+ end
25
+
26
+ def capture(payload)
27
+ create_payment(payload)
28
+ end
29
+
30
+ def create_refund(payload)
31
+ Responses::Base.new(
32
+ Client.post("/refunds", Requests::Refund.new(payload).as_hash)
33
+ )
34
+ end
35
+
36
+ def refund(payload)
37
+ create_refund(payload)
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -1,45 +1,53 @@
1
- # frozen_string_literal: true
2
-
3
- require "rest-client"
4
-
5
- module Smartpay
6
- class Client
7
- class << self
8
- def post(path, payload = {})
9
- request_payload = default_payload.merge(payload)
10
- response = RestClient::Request.execute(method: :post, url: api_url(path), headers: headers, timeout: timeout,
11
- payload: request_payload.to_json)
12
- JSON.parse(response.body, symbolize_names: true)
13
- end
14
-
15
- private
16
-
17
- def api_url(path)
18
- "#{Smartpay.configuration.api_url}#{path}"
19
- end
20
-
21
- def timeout
22
- Smartpay.configuration.post_timeout
23
- end
24
-
25
- def headers
26
- {
27
- accept: :json,
28
- content_type: :json,
29
- Authorization: "Basic #{secret_key}"
30
- }
31
- end
32
-
33
- def secret_key
34
- Smartpay.configuration.secret_key
35
- end
36
-
37
- def default_payload
38
- {
39
- 'dev-lang': :ruby,
40
- 'sdk-version': Smartpay::VERSION
41
- }.freeze
42
- end
43
- end
44
- end
45
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "rest-client"
4
+
5
+ module Smartpay
6
+ class Client
7
+ class << self
8
+ def get(path, payload = {})
9
+ request_payload = default_payload.merge(payload)
10
+ response = RestClient::Request.execute(method: :get, url: api_url(path),
11
+ headers: headers.merge(params: request_payload),
12
+ timeout: timeout)
13
+ JSON.parse(response.body, symbolize_names: true)
14
+ end
15
+
16
+ def post(path, payload = {})
17
+ request_payload = default_payload.merge(payload)
18
+ response = RestClient::Request.execute(method: :post, url: api_url(path), headers: headers, timeout: timeout,
19
+ payload: request_payload.to_json)
20
+ JSON.parse(response.body, symbolize_names: true)
21
+ end
22
+
23
+ private
24
+
25
+ def api_url(path)
26
+ "#{Smartpay.configuration.api_url}#{path}"
27
+ end
28
+
29
+ def timeout
30
+ Smartpay.configuration.post_timeout
31
+ end
32
+
33
+ def headers
34
+ {
35
+ accept: :json,
36
+ content_type: :json,
37
+ Authorization: "Basic #{secret_key}"
38
+ }
39
+ end
40
+
41
+ def secret_key
42
+ Smartpay.configuration.secret_key
43
+ end
44
+
45
+ def default_payload
46
+ {
47
+ 'dev-lang': :ruby,
48
+ 'sdk-version': Smartpay::VERSION
49
+ }.freeze
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,48 +1,48 @@
1
- # frozen_string_literal: true
2
-
3
- module Smartpay
4
- class Configuration
5
- attr_accessor :public_key, :secret_key
6
- attr_writer :post_timeout, :api_url, :checkout_url
7
-
8
- DEFAULT_TIMEOUT_SETTING = 30
9
- DEFAULT_API_URL = "https://api.smartpay.co/v1"
10
- DEFAULT_CHECKOUT_URL = "https://checkout.smartpay.co"
11
-
12
- def initialize
13
- @post_timeout = DEFAULT_TIMEOUT_SETTING
14
- @api_url = if in_development_mode?
15
- ENV["SMARTPAY_API_PREFIX"].downcase || DEFAULT_API_URL
16
- else
17
- DEFAULT_API_URL
18
- end
19
- @checkout_url = if in_development_mode? && ENV["SMARTPAY_CHECKOUT_URL"].is_a?(String)
20
- ENV["SMARTPAY_CHECKOUT_URL"].downcase || DEFAULT_CHECKOUT_URL
21
- else
22
- DEFAULT_CHECKOUT_URL
23
- end
24
- end
25
-
26
- def post_timeout
27
- @post_timeout || DEFAULT_TIMEOUT_SETTING
28
- end
29
-
30
- def api_url
31
- if in_development_mode?
32
- @api_url || ENV["SMARTPAY_API_PREFIX"].downcase || DEFAULT_API_URL
33
- else
34
- @api_url || DEFAULT_API_URL
35
- end
36
- end
37
-
38
- def checkout_url
39
- @checkout_url || DEFAULT_CHECKOUT_URL
40
- end
41
-
42
- private
43
-
44
- def in_development_mode?
45
- ENV["SMARTPAY_API_PREFIX"].downcase.include?("api.smartpay") if ENV["SMARTPAY_API_PREFIX"].is_a?(String)
46
- end
47
- end
48
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ class Configuration
5
+ attr_accessor :public_key, :secret_key
6
+ attr_writer :post_timeout, :api_url, :checkout_url
7
+
8
+ DEFAULT_TIMEOUT_SETTING = 30
9
+ DEFAULT_API_URL = "https://api.smartpay.co/v1"
10
+ DEFAULT_CHECKOUT_URL = "https://checkout.smartpay.co"
11
+
12
+ def initialize
13
+ @post_timeout = DEFAULT_TIMEOUT_SETTING
14
+ @api_url = if in_development_mode?
15
+ ENV["SMARTPAY_API_PREFIX"].downcase || DEFAULT_API_URL
16
+ else
17
+ DEFAULT_API_URL
18
+ end
19
+ @checkout_url = if in_development_mode? && ENV["SMARTPAY_CHECKOUT_URL"].is_a?(String)
20
+ ENV["SMARTPAY_CHECKOUT_URL"].downcase || DEFAULT_CHECKOUT_URL
21
+ else
22
+ DEFAULT_CHECKOUT_URL
23
+ end
24
+ end
25
+
26
+ def post_timeout
27
+ @post_timeout || DEFAULT_TIMEOUT_SETTING
28
+ end
29
+
30
+ def api_url
31
+ if in_development_mode?
32
+ @api_url || ENV["SMARTPAY_API_PREFIX"].downcase || DEFAULT_API_URL
33
+ else
34
+ @api_url || DEFAULT_API_URL
35
+ end
36
+ end
37
+
38
+ def checkout_url
39
+ @checkout_url || DEFAULT_CHECKOUT_URL
40
+ end
41
+
42
+ private
43
+
44
+ def in_development_mode?
45
+ ENV["SMARTPAY_API_PREFIX"].downcase.include?("api.smartpay") if ENV["SMARTPAY_API_PREFIX"].is_a?(String)
46
+ end
47
+ end
48
+ end
@@ -1,209 +1,140 @@
1
- # frozen_string_literal: true
2
-
3
- module Smartpay
4
- module Requests
5
- class CheckoutSession
6
- attr_accessor :payload
7
-
8
- REQUIREMENT_KEY_NAME = [:successURL, :cancelURL, :customerInfo, :orderData].freeze
9
- CAN_FALLBACK_KEYS = [:customerInfo, :orderData].freeze
10
-
11
- def initialize(raw_payload)
12
- @payload = raw_payload.transform_keys(&:to_sym)
13
- end
14
-
15
- def as_hash
16
- check_requirement!
17
- normalize_payload
18
- end
19
-
20
- private
21
-
22
- def check_requirement!
23
- REQUIREMENT_KEY_NAME.each do |key_name|
24
- next if CAN_FALLBACK_KEYS.include?(key_name)
25
- raise Errors::InvalidRequestPayloadError, key_name unless payload.include?(key_name)
26
- end
27
- end
28
-
29
- def normalize_payload
30
- currency = get_currency
31
- total_amount = get_total_amount
32
- shippingInfo = payload.dig(:shippingInfo) || normalize_shipping(payload.dig(:shipping))
33
- shippingInfo[:feeCurrency] = currency if shippingInfo && shippingInfo[:feeCurrency].nil? && !(shippingInfo[:feeAmount].nil?)
34
-
35
- {
36
- customerInfo: normalize_customer_info(payload.dig(:customerInfo) || payload.dig(:customer) || {}),
37
- orderData: normalize_order_data(payload.dig(:orderData) || {
38
- amount: total_amount,
39
- currency: currency,
40
- captureMethod: payload.dig(:captureMethod),
41
- confirmationMethod: payload.dig(:confirmationMethod),
42
- coupons: payload.dig(:coupons),
43
- shippingInfo: shippingInfo,
44
- lineItemData: payload.dig(:orderData, :lineItemData) || payload.dig(:items),
45
- description: payload.dig(:orderDescription),
46
- metadata: payload.dig(:orderMetadata),
47
- reference: payload.dig(:reference),
48
- }),
49
- successUrl: payload.dig(:successURL),
50
- cancelUrl: payload.dig(:cancelURL),
51
- test: payload.dig(:test) || false
52
- }
53
- end
54
-
55
- def normalize_customer_info(info)
56
- return if info.nil?
57
- customer = info.transform_keys(&:to_sym)
58
- {
59
- accountAge: customer.dig(:accountAge),
60
- emailAddress: customer.dig(:emailAddress) || customer.dig(:email),
61
- firstName: customer.dig(:firstName),
62
- lastName: customer.dig(:lastName),
63
- firstNameKana: customer.dig(:firstNameKana),
64
- lastNameKana: customer.dig(:lastNameKana),
65
- address: customer.dig(:address),
66
- phoneNumber: customer.dig(:phoneNumber) || customer.dig(:phone),
67
- dateOfBirth: customer.dig(:dateOfBirth),
68
- legalGender: customer.dig(:legalGender) || customer.dig(:gender),
69
- reference: customer.dig(:reference)
70
- }
71
- end
72
-
73
- def normalize_shipping(shipping)
74
- return if shipping.nil?
75
- shipping= shipping.transform_keys(&:to_sym)
76
- {
77
- address: shipping.dig(:address) || {
78
- line1: shipping.dig(:line1),
79
- line2: shipping.dig(:line2),
80
- line3: shipping.dig(:line3),
81
- line4: shipping.dig(:line4),
82
- line5: shipping.dig(:line5),
83
- subLocality: shipping.dig(:subLocality),
84
- locality: shipping.dig(:locality),
85
- administrativeArea: shipping.dig(:administrativeArea),
86
- postalCode: shipping.dig(:postalCode),
87
- country: shipping.dig(:country),
88
- },
89
- addressType: shipping.dig(:addressType),
90
- feeAmount: shipping.dig(:feeAmount),
91
- feeCurrency: shipping.dig(:feeCurrency),
92
- }
93
- end
94
-
95
- def normalize_order_data(order)
96
- return if order.nil?
97
- order = order.transform_keys(&:to_sym)
98
- {
99
- amount: order.dig(:amount),
100
- currency: order.dig(:currency),
101
- captureMethod: order.dig(:captureMethod),
102
- confirmationMethod: order.dig(:confirmationMethod),
103
- coupons: order.dig(:coupons),
104
- shippingInfo: order.dig(:shippingInfo),
105
- lineItemData: normalize_line_items(order.dig(:lineItemData) || order.dig(:items)),
106
- metadata: order.dig(:metadata) || {},
107
- reference: order.dig(:reference)
108
- }
109
- end
110
-
111
- def normalize_line_items(data)
112
- return [] if data.nil?
113
-
114
- data.map do |item|
115
- line_item = item.transform_keys(&:to_sym)
116
- {
117
- price: line_item.dig(:price),
118
- priceData: normalize_price_data(line_item.dig(:priceData) || {
119
- productData: {
120
- name: line_item.dig(:name),
121
- brand: line_item.dig(:brand),
122
- categories: line_item.dig(:categories),
123
- gtin: line_item.dig(:gtin),
124
- images: line_item.dig(:images),
125
- reference: line_item.dig(:reference),
126
- url: line_item.dig(:url),
127
- description: line_item.dig(:productDescription),
128
- metadata: line_item.dig(:productMetadata)
129
- },
130
- amount: line_item.dig(:amount),
131
- currency: line_item.dig(:currency),
132
- label: line_item.dig(:label),
133
- description: line_item.dig(:priceDescription),
134
- metadata: line_item.dig(:priceMetadata)
135
- }),
136
- quantity: line_item.dig(:quantity),
137
- description: line_item.dig(:description),
138
- metadata: line_item.dig(:metadata)
139
- }
140
- end
141
- end
142
-
143
- def normalize_price_data(data)
144
- return if data.nil?
145
- data = data.transform_keys(&:to_sym)
146
- {
147
- productData: normalize_product_data(data.dig(:productData) || {}),
148
- amount: data.dig(:amount),
149
- currency: data.dig(:currency),
150
- metadata: data.dig(:metadata)
151
- }
152
- end
153
-
154
- def normalize_product_data(product)
155
- return if product.nil?
156
- product = product.transform_keys(&:to_sym)
157
- {
158
- name: product.dig(:name),
159
- brand: product.dig(:brand),
160
- categories: product.dig(:categories),
161
- description: product.dig(:description),
162
- gtin: product.dig(:gtin),
163
- images: product.dig(:images),
164
- reference: product.dig(:reference),
165
- url: product.dig(:url),
166
- metadata: product.dig(:metadata)
167
- }
168
- end
169
-
170
- def get_currency
171
- currency = payload.dig(:orderData, :currency) || payload.dig(:orderData, 'currency')
172
- if currency.nil?
173
- items = get_items
174
- if !items.nil? && items.count > 0
175
- currency = items.first.dig(:currency) || items.first.dig('currency')
176
- end
177
- end
178
- currency
179
- end
180
-
181
- def get_total_amount
182
- total_amount = payload.dig(:orderData, :amount) || payload.dig(:orderData, 'amount')
183
-
184
- if total_amount.nil?
185
- items = get_items
186
-
187
- if !items.nil? && items.count > 0
188
- total_amount = items.inject(0) { |sum, item| sum + (item[:amount] || item['amount'] || 0) }
189
- end
190
-
191
- shipping_fee = payload.dig(:orderData, :shippingInfo, :feeAmount) ||
192
- payload.dig(:orderData, :shippingInfo, 'feeAmount') ||
193
- payload.dig(:shipping, :feeAmount) ||
194
- payload.dig(:shipping, 'feeAmount') ||
195
- 0
196
- total_amount = shipping_fee + (total_amount || 0)
197
- end
198
-
199
- total_amount
200
- end
201
-
202
- def get_items
203
- @items ||= payload.dig(:orderData, :lineItemData, :priceData) ||
204
- payload.dig(:orderData, 'lineItemData', 'priceData') ||
205
- payload.dig(:items)
206
- end
207
- end
208
- end
209
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ module Requests
5
+ class CheckoutSession
6
+ attr_accessor :payload
7
+
8
+ REQUIREMENT_KEY_NAME = [:successUrl, :cancelUrl, :customer, :currency, :items].freeze
9
+ CAN_FALLBACK_KEYS = [:customer].freeze
10
+
11
+ def initialize(raw_payload)
12
+ @payload = raw_payload.transform_keys(&:to_sym)
13
+ end
14
+
15
+ def as_hash
16
+ check_requirement!
17
+ normalize_payload
18
+ end
19
+
20
+ private
21
+
22
+ def check_requirement!
23
+ REQUIREMENT_KEY_NAME.each do |key_name|
24
+ next if CAN_FALLBACK_KEYS.include?(key_name)
25
+ raise Errors::InvalidRequestPayloadError, key_name unless payload.include?(key_name)
26
+ end
27
+ end
28
+
29
+ def normalize_payload
30
+ shipping_info = payload.dig(:shippingInfo) || normalize_shipping(payload.dig(:shipping))
31
+ if shipping_info && shipping_info[:feeCurrency].nil? && !(shipping_info[:feeAmount].nil?)
32
+ shipping_info[:feeCurrency] = payload.dig(:currency)
33
+ end
34
+
35
+ total_amount = get_total_amount
36
+
37
+ {
38
+ customerInfo: normalize_customer_info(payload.dig(:customerInfo) || payload.dig(:customer) || {}),
39
+ amount: total_amount,
40
+ captureMethod: payload.dig(:captureMethod),
41
+ currency: payload.dig(:currency),
42
+ description: payload.dig(:description),
43
+ shippingInfo: shipping_info,
44
+ items: normalize_items(payload.dig(:items)),
45
+ metadata: payload.dig(:metadata) || {},
46
+ reference: payload.dig(:reference),
47
+ successUrl: payload.dig(:successUrl),
48
+ cancelUrl: payload.dig(:cancelUrl),
49
+ }
50
+ end
51
+
52
+ def normalize_customer_info(info)
53
+ return if info.nil?
54
+ customer = info.transform_keys(&:to_sym)
55
+ {
56
+ accountAge: customer.dig(:accountAge),
57
+ emailAddress: customer.dig(:emailAddress) || customer.dig(:email),
58
+ firstName: customer.dig(:firstName),
59
+ lastName: customer.dig(:lastName),
60
+ firstNameKana: customer.dig(:firstNameKana),
61
+ lastNameKana: customer.dig(:lastNameKana),
62
+ address: customer.dig(:address),
63
+ phoneNumber: customer.dig(:phoneNumber) || customer.dig(:phone),
64
+ dateOfBirth: customer.dig(:dateOfBirth),
65
+ legalGender: customer.dig(:legalGender) || customer.dig(:gender),
66
+ reference: customer.dig(:reference)
67
+ }
68
+ end
69
+
70
+ def normalize_shipping(shipping)
71
+ return if shipping.nil?
72
+ shipping= shipping.transform_keys(&:to_sym)
73
+ {
74
+ address: shipping.dig(:address) || {
75
+ line1: shipping.dig(:line1),
76
+ line2: shipping.dig(:line2),
77
+ line3: shipping.dig(:line3),
78
+ line4: shipping.dig(:line4),
79
+ line5: shipping.dig(:line5),
80
+ subLocality: shipping.dig(:subLocality),
81
+ locality: shipping.dig(:locality),
82
+ administrativeArea: shipping.dig(:administrativeArea),
83
+ postalCode: shipping.dig(:postalCode),
84
+ country: shipping.dig(:country),
85
+ },
86
+ addressType: shipping.dig(:addressType),
87
+ feeAmount: shipping.dig(:feeAmount),
88
+ feeCurrency: shipping.dig(:feeCurrency),
89
+ }
90
+ end
91
+
92
+ def normalize_items(data)
93
+ return [] if data.nil?
94
+
95
+ data.map do |item|
96
+ line_item = item.transform_keys(&:to_sym)
97
+ {
98
+ quantity: line_item.dig(:quantity),
99
+ label: line_item.dig(:label),
100
+ name: line_item.dig(:name),
101
+ amount: line_item.dig(:amount),
102
+ currency: line_item.dig(:currency),
103
+ brand: line_item.dig(:brand),
104
+ categories: line_item.dig(:categories),
105
+ gtin: line_item.dig(:gtin),
106
+ images: line_item.dig(:images),
107
+ reference: line_item.dig(:reference),
108
+ url: line_item.dig(:url),
109
+ description: line_item.dig(:description),
110
+ priceDescription: line_item.dig(:priceDescription),
111
+ productDescription: line_item.dig(:productDescription),
112
+ metadata: line_item.dig(:metadata),
113
+ productMetadata: line_item.dig(:productMetadata),
114
+ priceMetadata: line_item.dig(:priceMetadata)
115
+ }
116
+ end
117
+ end
118
+
119
+
120
+ def get_total_amount
121
+ total_amount = payload.dig(:amount) || payload.dig('amount')
122
+
123
+ if total_amount.nil?
124
+ items = payload.dig(:items)
125
+
126
+ if !items.nil? && items.count > 0
127
+ total_amount = items.inject(0) { |sum, item| sum + (item[:amount] || item['amount'] || 0) }
128
+ end
129
+
130
+ shipping_fee = payload.dig(:shippingInfo, :feeAmount) ||
131
+ payload.dig(:shippingInfo, 'feeAmount') ||
132
+ 0
133
+ total_amount = shipping_fee + (total_amount || 0)
134
+ end
135
+
136
+ total_amount
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ module Requests
5
+ class Payment
6
+ attr_accessor :payload
7
+
8
+ REQUIREMENT_KEY_NAME = [:order, :amount, :currency].freeze
9
+
10
+ def initialize(raw_payload)
11
+ @payload = raw_payload.transform_keys(&:to_sym)
12
+ end
13
+
14
+ def as_hash
15
+ check_requirement!
16
+ normalize_payload
17
+ end
18
+
19
+ private
20
+
21
+ def check_requirement!
22
+ REQUIREMENT_KEY_NAME.each do |key_name|
23
+ raise Errors::InvalidRequestPayloadError, key_name unless payload.include?(key_name)
24
+ end
25
+ end
26
+
27
+ def normalize_payload
28
+ {
29
+ order: payload.dig(:order),
30
+ amount: payload.dig(:amount),
31
+ currency: payload.dig(:currency),
32
+ reference: payload.dig(:reference),
33
+ description: payload.dig(:description),
34
+ metadata: payload.dig(:metadata) || {},
35
+ }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ module Requests
5
+ class Refund
6
+ attr_accessor :payload
7
+
8
+ REQUIREMENT_KEY_NAME = [:payment, :amount, :currency].freeze
9
+
10
+ def initialize(raw_payload)
11
+ @payload = raw_payload.transform_keys(&:to_sym)
12
+ end
13
+
14
+ def as_hash
15
+ check_requirement!
16
+ normalize_payload
17
+ end
18
+
19
+ private
20
+
21
+ def check_requirement!
22
+ REQUIREMENT_KEY_NAME.each do |key_name|
23
+ raise Errors::InvalidRequestPayloadError, key_name unless payload.include?(key_name)
24
+ end
25
+ end
26
+
27
+ def normalize_payload
28
+ {
29
+ payment: payload.dig(:payment),
30
+ amount: payload.dig(:amount),
31
+ currency: payload.dig(:currency),
32
+ reason: payload.dig(:reason),
33
+ reference: payload.dig(:reference),
34
+ description: payload.dig(:description),
35
+ metadata: payload.dig(:metadata) || {},
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ module Responses
5
+ class Base
6
+ attr_reader :response
7
+
8
+ def initialize(response)
9
+ @response = response
10
+ end
11
+
12
+ def as_hash
13
+ @response
14
+ end
15
+
16
+ def as_json
17
+ @response.to_json
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,40 +1,30 @@
1
- # frozen_string_literal: true
2
-
3
- module Smartpay
4
- module Responses
5
- class CheckoutSession
6
- attr_reader :response
7
-
8
- def initialize(response)
9
- @response = response
10
- end
11
-
12
- def redirect_url(options = {})
13
- url = "#{checkout_url}/login"
14
- promotion_code = options[:promotion_code] || response[:metadata][:__promotion_code__] || nil
15
- qs = "session-id=#{URI.encode_www_form_component(response[:id])}&public-key=#{URI.encode_www_form_component(public_key)}"
16
- qs = "#{qs}&promotion-code=#{URI.encode_www_form_component(promotion_code)}" if promotion_code
17
-
18
- "#{url}?#{qs}"
19
- end
20
-
21
- def as_hash
22
- @response
23
- end
24
-
25
- def as_json
26
- @response.to_json
27
- end
28
-
29
- private
30
-
31
- def checkout_url
32
- Smartpay.configuration.checkout_url
33
- end
34
-
35
- def public_key
36
- Smartpay.configuration.public_key
37
- end
38
- end
39
- end
40
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Smartpay
4
+ module Responses
5
+ class CheckoutSession < Base
6
+
7
+ def redirect_url(options = {})
8
+ url = response[:url]
9
+
10
+ if options && options[:promotionCode]
11
+ qs = "?promotion-code=#{options[:promotionCode]}"
12
+
13
+ return "#{url}#{qs}"
14
+ end
15
+
16
+ url
17
+ end
18
+
19
+ private
20
+
21
+ def checkout_url
22
+ Smartpay.configuration.checkout_url
23
+ end
24
+
25
+ def public_key
26
+ Smartpay.configuration.public_key
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Smartpay
4
- VERSION = "0.2.17"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/smartpay.rb CHANGED
@@ -1,25 +1,31 @@
1
- # frozen_string_literal: true
2
-
3
- require "json"
4
-
5
- require_relative "smartpay/version"
6
- require_relative "smartpay/configuration"
7
- require_relative "smartpay/client"
8
- require_relative "smartpay/api"
9
- require_relative "smartpay/errors/invalid_request_payload_error"
10
- require_relative "smartpay/requests/checkout_session"
11
- require_relative "smartpay/responses/checkout_session"
12
-
13
- module Smartpay
14
- class << self
15
- attr_accessor :configuration
16
-
17
- def configuration
18
- @configuration ||= Smartpay::Configuration.new
19
- end
20
-
21
- def configure
22
- yield(configuration)
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require_relative "smartpay/version"
6
+ require_relative "smartpay/configuration"
7
+ require_relative "smartpay/client"
8
+ require_relative "smartpay/api"
9
+ require_relative "smartpay/errors/invalid_request_payload_error"
10
+ require_relative "smartpay/requests/checkout_session"
11
+ require_relative "smartpay/requests/payment"
12
+ require_relative "smartpay/requests/refund"
13
+ require_relative "smartpay/responses/base"
14
+ require_relative "smartpay/responses/checkout_session"
15
+
16
+ module Smartpay
17
+ REJECT_REQUEST_BY_CUSTOMER = 'requested_by_customer'
18
+ REJECT_FRAUDULENT = 'fraudulent'
19
+
20
+ class << self
21
+ attr_accessor :configuration
22
+
23
+ def configuration
24
+ @configuration ||= Smartpay::Configuration.new
25
+ end
26
+
27
+ def configure
28
+ yield(configuration)
29
+ end
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartpay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.17
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Smartpay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-09 00:00:00.000000000 Z
11
+ date: 2022-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -66,6 +66,9 @@ files:
66
66
  - lib/smartpay/configuration.rb
67
67
  - lib/smartpay/errors/invalid_request_payload_error.rb
68
68
  - lib/smartpay/requests/checkout_session.rb
69
+ - lib/smartpay/requests/payment.rb
70
+ - lib/smartpay/requests/refund.rb
71
+ - lib/smartpay/responses/base.rb
69
72
  - lib/smartpay/responses/checkout_session.rb
70
73
  - lib/smartpay/version.rb
71
74
  homepage: https://smartpay.co
@@ -90,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
93
  - !ruby/object:Gem::Version
91
94
  version: '0'
92
95
  requirements: []
93
- rubygems_version: 3.0.9
96
+ rubygems_version: 3.2.32
94
97
  signing_key:
95
98
  specification_version: 4
96
99
  summary: The Smartpay Ruby SDK offers easy access to Smartpay API from applications