smartpay 0.2.4 → 0.2.8

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: 6c3f54543398cb0fc174621f0527f86329337fb0bce18911f334b32389358db6
4
- data.tar.gz: fd7f015bfa49ec0bdf491e34113048098cae02c782abf3b1a8e8bf2df1799387
3
+ metadata.gz: b690d134a39f8c15358fddf3366232d36007e243d0f815d9f5c5b8a0d7c5ba97
4
+ data.tar.gz: 65826519cd1b6eaf41b35b81da6ace598d51e9bfec6188a1e4a8ff5dd0c1c69c
5
5
  SHA512:
6
- metadata.gz: 72b70c530d31746bc173e6544dec2681413c97f9ebb099afed726366400e2f5a3420bcc44e078ece36debfd8fd858aec05c77f346c994605eb7900e468774d25
7
- data.tar.gz: ff85cd4be5986f315734e67d312b9f0696c7702ca11cb4a4d6768808c26a4557d23f01851f37fbd9506e178399a02224aacceee7e9e32719f2629cbceb95a109
6
+ metadata.gz: 760b95974a074df025f9d12bdd07477d16395deff65d7322ea35f0473e8aefe0a3055be7c741e6a0417aa9a13fe682b3fec21f41cf6f3968310892402e8ee066
7
+ data.tar.gz: 803cb1451a936e3def75c46a6e7c4c702c070ea473066c68edc1a1b7163109d36062a6b579267c47b4fb0da075f34ae3a459d172801b28a13125c3c39eb01dd7
@@ -3,66 +3,43 @@ class SmartpaysController < ApplicationController
3
3
  end
4
4
 
5
5
  def create
