payson_api 0.4.2 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +5 -5
  2. data/MIT-LICENSE +16 -17
  3. data/README.md +228 -0
  4. data/lib/payson_api.rb +55 -22
  5. data/lib/payson_api/v1/client.rb +80 -0
  6. data/lib/payson_api/v1/config.rb +63 -0
  7. data/lib/payson_api/v1/envelope.rb +27 -0
  8. data/lib/payson_api/v1/errors/unknown_currency_error.rb +13 -0
  9. data/lib/payson_api/v1/errors/unknown_fees_payer_error.rb +13 -0
  10. data/lib/payson_api/v1/errors/unknown_funding_constraint_error.rb +13 -0
  11. data/lib/payson_api/v1/errors/unknown_guarantee_offering_error.rb +13 -0
  12. data/lib/payson_api/v1/errors/unknown_locale_error.rb +13 -0
  13. data/lib/payson_api/v1/errors/unknown_payment_action_error.rb +13 -0
  14. data/lib/payson_api/v1/funding.rb +38 -0
  15. data/lib/payson_api/v1/order_item.rb +43 -0
  16. data/lib/payson_api/v1/receiver.rb +46 -0
  17. data/lib/payson_api/v1/remote_error.rb +36 -0
  18. data/lib/payson_api/v1/requests/ipn.rb +19 -0
  19. data/lib/payson_api/v1/requests/payment.rb +68 -0
  20. data/lib/payson_api/v1/requests/payment_details.rb +19 -0
  21. data/lib/payson_api/v1/requests/payment_update.rb +27 -0
  22. data/lib/payson_api/v1/responses/ipn.rb +43 -0
  23. data/lib/payson_api/v1/responses/payment.rb +25 -0
  24. data/lib/payson_api/v1/responses/payment_details.rb +50 -0
  25. data/lib/payson_api/v1/responses/payment_update.rb +20 -0
  26. data/lib/payson_api/v1/responses/validate.rb +19 -0
  27. data/lib/payson_api/v1/sender.rb +28 -0
  28. data/lib/payson_api/v1/shipping_address.rb +34 -0
  29. data/lib/payson_api/v2/client.rb +67 -0
  30. data/lib/payson_api/v2/config.rb +51 -0
  31. data/lib/payson_api/v2/errors/unauthorized_error.rb +10 -0
  32. data/lib/payson_api/v2/errors/validation_error.rb +16 -0
  33. data/lib/payson_api/v2/models/account.rb +23 -0
  34. data/lib/payson_api/v2/models/checkout.rb +28 -0
  35. data/lib/payson_api/v2/models/customer.rb +27 -0
  36. data/lib/payson_api/v2/models/merchant.rb +24 -0
  37. data/lib/payson_api/v2/models/order.rb +32 -0
  38. data/lib/payson_api/v2/models/order_item.rb +33 -0
  39. data/lib/payson_api/v2/requests/create_checkout.rb +26 -0
  40. data/lib/payson_api/v2/requests/customer.rb +23 -0
  41. data/lib/payson_api/v2/requests/list_checkouts.rb +23 -0
  42. data/lib/payson_api/v2/requests/merchant.rb +25 -0
  43. data/lib/payson_api/v2/requests/order.rb +22 -0
  44. data/lib/payson_api/v2/requests/order_item.rb +27 -0
  45. data/lib/payson_api/v2/requests/update_checkout.rb +25 -0
  46. data/lib/payson_api/version.rb +3 -1
  47. metadata +70 -53
  48. data/.gitignore +0 -7
  49. data/.travis.yml +0 -5
  50. data/Gemfile +0 -2
  51. data/Guardfile +0 -9
  52. data/README.rdoc +0 -155
  53. data/Rakefile +0 -24
  54. data/lib/payson_api/client.rb +0 -79
  55. data/lib/payson_api/config.rb +0 -50
  56. data/lib/payson_api/envelope.rb +0 -21
  57. data/lib/payson_api/funding.rb +0 -34
  58. data/lib/payson_api/order_item.rb +0 -52
  59. data/lib/payson_api/receiver.rb +0 -52
  60. data/lib/payson_api/remote_error.rb +0 -31
  61. data/lib/payson_api/request/ipn.rb +0 -15
  62. data/lib/payson_api/request/payment.rb +0 -68
  63. data/lib/payson_api/request/payment_details.rb +0 -15
  64. data/lib/payson_api/request/payment_update.rb +0 -22
  65. data/lib/payson_api/response/ipn.rb +0 -36
  66. data/lib/payson_api/response/payment.rb +0 -22
  67. data/lib/payson_api/response/payment_details.rb +0 -43
  68. data/lib/payson_api/response/payment_update.rb +0 -16
  69. data/lib/payson_api/response/validate.rb +0 -15
  70. data/lib/payson_api/sender.rb +0 -29
  71. data/lib/payson_api/shipping_address.rb +0 -36
  72. data/payson_api.gemspec +0 -23
  73. data/test/fixtures/config.yml +0 -2
  74. data/test/fixtures/payment_data.yml +0 -37
  75. data/test/integration/config_test.rb +0 -15
  76. data/test/integration/payment_details_test.rb +0 -21
  77. data/test/integration/payment_test.rb +0 -65
  78. data/test/test_helper.rb +0 -76
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4ef5fc19d66f6c88ff9de08f1ae85c7de641476e
4
- data.tar.gz: e131324564a0984beddda436dcd664c9758433d3
2
+ SHA256:
3
+ metadata.gz: 66f555c3be4e18baaad0ed1785a94c4c9b248d62aabf7cbb1caeab6c3e55ae17
4
+ data.tar.gz: 6d95db7cf0198afa8ebae7fee4d077c87b306982eb70e533f71248fa7fbbbb4a
5
5
  SHA512:
