smartpay 0.2.18 → 0.3.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 +4 -4
- data/.rubocop.yml +13 -13
- data/README.md +181 -181
- data/lib/smartpay/api.rb +13 -13
- data/lib/smartpay/client.rb +45 -45
- data/lib/smartpay/configuration.rb +48 -48
- data/lib/smartpay/requests/checkout_session.rb +120 -120
- data/lib/smartpay/responses/checkout_session.rb +40 -40
- data/lib/smartpay/version.rb +1 -1
- data/lib/smartpay.rb +25 -25
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 047abea76f72b96fe9f59b2f7e384ef8871d001ef60ae0e6064f767823f273ba
|
4
|
+
data.tar.gz: bd164be4d8ae9747a3331f68192e65e82061bc0627ec4dcdf79389645c9c1828
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 635fbaaf5b186283fcb438f34176aa925f013576098b8535d1e7e1a9e59431db1acb16a7a545d77434bc114465ff3675768c763e084a5aabd01dd7df4f47be2f
|
7
|
+
data.tar.gz: 053a91da14d3fa5097b3ca70b5106878ab564680769c8ca8a9b70036c5915240980492dd5cecbe7b743c5f843db032311aec0e075b403893b68070e522451358
|
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/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
|
data/lib/smartpay/client.rb
CHANGED
@@ -1,45 +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,
|
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 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,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,120 +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, :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
|
+
# 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,40 +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(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
|
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
|
data/lib/smartpay/version.rb
CHANGED
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.
|
4
|
+
version: 0.3.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-
|
11
|
+
date: 2022-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
|
-
rubygems_version: 3.
|
93
|
+
rubygems_version: 3.2.32
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: The Smartpay Ruby SDK offers easy access to Smartpay API from applications
|