smartpay 0.2.14 → 0.2.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27577ba266e00cb77bb730e603c9b8f44d93d9062f4935f72f9ef29c9904c456
4
- data.tar.gz: d9d98d1da2b90545f42ed7a982bca956fb6eaa9beb6b90a73c0789ae6ce07bfe
3
+ metadata.gz: 3897098e68300e9004b822ba8f797040b02c00362428cee023ba598415bd4a54
4
+ data.tar.gz: dd42d0ad91f798d88fd765270975e9d61dde01cd3b52143c0d762bb1577f71b6
5
5
  SHA512:
6
- metadata.gz: 5a95a99d46cd097137108c2839802e79903ecb6902ccfafc637eee370c1bf96c272c20a8e6dc5c54af8a1d7aa3114cb6d8f1c55ced9b2916384cc5249c05a5ec
7
- data.tar.gz: 3a6651ccdf5d72b9716be260b5c20638220ef6c7da00e3ecd43db9ee405ac6ea5205d923aed0213ce9c84a4d5d0c16a22c4de4bb4a6dd373b9bc92c71bb00340
6
+ metadata.gz: 05df4d994fd49a80bd58d56bd58469639aa0ad50f7688d874cce1b412e8366fe5afb82acf6082c00e40b3b0a7491bba4a7242117e65ab22e8fd326cbd0b9e65a
7
+ data.tar.gz: ed67c91a5e4f43991a362d77c2c2ac4f430265c14f3c236941c26f482a162683bdddbc10700e82344b9b923c698bbbd9126cd8c1cb7975bc1506807de2888a80
data/.rubocop.yml CHANGED
@@ -1,13 +1,13 @@
1
- AllCops:
2
- TargetRubyVersion: 2.4
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/README.md CHANGED
@@ -1,181 +1,181 @@
1
- # Smartpay Ruby Library
2
-
3
- The Smartpay Ruby library offers easy access to Smartpay API from applications written in Ruby.
4
-
5
- ## Documentation
6
-
7
- - [Payment Flow](https://docs.smartpay.co/#payment_flow)
8
- - [API Document](https://api-doc.smartpay.co)
9
-
10
- ## Requirements
11
-
12
- - Ruby 2.6+
13
- - Smartpay `API keys & secrets`. You can find your credential at the `settings > credentials` page on your [dashboard](https://dashboard.smartpay.co/settings/credentials).
14
-
15
- ## Installation
16
-
17
- If you use system built-in Ruby, you might need to be the `sudoer` to be able to `sudo` in some of the following steps. We recommend you to use either [rbenv](https://github.com/rbenv/rbenv) or [rvm](https://rvm.io/) to have your own non-global Ruby to avoid potential permission issues.
18
-
19
- Once you have your Ruby in place, add the latest version of Smartpay to your project's dependencies:
20
-
21
- ```sh
22
- gem install smartpay
23
- ```
24
-
25
- If you want to build the gem yourself from source:
26
-
27
- ```sh
28
- gem build smartpay.gemspec
29
- ```
30
-
31
- ### Bundler
32
-
33
- If you are installing via bundler, make sure that you use the `https` resource in your Gemfile to avoid the risk of gems being compromised:
34
-
35
- ```ruby
36
- source 'https://rubygems.org'
37
-
38
- gem 'smartpay'
39
- ```
40
-
41
- ## Usage
42
-
43
- The package needs to be configured with your own API keys, you can find them on your [dashboard](https://dashboard.smartpay.co/settings/credentials).
44
-
45
- ```ruby
46
- Smartpay.configure do |config|
47
- config.public_key = '<YOUR_PUBLIC_KEY>' # the one starts with pk_test_
48
- config.secret_key = '<YOUR_SECRET_KEY>' # the one starts with sk_test_
49
- end
50
- ```
51
-
52
- ### Create Checkout session
53
-
54
- You can find the description and requirement for request payload in [API Document](https://api-doc.smartpay.co/#8a3538b1-530c-448c-8bae-4a41cdf0b8fd).
55
-
56
- ```ruby
57
- payloaad = {
58
- "customerInfo": {
59
- "emailAddress": "success@smartpay.co",
60
- },
61
- "orderData": {
62
- "amount": 250,
63
- "currency": "JPY",
64
- "shippingInfo": {
65
- "address": {
66
- "line1": "line1",
67
- "locality": "locality",
68
- "postalCode": "123",
69
- "country": "JP"
70
- },
71
- },
72
- "lineItemData": [{
73
- "priceData": {
74
- "productData": {
75
- "name": "レブロン 18 LOW",
76
- },
77
- "amount": 250,
78
- "currency": "JPY",
79
- },
80
- "quantity": 1
81
- }]
82
- },
83
- "reference": "order_ref_1234567",
84
- "successUrl": "https://docs.smartpay.co/example-pages/checkout-successful",
85
- "cancelUrl": "https://docs.smartpay.co/example-pages/checkout-canceled"
86
- }
87
- ```
88
-
89
- Create a checkout session by using `Smartpay::Api.create_checkout_session` with your request payload.
90
-
91
- ```ruby
92
- session = Smartpay::Api.create_checkout_session(payload)
93
- ```
94
-
95
- Then, you can redirect your customer to the session url by calling `redirect_url`:
96
-
97
- ```ruby
98
- session.redirect_url
99
- ```
100
-
101
- ## Use with your favorite frameworks
102
-
103
- ### Ruby on Rails (RoR)
104
-
105
- #### Install Rails
106
-
107
- ```sh
108
- gem install rails
109
- ```
110
-
111
- #### Create your app
112
-
113
- ```sh
114
- rails new app-with-smartpay
115
- ```
116
-
117
- #### Add Smartpay
118
-
119
- ```sh
120
- cd app-with-smartpay
121
- bundle add smartpay
122
- ```
123
-
124
- #### Generator
125
-
126
- ```sh
127
- bundle exec rails generate smartpay:install
128
- ```
129
-
130
- This introduces 4 changes for a pre-built Smartpay Checkout example:
131
-
132
- > 1. A new initializer - `config/initializers/smartpay.rb`. You will have to update the `config.public_key` and `config.secret_key` with your own credentials to make this work.
133
- > 2. A new controller - `app/controllers/smartpays_controller.rb`. This is where you can see how a Checkout session is configured & created.
134
- > 3. A new view - `app/views/smartpays/index.html.erb`. The minimum frontend required.
135
- > 4. A new route in config/routes.rb.
136
-
137
- #### Fill in your API keys
138
-
139
- Edit the keys with your own credentials in `config/initializers/smartpay.rb`.
140
-
141
- ```ruby
142
- ...
143
- config.public_key = '<YOUR_PUBLIC_KEY>' # the one starts with pk_test_
144
- config.secret_key = '<YOUR_SECRET_KEY>' # the one starts with sk_test_
145
- ...
146
- ```
147
-
148
- #### Start your server
149
-
150
- ```sh
151
- bundle exec rails server
152
- ```
153
-
154
- ### Test with Checkout Session
155
-
156
- Visit [http://localhost:3000/smartpays](http://localhost:3000/smartpays).
157
-
158
- Click the `checkout` button on the page to be redirected to Smartpay's Checkout.
159
-
160
- To try out different cases, you can use the following test credit cards for different cases:
161
-
162
- - Payment succeeds: `4242 4242 4242 4242`
163
- - Payment is declined: `4100 0000 0000 0019`
164
-
165
- ## Development
166
-
167
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
168
-
169
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
170
-
171
- ## Contributing
172
-
173
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/smartpay. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/smartpay/blob/master/CODE_OF_CONDUCT.md).
174
-
175
- ## License
176
-
177
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
178
-
179
- ## Code of Conduct
180
-
181
- Everyone interacting in the Smartpay project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/smartpay/blob/master/CODE_OF_CONDUCT.md).
1
+ # Smartpay Ruby Library
2
+
3
+ The Smartpay Ruby library offers easy access to Smartpay API from applications written in Ruby.
4
+
5
+ ## Documentation
6
+
7
+ - [Payment Flow](https://docs.smartpay.co/#payment_flow)
8
+ - [API Document](https://api-doc.smartpay.co)
9
+
10
+ ## Requirements
11
+
12
+ - Ruby 2.6+
13
+ - Smartpay `API keys & secrets`. You can find your credential at the `settings > credentials` page on your [dashboard](https://dashboard.smartpay.co/settings/credentials).
14
+
15
+ ## Installation
16
+
17
+ If you use system built-in Ruby, you might need to be the `sudoer` to be able to `sudo` in some of the following steps. We recommend you to use either [rbenv](https://github.com/rbenv/rbenv) or [rvm](https://rvm.io/) to have your own non-global Ruby to avoid potential permission issues.
18
+
19
+ Once you have your Ruby in place, add the latest version of Smartpay to your project's dependencies:
20
+
21
+ ```sh
22
+ gem install smartpay
23
+ ```
24
+
25
+ If you want to build the gem yourself from source:
26
+
27
+ ```sh
28
+ gem build smartpay.gemspec
29
+ ```
30
+
31
+ ### Bundler
32
+
33
+ If you are installing via bundler, make sure that you use the `https` resource in your Gemfile to avoid the risk of gems being compromised:
34
+
35
+ ```ruby
36
+ source 'https://rubygems.org'
37
+
38
+ gem 'smartpay'
39
+ ```
40
+
41
+ ## Usage
42
+
43
+ The package needs to be configured with your own API keys, you can find them on your [dashboard](https://dashboard.smartpay.co/settings/credentials).
44
+
45
+ ```ruby
46
+ Smartpay.configure do |config|
47
+ config.public_key = '<YOUR_PUBLIC_KEY>' # the one starts with pk_test_
48
+ config.secret_key = '<YOUR_SECRET_KEY>' # the one starts with sk_test_
49
+ end
50
+ ```
51
+
52
+ ### Create Checkout session
53
+
54
+ You can find the description and requirement for request payload in [API Document](https://api-doc.smartpay.co/#8a3538b1-530c-448c-8bae-4a41cdf0b8fd).
55
+
56
+ ```ruby
57
+ payloaad = {
58
+ "customerInfo": {
59
+ "emailAddress": "success@smartpay.co",
60
+ },
61
+ "orderData": {
62
+ "amount": 250,
63
+ "currency": "JPY",
64
+ "shippingInfo": {
65
+ "address": {
66
+ "line1": "line1",
67
+ "locality": "locality",
68
+ "postalCode": "123",
69
+ "country": "JP"
70
+ },
71
+ },
72
+ "lineItemData": [{
73
+ "priceData": {
74
+ "productData": {
75
+ "name": "レブロン 18 LOW",
76
+ },
77
+ "amount": 250,
78
+ "currency": "JPY",
79
+ },
80
+ "quantity": 1
81
+ }]
82
+ },
83
+ "reference": "order_ref_1234567",
84
+ "successUrl": "https://docs.smartpay.co/example-pages/checkout-successful",
85
+ "cancelUrl": "https://docs.smartpay.co/example-pages/checkout-canceled"
86
+ }
87
+ ```
88
+
89
+ Create a checkout session by using `Smartpay::Api.create_checkout_session` with your request payload.
90
+
91
+ ```ruby
92
+ session = Smartpay::Api.create_checkout_session(payload)
93
+ ```
94
+
95
+ Then, you can redirect your customer to the session url by calling `redirect_url`:
96
+
97
+ ```ruby
98
+ session.redirect_url
99
+ ```
100
+
101
+ ## Use with your favorite frameworks
102
+
103
+ ### Ruby on Rails (RoR)
104
+
105
+ #### Install Rails
106
+
107
+ ```sh
108
+ gem install rails
109
+ ```
110
+
111
+ #### Create your app
112
+
113
+ ```sh
114
+ rails new app-with-smartpay
115
+ ```
116
+
117
+ #### Add Smartpay
118
+
119
+ ```sh
120
+ cd app-with-smartpay
121
+ bundle add smartpay
122
+ ```
123
+
124
+ #### Generator
125
+
126
+ ```sh
127
+ bundle exec rails generate smartpay:install
128
+ ```
129
+
130
+ This introduces 4 changes for a pre-built Smartpay Checkout example:
131
+
132
+ > 1. A new initializer - `config/initializers/smartpay.rb`. You will have to update the `config.public_key` and `config.secret_key` with your own credentials to make this work.
133
+ > 2. A new controller - `app/controllers/smartpays_controller.rb`. This is where you can see how a Checkout session is configured & created.
134
+ > 3. A new view - `app/views/smartpays/index.html.erb`. The minimum frontend required.
135
+ > 4. A new route in config/routes.rb.
136
+
137
+ #### Fill in your API keys
138
+
139
+ Edit the keys with your own credentials in `config/initializers/smartpay.rb`.
140
+
141
+ ```ruby
142
+ ...
143
+ config.public_key = '<YOUR_PUBLIC_KEY>' # the one starts with pk_test_
144
+ config.secret_key = '<YOUR_SECRET_KEY>' # the one starts with sk_test_
145
+ ...
146
+ ```
147
+
148
+ #### Start your server
149
+
150
+ ```sh
151
+ bundle exec rails server
152
+ ```
153
+
154
+ ### Test with Checkout Session
155
+
156
+ Visit [http://localhost:3000/smartpays](http://localhost:3000/smartpays).
157
+
158
+ Click the `checkout` button on the page to be redirected to Smartpay's Checkout.
159
+
160
+ To try out different cases, you can use the following test credit cards for different cases:
161
+
162
+ - Payment succeeds: `4242 4242 4242 4242`
163
+ - Payment is declined: `4100 0000 0000 0019`
164
+
165
+ ## Development
166
+
167
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
168
+
169
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
170
+
171
+ ## Contributing
172
+
173
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/smartpay. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/smartpay/blob/master/CODE_OF_CONDUCT.md).
174
+
175
+ ## License
176
+
177
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
178
+
179
+ ## Code of Conduct
180
+
181
+ Everyone interacting in the Smartpay project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/smartpay/blob/master/CODE_OF_CONDUCT.md).
data/lib/smartpay/api.rb CHANGED
@@ -1,13 +1,13 @@
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
+ end
12
+ end
13
+ end
@@ -1,44 +1,45 @@
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, payload: request_payload.to_json)
11
- JSON.parse(response.body, symbolize_names: true)
12
- end
13
-
14
- private
15
-
16
- def api_url(path)
17
- "#{Smartpay.configuration.api_url}#{path}"
18
- end
19
-
20
- def timeout
21
- Smartpay.configuration.post_timeout
22
- end
23
-
24
- def headers
25
- {
26
- accept: :json,
27
- content_type: :json,
28
- Authorization: "Basic #{secret_key}"
29
- }
30
- end
31
-
32
- def secret_key
33
- Smartpay.configuration.secret_key
34
- end
35
-
36
- def default_payload
37
- {
38
- 'dev-lang': :ruby,
39
- 'sdk-version': Smartpay::VERSION
40
- }.freeze
41
- end
42
- end
43
- end
44
- end
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,30 +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 = DEFAULT_API_URL
15
- @checkout_url = DEFAULT_CHECKOUT_URL
16
- end
17
-
18
- def post_timeout
19
- @post_timeout || DEFAULT_TIMEOUT_SETTING
20
- end
21
-
22
- def api_url
23
- @api_url || DEFAULT_API_URL
24
- end
25
-
26
- def checkout_url
27
- @checkout_url || DEFAULT_CHECKOUT_URL
28
- end
29
- end
30
- 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,194 +1,120 @@
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
-
33
- {
34
- customerInfo: normalize_customer_info(payload.dig(:customerInfo) || payload.dig(:customer) || {}),
35
- orderData: normalize_order_data(payload.dig(:orderData) || {
36
- amount: total_amount,
37
- currency: currency,
38
- captureMethod: payload.dig(:captureMethod),
39
- confirmationMethod: payload.dig(:confirmationMethod),
40
- coupons: payload.dig(:coupons),
41
- shippingInfo: payload.dig(:shippingInfo) || normalize_shipping(payload.dig(:shipping)),
42
- lineItemData: payload.dig(:orderData, :lineItemData) || payload.dig(:items),
43
- description: payload.dig(:orderDescription),
44
- metadata: payload.dig(:orderMetadata)
45
- }),
46
- reference: payload.dig(:reference),
47
- metadata: payload.dig(:metadata),
48
- successUrl: payload.dig(:successURL),
49
- cancelUrl: payload.dig(:cancelURL),
50
- test: payload.dig(:test) || false
51
- }
52
- end
53
-
54
- def normalize_customer_info(info)
55
- return if info.nil?
56
- customer = info.transform_keys(&:to_sym)
57
- {
58
- accountAge: customer.dig(:accountAge),
59
- emailAddress: customer.dig(:emailAddress) || customer.dig(:email),
60
- firstName: customer.dig(:firstName),
61
- lastName: customer.dig(:lastName),
62
- firstNameKana: customer.dig(:firstNameKana),
63
- lastNameKana: customer.dig(:lastNameKana),
64
- address: customer.dig(:address),
65
- phoneNumber: customer.dig(:phoneNumber) || customer.dig(:phone),
66
- dateOfBirth: customer.dig(:dateOfBirth),
67
- legalGender: customer.dig(:legalGender) || customer.dig(:gender),
68
- reference: customer.dig(:reference)
69
- }
70
- end
71
-
72
- def normalize_shipping(shipping)
73
- return if shipping.nil?
74
- shipping= shipping.transform_keys(&:to_sym)
75
- {
76
- address: shipping.dig(:address) || {
77
- line1: shipping.dig(:line1),
78
- line2: shipping.dig(:line2),
79
- line3: shipping.dig(:line3),
80
- line4: shipping.dig(:line4),
81
- line5: shipping.dig(:line5),
82
- subLocality: shipping.dig(:subLocality),
83
- locality: shipping.dig(:locality),
84
- administrativeArea: shipping.dig(:administrativeArea),
85
- postalCode: shipping.dig(:postalCode),
86
- country: shipping.dig(:country),
87
- },
88
- addressType: shipping.dig(:addressType)
89
- }
90
- end
91
-
92
- def normalize_order_data(order)
93
- return if order.nil?
94
- order = order.transform_keys(&:to_sym)
95
- {
96
- amount: order.dig(:amount),
97
- currency: order.dig(:currency),
98
- captureMethod: order.dig(:captureMethod),
99
- confirmationMethod: order.dig(:confirmationMethod),
100
- coupons: order.dig(:coupons),
101
- shippingInfo: order.dig(:shippingInfo),
102
- lineItemData: normalize_line_items(order.dig(:lineItemData) || order.dig(:items))
103
- }
104
- end
105
-
106
- def normalize_line_items(data)
107
- return [] if data.nil?
108
-
109
- data.map do |item|
110
- line_item = item.transform_keys(&:to_sym)
111
- {
112
- price: line_item.dig(:price),
113
- priceData: normalize_price_data(line_item.dig(:priceData) || {
114
- productData: {
115
- name: line_item.dig(:name),
116
- brand: line_item.dig(:brand),
117
- categories: line_item.dig(:categories),
118
- gtin: line_item.dig(:gtin),
119
- images: line_item.dig(:images),
120
- reference: line_item.dig(:reference),
121
- url: line_item.dig(:url),
122
- description: line_item.dig(:productDescription),
123
- metadata: line_item.dig(:productMetadata)
124
- },
125
- amount: line_item.dig(:amount),
126
- currency: line_item.dig(:currency),
127
- label: line_item.dig(:label),
128
- description: line_item.dig(:priceDescription),
129
- metadata: line_item.dig(:priceMetadata)
130
- }),
131
- quantity: line_item.dig(:quantity),
132
- description: line_item.dig(:description),
133
- metadata: line_item.dig(:metadata)
134
- }
135
- end
136
- end
137
-
138
- def normalize_price_data(data)
139
- return if data.nil?
140
- data = data.transform_keys(&:to_sym)
141
- {
142
- productData: normalize_product_data(data.dig(:productData) || {}),
143
- amount: data.dig(:amount),
144
- currency: data.dig(:currency),
145
- metadata: data.dig(:metadata)
146
- }
147
- end
148
-
149
- def normalize_product_data(product)
150
- return if product.nil?
151
- product = product.transform_keys(&:to_sym)
152
- {
153
- name: product.dig(:name),
154
- brand: product.dig(:brand),
155
- categories: product.dig(:categories),
156
- description: product.dig(:description),
157
- gtin: product.dig(:gtin),
158
- images: product.dig(:images),
159
- reference: product.dig(:reference),
160
- url: product.dig(:url),
161
- metadata: product.dig(:metadata)
162
- }
163
- end
164
-
165
- def get_currency
166
- currency = payload.dig(:orderData, :currency) || payload.dig(:orderData, 'currency')
167
- if currency.nil?
168
- items = get_items
169
- if !items.nil? && items.count > 0
170
- currency = items.first.dig(:currency) || items.first.dig('currency')
171
- end
172
- end
173
- currency
174
- end
175
-
176
- def get_total_amount
177
- total_amount = payload.dig(:orderData, :amount) || payload.dig(:orderData, 'amount')
178
- if total_amount.nil?
179
- items = get_items
180
- if !items.nil? && items.count > 0
181
- total_amount = items.inject(0) { |sum, item| sum + (item[:amount] || item['amount'] || 0) }
182
- end
183
- end
184
- total_amount
185
- end
186
-
187
- def get_items
188
- @items ||= payload.dig(:orderData, :lineItemData, :priceData) ||
189
- payload.dig(:orderData, 'lineItemData', 'priceData') ||
190
- payload.dig(:items)
191
- end
192
- end
193
- end
194
- 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, :customerInfo, :currency, :items].freeze
9
+ CAN_FALLBACK_KEYS = [:customerInfo].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
+ {
36
+ customerInfo: normalize_customer_info(payload.dig(:customerInfo) || payload.dig(:customer) || {}),
37
+ amount: payload.dig(:amount),
38
+ captureMethod: payload.dig(:captureMethod),
39
+ currency: payload.dig(:currency),
40
+ description: payload.dig(:description),
41
+ shippingInfo: shipping_info,
42
+ items: normalize_items(payload.dig(:items)),
43
+ metadata: payload.dig(:metadata) || {},
44
+ reference: payload.dig(:reference),
45
+ successUrl: payload.dig(:successURL),
46
+ cancelUrl: payload.dig(:cancelURL),
47
+ test: payload.dig(:test) || false
48
+ }
49
+ end
50
+
51
+ def normalize_customer_info(info)
52
+ return if info.nil?
53
+ customer = info.transform_keys(&:to_sym)
54
+ {
55
+ accountAge: customer.dig(:accountAge),
56
+ emailAddress: customer.dig(:emailAddress) || customer.dig(:email),
57
+ firstName: customer.dig(:firstName),
58
+ lastName: customer.dig(:lastName),
59
+ firstNameKana: customer.dig(:firstNameKana),
60
+ lastNameKana: customer.dig(:lastNameKana),
61
+ address: customer.dig(:address),
62
+ phoneNumber: customer.dig(:phoneNumber) || customer.dig(:phone),
63
+ dateOfBirth: customer.dig(:dateOfBirth),
64
+ legalGender: customer.dig(:legalGender) || customer.dig(:gender),
65
+ reference: customer.dig(:reference)
66
+ }
67
+ end
68
+
69
+ def normalize_shipping(shipping)
70
+ return if shipping.nil?
71
+ shipping= shipping.transform_keys(&:to_sym)
72
+ {
73
+ address: shipping.dig(:address) || {
74
+ line1: shipping.dig(:line1),
75
+ line2: shipping.dig(:line2),
76
+ line3: shipping.dig(:line3),
77
+ line4: shipping.dig(:line4),
78
+ line5: shipping.dig(:line5),
79
+ subLocality: shipping.dig(:subLocality),
80
+ locality: shipping.dig(:locality),
81
+ administrativeArea: shipping.dig(:administrativeArea),
82
+ postalCode: shipping.dig(:postalCode),
83
+ country: shipping.dig(:country),
84
+ },
85
+ addressType: shipping.dig(:addressType),
86
+ feeAmount: shipping.dig(:feeAmount),
87
+ feeCurrency: shipping.dig(:feeCurrency),
88
+ }
89
+ end
90
+
91
+ def normalize_items(data)
92
+ return [] if data.nil?
93
+
94
+ data.map do |item|
95
+ line_item = item.transform_keys(&:to_sym)
96
+ {
97
+ quantity: line_item.dig(:quantity),
98
+ label: line_item.dig(:label),
99
+ name: line_item.dig(:name),
100
+ description: line_item.dig(:description),
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
+ end
119
+ end
120
+ end
@@ -1,35 +1,40 @@
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
13
- URI.escape("#{checkout_url}/login?session-id=#{response[:id]}&public-key=#{public_key}")
14
- end
15
-
16
- def as_hash
17
- @response
18
- end
19
-
20
- def as_json
21
- @response.to_json
22
- end
23
-
24
- private
25
-
26
- def checkout_url
27
- Smartpay.configuration.checkout_url
28
- end
29
-
30
- def public_key
31
- Smartpay.configuration.public_key
32
- end
33
- end
34
- end
35
- end
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,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Smartpay
4
- VERSION = "0.2.14"
4
+ VERSION = "0.2.18"
5
5
  end
data/lib/smartpay.rb CHANGED
@@ -1,25 +1,25 @@
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/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
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.14
4
+ version: 0.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Smartpay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-28 00:00:00.000000000 Z
11
+ date: 2022-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client