6
- metadata.gz: e2a39cda7250f024ef82f08f054aa3f160e28ec1b16632791ee274a5cf7f7c492d9a71c5afbaa644128aa0cb7da0abfc00d7fc5cfab7d1b23d12b76c41adb879
7
- data.tar.gz: 09d939aff8988e0b9fefcffff9e46d59c2b067b0f8ed80c2cdb71a6c027f912451d6e8d99225282fa296288acc9264930a6c1a2b8dbfae9331c9e20e41162fc8
6
+ metadata.gz: 0dbfff1f59b35aa89efed837854bc9b5afd3c7e6a4dceec2574715e54ceb60bd210b104803ede5f7ab8edf76999d3f037420aee9241789be178067352d37d238
7
+ data.tar.gz: cb319533f28f26526b83bffc112a5ebd6ba47ed82b16ff2724066d23032f6dea4ab00a2045ff883b15a3c34570f0bac914e27a491f56267496948c8c7445fa9e
data/MIT-LICENSE CHANGED
@@ -1,20 +1,19 @@
1
- Copyright (c) 2012 Christopher Svensson
1
+ Copyright (c) 2021 Christopher Svensson
2
2
 
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
10
9
 
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
13
12
 
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,228 @@
1
+ # Payson API
2
+
3
+ A simple utility to handle requests against the Payson payment gateway API.
4
+
5
+ ## Supported Ruby versions
6
+
7
+ * 2.6
8
+ * 2.7
9
+ * 3.0
10
+
11
+ ## Install
12
+
13
+ Put this line in your Gemfile:
14
+
15
+ gem 'payson_api'
16
+
17
+ Then bundle:
18
+
19
+ $ bundle
20
+
21
+ ## Usage (v2)
22
+
23
+ This explains how to use this gem with the [Payson Checkout v2 API](https://tech.payson.se/paysoncheckout2).
24
+
25
+ ### General configuration options
26
+
27
+ You need to configure the gem with your own Payson credentials through the `PaysonAPI::V2.configure` method:
28
+
29
+ ```ruby
30
+ PaysonAPI::V2.configure do |config|
31
+ config.api_user_id = 'XXXX'
32
+ config.api_password = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
33
+ end
34
+ ```
35
+
36
+ Please note that if `config.api_user_id` is set to 4, the client will go into test mode. Valid test access credentials could be found in their [documentation](https://tech.payson.se/#Testing/sandbox).
37
+
38
+ For more detailed testing you may create your own test agent for use in the test environment. Use `config.test_mode = true`
39
+
40
+ ### Showing account info
41
+
42
+ ```ruby
43
+ account = PaysonAPI::V2::Client.get_account
44
+ ```
45
+
46
+ ### Creating a checkout
47
+
48
+ ```ruby
49
+ request = PaysonAPI::V2::Requests::CreateCheckout.new
50
+ request.merchant.checkout_uri = 'http://localhost/checkout'
51
+ request.merchant.confirmation_uri = 'http://localhost/confirmation'
52
+ request.merchant.notification_uri = 'http://localhost/notification'
53
+ request.merchant.terms_uri = 'http://localhost/terms'
54
+ request.order.currency = 'sek'
55
+ request.order.items << PaysonAPI::V2::Requests::OrderItem.new.tap do |item|
56
+ item.name = 'My product name'
57
+ item.unit_price = 1000
58
+ item.quantity = 3
59
+ item.reference = 'product-1'
60
+ end
61
+ ```
62
+
63
+ ### Updating a checkout
64
+
65
+ ```ruby
66
+ checkout = PaysonAPI::V2::Client.get_checkout(checkout_id)
67
+
68
+ request = PaysonAPI::V2::Requests::UpdateCheckout.new
69
+ request.id = checkout.id
70
+ request.status = checkout.status
71
+ request.merchant.checkout_uri = checkout.merchant.checkout_uri
72
+ request.merchant.confirmation_uri = checkout.merchant.confirmation_uri
73
+ request.merchant.notification_uri = checkout.merchant.notification_uri
74
+ request.merchant.terms_uri = checkout.merchant.terms_uri
75
+ request.order.currency = 'eur'
76
+ request.order.items << PaysonAPI::V2::Requests::OrderItem.new.tap do |item|
77
+ item.name = 'My product name'
78
+ item.unit_price = 200
79
+ item.quantity = 3
80
+ item.reference = 'product-1'
81
+ end
82
+ request.order.items << PaysonAPI::V2::Requests::OrderItem.new.tap do |item|
83
+ item.name = 'Another product name'
84
+ item.unit_price = 600
85
+ item.quantity = 1
86
+ item.reference = 'product-2'
87
+ end
88
+
89
+ checkout = PaysonAPI::V2::Client.update_checkout(request)
90
+ ```
91
+
92
+ ## Usage (v1)
93
+
94
+ This explains how to use the [Payson 1.0 API](https://tech.payson.se/paysoncheckout1).
95
+
96
+ ### General configuration options
97
+
98
+ You need to configure the gem with your own Payson credentials through the `PaysonAPI::V1.configure` method:
99
+
100
+ ```ruby
101
+ PaysonAPI::V1.configure do |config|
102
+ config.api_user_id = 'XXXX'
103
+ config.api_password = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
104
+ end
105
+ ```
106
+
107
+ Please note that if `config.api_user_id` is set to 4, the client will go into test mode. Valid test access credentials could be found in {documentation}[https://tech.payson.se/#Testing/sandbox].
108
+
109
+ For more detailed testing you may create your own test agent for use in the test environment. Use `config.test_mode = true`
110
+
111
+ ### Initiating a payment
112
+
113
+ ```ruby
114
+ payment = PaysonAPI::V1::Requests::Payment.new
115
+ payment.return_url = 'http://localhost/payson/success'
116
+ payment.cancel_url = 'http://localhost/payson/cancel'
117
+ payment.ipn_url = 'http://localhost/payson/ipn'
118
+ payment.memo = 'Sample order description'
119
+ payment.sender = sender
120
+
121
+ payment.sender = PaysonAPI::V1::Sender.new.tap do |s|
122
+ s.email = 'mycustomer@mydomain.com'
123
+ s.first_name = 'My'
124
+ s.last_name = 'Customer'
125
+ end
126
+
127
+ payment.receivers = []
128
+ payment.receivers << PaysonAPI::V1::Receiver.new.tap do |r|
129
+ r.email = 'me@mydomain.com'
130
+ r.amount = 100
131
+ r.first_name = 'Me'
132
+ r.last_name = 'Just me'
133
+ r.primary = true
134
+ end
135
+
136
+ payment.order_items = []
137
+ payment.order_items << PaysonAPI::V1::OrderItem.new.tap do |i|
138
+ i.description = 'Order item description'
139
+ i.unit_price = 100
140
+ i.quantity = 1
141
+ i.tax = 0
142
+ i.sku = 'MY-ITEM-1'
143
+ end
144
+
145
+ response = PaysonAPI::V1::Client.initiate_payment(payment)
146
+
147
+ if response.success?
148
+ # Redirect to response.forward_url
149
+ else
150
+ puts response.errors
151
+ end
152
+ ```
153
+
154
+ ### Requesting payment details
155
+
156
+ ```ruby
157
+ token = 'token-received-from-payment-request'
158
+
159
+ payment_details = PaysonAPI::V1::Requests::PaymentDetails.new(token)
160
+
161
+ response = PaysonAPI::V1::Client.get_payment_details(payment_details)
162
+
163
+ if response.success?
164
+ # Do stuff with response object
165
+ else
166
+ puts response.errors
167
+ end
168
+ ```
169
+
170
+ ### Updating a payment
171
+
172
+ ```ruby
173
+ token = 'token-received-from-payment-request'
174
+ action = 'CANCELORDER'
175
+
176
+ payment_update = PaysonAPI::V1::Requests::PaymentUpdate.new(token, action)
177
+
178
+ response = PaysonAPI::V1::Client.update_payment(payment_update)
179
+
180
+ if response.success?
181
+ # Do stuff with response object
182
+ else
183
+ puts response.errors
184
+ end
185
+ ```
186
+
187
+ ### Validating an IPN response
188
+
189
+ This example assumes the use of the Rails web framework.
190
+
191
+ ```ruby
192
+ class Payson < ApplicationController
193
+ def ipn_responder
194
+ request_body = request.body.read
195
+ ipn_response = PaysonAPI::V1::Responses::IPN.new(request_body)
196
+
197
+ # Create a new IPN request object containing the raw response from above
198
+ ipn_request = PaysonAPI::V1::Requests::IPN.new(ipn_response.raw)
199
+
200
+ validate = PaysonAPI::V1::Client.validate_ipn(ipn_request)
201
+
202
+ unless validate.verified?
203
+ raise "Something went terribly wrong."
204
+ end
205
+
206
+ # Do business transactions, e.g. update the corresponding order:
207
+ # order = Order.find_by_payson_token(ipn_response.token)
208
+ # order.payson_status = ipn_response.status
209
+ # order.save!
210
+ end
211
+ end
212
+ ```
213
+
214
+ ## Todo
215
+
216
+ Document the code for the Payson Checkout v2 processes.
217
+
218
+ ## Build Status
219
+
220
+ [![Build Status](https://travis-ci.org/stoffus/payson_api.svg?branch=master)](https://travis-ci.org/stoffus/payson_api)
221
+
222
+ ## Questions, Feedback
223
+
224
+ Feel free to message me on Github (stoffus).
225
+
226
+ ## Copyright
227
+
228
+ Copyright (c) 2021 Christopher Svensson.
data/lib/payson_api.rb CHANGED
@@ -1,25 +1,58 @@
1
- required_files = [
2
- 'config',
3
- 'client',
4
- 'envelope',
5
- 'funding',
6
- 'order_item',
7
- 'receiver',
8
- 'remote_error',
9
- 'request/ipn',
10
- 'request/payment_details',
11
- 'request/payment_update',
12
- 'request/payment',
13
- 'response/ipn',
14
- 'response/payment_details',
15
- 'response/payment_update',
16
- 'response/payment',
17
- 'response/validate',
18
- 'sender',
19
- 'shipping_address',
20
- 'version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'payson_api/version'
4
+
5
+ required_files_v1 = %w[
6
+ config
7
+ client
8
+ envelope
9
+ errors/unknown_currency_error
10
+ errors/unknown_fees_payer_error
11
+ errors/unknown_funding_constraint_error
12
+ errors/unknown_guarantee_offering_error
13
+ errors/unknown_locale_error
14
+ errors/unknown_payment_action_error
15
+ funding
16
+ order_item
17
+ receiver
18
+ remote_error
19
+ requests/ipn
20
+ requests/payment_details
21
+ requests/payment_update
22
+ requests/payment
23
+ responses/ipn
24
+ responses/payment_details
25
+ responses/payment_update
26
+ responses/payment
27
+ responses/validate
28
+ sender
29
+ shipping_address
30
+ ]
31
+
32
+ required_files_v2 = %w[
33
+ config
34
+ client
35
+ errors/validation_error
36
+ errors/unauthorized_error
37
+ models/account
38
+ models/checkout
39
+ models/customer
40
+ models/merchant
41
+ models/order_item
42
+ models/order
43
+ requests/order_item
44
+ requests/customer
45
+ requests/merchant
46
+ requests/order
47
+ requests/create_checkout
48
+ requests/update_checkout
49
+ requests/list_checkouts
21
50
  ]
22
51
 
23
- required_files.each do |file|
24
- require "payson_api/#{file}"
52
+ required_files_v1.each do |file|
53
+ require_relative "payson_api/v1/#{file}"
54
+ end
55
+
56
+ required_files_v2.each do |file|
57
+ require_relative "payson_api/v2/#{file}"
25
58
  end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/https'
4
+
5
+ module PaysonAPI
6
+ module V1
7
+ class Client
8
+ def self.initiate_payment(payment_data)
9
+ response = payson_request(
10
+ PAYSON_API_PAY_ACTION,
11
+ payment_data.to_hash
12
+ )
13
+ response_hash = params_to_hash(response.body)
14
+ PaysonAPI::V1::Responses::Payment.new(response_hash)
15
+ end
16
+
17
+ def self.get_payment_details(payment_details_data)
18
+ response = payson_request(
19
+ PAYSON_API_PAYMENT_DETAILS_ACTION,
20
+ payment_details_data.to_hash
21
+ )
22
+ response_hash = params_to_hash(response.body)
23
+ PaysonAPI::V1::Responses::PaymentDetails.new(response_hash)
24
+ end
25
+
26
+ def self.update_payment(payment_update_data)
27
+ response = payson_request(
28
+ PAYSON_API_PAYMENT_DETAILS_ACTION,
29
+ payment_update_data.to_hash
30
+ )
31
+ response_hash = params_to_hash(response.body)
32
+ PaysonAPI::V1::Responses::PaymentUpdate.new(response_hash)
33
+ end
34
+
35
+ def self.validate_ipn(ipn_data)
36
+ response = payson_request(
37
+ PAYSON_API_PAYMENT_VALIDATE_ACTION,
38
+ ipn_data.to_s
39
+ )
40
+ PaysonAPI::V1::Responses::Validate.new(response.body)
41
+ end
42
+
43
+ def self.hash_to_params(hash)
44
+ hash.map { |k, v| "#{k}=#{URI.encode_www_form_component(v.to_s)}" }.join('&')
45
+ end
46
+
47
+ def self.params_to_hash(params)
48
+ {}.tap do |hash|
49
+ params.split('&').each do |param|
50
+ key, val = param.split('=')
51
+ hash[key] = URI.decode_www_form_component(val)
52
+ end
53
+ end
54
+ end
55
+
56
+ def self.payson_request(action, data)
57
+ path = format('/%<api_version>s/%<action>s/', api_version: PAYSON_API_VERSION, action: action)
58
+ url = PaysonAPI::V1.api_base_url + path
59
+ headers = {
60
+ 'PAYSON-SECURITY-USERID' => PaysonAPI::V1.config.api_user_id,
61
+ 'PAYSON-SECURITY-PASSWORD' => PaysonAPI::V1.config.api_password,
62
+ 'Content-Type' => 'application/x-www-form-urlencoded'
63
+ }
64
+ post(url, data, headers)
65
+ end
66
+
67
+ def self.post(url, data, headers)
68
+ uri = URI.parse(url)
69
+ http = Net::HTTP.new(uri.host, uri.port)
70
+ http.use_ssl = uri.scheme == 'https'
71
+ req = Net::HTTP::Post.new(uri.request_uri)
72
+ req.body = data.is_a?(Hash) ? hash_to_params(data) : data
73
+ headers.each do |name, value|
74
+ req[name] = value
75
+ end
76
+ http.request(req)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PaysonAPI
4
+ module V1
5
+ module_function
6
+
7
+ PAYSON_WWW_HOST_ENDPOINT = 'https://www.payson.se'
8
+ PAYSON_WWW_PAY_FORWARD_URL = '/paysecure/?token=%s'
9
+
10
+ PAYSON_API_ENDPOINT = 'https://api.payson.se'
11
+ PAYSON_API_VERSION = '1.0'
12
+ PAYSON_API_PAY_ACTION = 'Pay'
13
+ PAYSON_API_PAYMENT_DETAILS_ACTION = 'PaymentDetails'
14
+ PAYSON_API_PAYMENT_UPDATE_ACTION = 'PaymentUpdate'
15
+ PAYSON_API_PAYMENT_VALIDATE_ACTION = 'Validate'
16
+
17
+ PAYSON_API_TEST_ENDPOINT = 'https://test-api.payson.se'
18
+ PAYSON_WWW_HOST_TEST_ENDPOINT = 'https://test-www.payson.se'
19
+
20
+ LOCALES = %w[SV EN FI].freeze
21
+ CURRENCIES = %w[SEK EUR].freeze
22
+ FEES_PAYERS = %w[EACHRECEIVER SENDER PRIMARYRECEIVER SECONDARYONLY].freeze
23
+ FUNDING_CONSTRAINTS = %w[CREDITCARD BANK INVOICE SMS].freeze
24
+ GUARANTEE_OFFERINGS = %w[OPTIONAL REQUIRED NO].freeze
25
+ PAYMENT_STATUSES = %w[CREATED PENDING PROCESSING COMPLETED CREDITED
26
+ INCOMPLETE ERROR EXPIRED REVERSALERROR ABORTED].freeze
27
+ PAYMENT_TYPES = %w[TRANSFER GUARANTEE INVOICE].freeze
28
+ GUARANTEE_STATUSES = %w[WAITINGFORSEND WAITINGFORACCEPTANCE WAITINGFORRETURN
29
+ WAITINGFORRETURNACCEPTANCE RETURNNOTACCEPTED NOTRECEIVED RETURNNOTRECEIVED
30
+ MONEYRETURNEDTOSENDER RETURNACCEPTED].freeze
31
+ INVOICE_STATUSES = %w[PENDING ORDERCREATED CANCELED SHIPPED DONE CREDITED].freeze
32
+ PAYMENT_ACTIONS = %w[CANCELORDER SHIPORDER CREDITORDER REFUND].freeze
33
+
34
+ def configure
35
+ yield @config ||= Configuration.new # rubocop:disable Naming/MemoizedInstanceVariableName
36
+ end
37
+
38
+ def config
39
+ @config
40
+ end
41
+
42
+ class Configuration
43
+ attr_accessor :api_user_id, :api_password, :test_mode
44
+ end
45
+
46
+ configure do |config|
47
+ config.api_user_id = 'XXXX'
48
+ config.api_password = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
49
+ end
50
+
51
+ def test?
52
+ @config.test_mode || @config.api_user_id == '4'
53
+ end
54
+
55
+ def api_base_url
56
+ test? ? PAYSON_API_TEST_ENDPOINT : PAYSON_API_ENDPOINT
57
+ end
58
+
59
+ def forward_url(token)
60
+ (test? ? PAYSON_WWW_HOST_TEST_ENDPOINT : PAYSON_WWW_HOST_ENDPOINT) + PAYSON_WWW_PAY_FORWARD_URL % token
61
+ end
62
+ end
63
+ end