6
- session = Smartpay::Api.create_checkout_session(
7
- {
8
- "customerInfo": {
9
- "emailAddress": "success@smartpay.co",
10
- "firstName": nil,
11
- "lastName": nil,
12
- "firstNameKana": nil,
13
- "lastNameKana": nil,
14
- "address": nil,
15
- "phoneNumber": nil,
16
- "dateOfBirth": nil,
17
- "legalGender": nil,
18
- "reference": nil
6
+ session = Smartpay::Api.create_checkout_session({
7
+ items: [{
8
+ name: "オリジナルス STAN SMITH",
9
+ amount: 250,
10
+ currency: "JPY",
11
+ quantity: 1
12
+ }],
13
+ customer: {
14
+ accountAge: 20,
15
+ email: "merchant-support@smartpay.co",
16
+ firstName: "田中",
17
+ lastName: "太郎",
18
+ firstNameKana: "たなか",
19
+ lastNameKana: "たろう",
20
+ address: {
21
+ line1: "3-6-7",
22
+ line2: "青山パラシオタワー 11階",
23
+ subLocality: "",
24
+ locality: "港区北青山",
25
+ administrativeArea: "東京都",
26
+ postalCode: "107-0061",
27
+ country: "JP"
19
28
  },
20
- "orderData": {
21
- "amount": 250,
22
- "currency": "JPY",
23
- "captureMethod": nil,
24
- "confirmationMethod": nil,
25
- "coupons": nil,
26
- "shippingInfo": {
27
- "address": {
28
- "line1": "line1",
29
- "line2": nil,
30
- "line3": nil,
31
- "line4": nil,
32
- "line5": nil,
33
- "subLocality": nil,
34
- "locality": "locality",
35
- "administrativeArea": nil,
36
- "postalCode": "123",
37
- "country": "JP"},
38
- "addressType": nil},
39
- "lineItemData": [{
40
- "price": nil,
41
- "priceData": {
42
- "productData": {
43
- "name": "レブロン 18 LOW",
44
- "brand": nil,
45
- "categories": nil,
46
- "description": nil,
47
- "gtin": nil,
48
- "images": nil,
49
- "reference": nil,
50
- "url": nil,
51
- "metadata": nil},
52
- "amount": 250,
53
- "currency": "JPY",
54
- "metadata": nil},
55
- "quantity": 1,
56
- "description": nil,
57
- "metadata": nil
58
- }]
59
- },
60
- "reference": "order_ref_1234567",
61
- "metadata": nil,
62
- "successUrl": "https://docs.smartpay.co/example-pages/checkout-successful",
63
- "cancelUrl": "https://docs.smartpay.co/example-pages/checkout-canceled",
64
- "test": true
65
- })
29
+ dateOfBirth: "1985-06-30",
30
+ gender: "male"
31
+ },
32
+ shipping: {
33
+ line1: "line1",
34
+ locality: "locality",
35
+ postalCode: "123",
36
+ country: "JP"
37
+ },
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",
41
+ test: true
42
+ })
66
43
  redirect_to session.redirect_url
67
44
  end
68
45
  end
data/lib/smartpay/api.rb CHANGED
@@ -4,7 +4,9 @@ module Smartpay
4
4
  class Api
5
5
  class << self
6
6
  def create_checkout_session(payload)
7
- Responses::CheckoutSession.new(Client.post('/checkout/sessions', payload))
7
+ Responses::CheckoutSession.new(
8
+ Client.post('/checkout/sessions', Requests::CheckoutSession.new(payload).as_hash)
9
+ )
8
10
  end
9
11
  end
10
12
  end
@@ -24,12 +24,12 @@ module Smartpay
24
24
  {
25
25
  accept: :json,
26
26
  content_type: :json,
27
- Authorization: "Basic #{private_api_key}"
27
+ Authorization: "Basic #{secret_key}"
28
28
  }
29
29
  end
30
30
 
31
- def private_api_key
32
- Smartpay.configuration.private_api_key
31
+ def secret_key
32
+ Smartpay.configuration.secret_key
33
33
  end
34
34
  end
35
35
  end
@@ -0,0 +1,16 @@
1
+ module Smartpay
2
+ module Errors
3
+ class InvalidRequestPayloadError < ArgumentError
4
+ attr_accessor :key_name
5
+
6
+ def initialize(key_name)
7
+ @key_name = key_name
8
+ super
9
+ end
10
+
11
+ def message
12
+ "#{key_name} can't be blank."
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,187 @@
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
+ {
75
+ address: shipping.dig(:address) || {
76
+ line1: shipping.dig(:line1),
77
+ line2: shipping.dig(:line2),
78
+ line3: shipping.dig(:line3),
79
+ line4: shipping.dig(:line4),
80
+ line5: shipping.dig(:line5),
81
+ subLocality: shipping.dig(:subLocality),
82
+ locality: shipping.dig(:locality),
83
+ administrativeArea: shipping.dig(:administrativeArea),
84
+ postalCode: shipping.dig(:postalCode),
85
+ country: shipping.dig(:country),
86
+ },
87
+ addressType: shipping.dig(:addressType)
88
+ }
89
+ end
90
+
91
+ def normalize_order_data(order)
92
+ return if order.nil?
93
+ order = order.transform_keys(&:to_sym)
94
+ {
95
+ amount: order.dig(:amount),
96
+ currency: order.dig(:currency),
97
+ captureMethod: order.dig(:captureMethod),
98
+ confirmationMethod: order.dig(:confirmationMethod),
99
+ coupons: order.dig(:coupons),
100
+ shippingInfo: order.dig(:shippingInfo),
101
+ lineItemData: normalize_line_items(order.dig(:lineItemData) || order.dig(:items))
102
+ }
103
+ end
104
+
105
+ def normalize_line_items(data)
106
+ return [] if data.nil?
107
+
108
+ data.map do |item|
109
+ line_item = item.transform_keys(&:to_sym)
110
+ {
111
+ price: line_item.dig(:price),
112
+ priceData: normalize_price_data(line_item.dig(:priceData) || {
113
+ productData: {
114
+ name: line_item.dig(:name),
115
+ brand: line_item.dig(:brand),
116
+ categories: line_item.dig(:categories),
117
+ gtin: line_item.dig(:gtin),
118
+ images: line_item.dig(:images),
119
+ reference: line_item.dig(:reference),
120
+ url: line_item.dig(:url),
121
+ description: line_item.dig(:productDescription),
122
+ metadata: line_item.dig(:productMetadata)
123
+ },
124
+ amount: line_item.dig(:amount),
125
+ currency: line_item.dig(:currency),
126
+ label: line_item.dig(:label),
127
+ description: line_item.dig(:priceDescription),
128
+ metadata: line_item.dig(:priceMetadata)
129
+ }),
130
+ quantity: line_item.dig(:quantity),
131
+ description: line_item.dig(:description),
132
+ metadata: line_item.dig(:metadata)
133
+ }
134
+ end
135
+ end
136
+
137
+ def normalize_price_data(data)
138
+ return if data.nil?
139
+ data = data.transform_keys(&:to_sym)
140
+ {
141
+ productData: normalize_product_data(data.dig(:productData) || {}),
142
+ amount: data.dig(:amount),
143
+ currency: data.dig(:currency),
144
+ metadata: data.dig(:metadata)
145
+ }
146
+ end
147
+
148
+ def normalize_product_data(product)
149
+ return if product.nil?
150
+ product = product.transform_keys(&:to_sym)
151
+ {
152
+ name: product.dig(:name),
153
+ brand: product.dig(:brand),
154
+ categories: product.dig(:categories),
155
+ description: product.dig(:description),
156
+ gtin: product.dig(:gtin),
157
+ images: product.dig(:images),
158
+ reference: product.dig(:reference),
159
+ url: product.dig(:url),
160
+ metadata: product.dig(:metadata)
161
+ }
162
+ end
163
+
164
+ def get_currency
165
+ currency = payload.dig(:orderData, :currency) || payload.dig(:orderData, 'currency')
166
+ if currency.nil?
167
+ items = payload.dig(:orderData, :lineItemData, :priceData) || payload.dig(:items)
168
+ if !items.nil? && items.count > 0
169
+ currency = items.first.dig(:currency) || item.first.dig('currency')
170
+ end
171
+ end
172
+ currency
173
+ end
174
+
175
+ def get_total_amount
176
+ total_amount = payload.dig(:orderData, :amount) || payload.dig(:orderData, 'amount')
177
+ if total_amount.nil?
178
+ items = payload.dig(:orderData, :lineItemData, :priceData) || payload.dig(:items)
179
+ if !items.nil? && items.count > 0
180
+ total_amount = items.inject(0) { |sum, item| sum + (item[:amount] || item['amount'] || 0) }
181
+ end
182
+ end
183
+ total_amount
184
+ end
185
+ end
186
+ end
187
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Smartpay
4
- VERSION = "0.2.4"
4
+ VERSION = "0.2.8"
5
5
  end
data/lib/smartpay.rb CHANGED
@@ -6,6 +6,8 @@ require_relative "smartpay/version"
6
6
  require_relative 'smartpay/configuration'
7
7
  require_relative 'smartpay/client'
8
8
  require_relative 'smartpay/api'
9
+ require_relative 'smartpay/errors/invalid_request_payload_error'
10
+ require_relative 'smartpay/requests/checkout_session'
9
11
  require_relative 'smartpay/responses/checkout_session'
10
12
 
11
13
  module Smartpay
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.4
4
+ version: 0.2.8
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-22 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -64,6 +64,8 @@ files:
64
64
  - lib/smartpay/api.rb
65
65
  - lib/smartpay/client.rb
66
66
  - lib/smartpay/configuration.rb
67
+ - lib/smartpay/errors/invalid_request_payload_error.rb
68
+ - lib/smartpay/requests/checkout_session.rb
67
69
  - lib/smartpay/responses/checkout_session.rb
68
70
  - lib/smartpay/version.rb
69
71
  homepage: https://smartpay.co