spree_vpago 2.4.0.pre.pre2 → 2.4.0.pre.pre4

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/app/assets/config/spree_vpago_manifest.js +2 -0
  4. data/app/assets/javascripts/vpago/wing_mini_app/login.js +75 -0
  5. data/app/assets/javascripts/vpago/wing_mini_app/web_jsbridge.bundle.js +1507 -0
  6. data/app/controllers/concerns/spree/mini_app_concern.rb +25 -0
  7. data/app/controllers/spree/admin/payment_acleda_v2_base_controller.rb +21 -0
  8. data/app/controllers/spree/admin/payment_acleda_v2_checkers_controller.rb +26 -0
  9. data/app/controllers/spree/admin/payment_acleda_v2_queriers_controller.rb +38 -0
  10. data/app/controllers/spree/admin/payment_payway_queriers_controller.rb +7 -0
  11. data/app/controllers/spree/admin/payment_vattanac_base_controller.rb +21 -0
  12. data/app/controllers/spree/admin/payment_vattanac_checkers_controller.rb +26 -0
  13. data/app/controllers/spree/admin/payment_vattanac_queriers_controller.rb +38 -0
  14. data/app/controllers/spree/{miniapp → mini_app}/acledas_controller.rb +12 -6
  15. data/app/controllers/spree/mini_app/wings_controller.rb +58 -0
  16. data/app/controllers/spree/vpago_payments_controller.rb +15 -3
  17. data/app/helpers/vpago/vpago_payments_helper.rb +6 -0
  18. data/app/models/spree/gateway/acleda_mini_app.rb +4 -6
  19. data/app/models/spree/gateway/wing_mini_app.rb +58 -0
  20. data/app/models/vpago/payment_decorator.rb +4 -0
  21. data/app/models/vpago/payment_method_decorator.rb +14 -0
  22. data/app/serializers/spree/v2/storefront/payment_method_serializer_decorator.rb +6 -0
  23. data/app/services/vpago/acleda_mini_app/session/create.rb +45 -23
  24. data/app/services/vpago/payment_finder.rb +11 -0
  25. data/app/services/vpago/wing_mini_app/session/create.rb +55 -0
  26. data/app/views/layouts/wing_mini_app.html.erb +20 -0
  27. data/app/views/spree/admin/payments/source_views/_acleda_v2.html.erb +2 -2
  28. data/app/views/spree/admin/payments/source_views/_vattanac.html.erb +3 -3
  29. data/app/views/spree/admin/payments/source_views/_wing_mini_app.html.erb +6 -0
  30. data/app/views/spree/mini_app/wings/show.html.erb +44 -0
  31. data/app/views/spree/vpago_payments/_success_script.html.erb +7 -0
  32. data/app/views/spree/vpago_payments/forms/spree/gateway/_acleda_mini_app.html.erb +80 -79
  33. data/app/views/spree/vpago_payments/forms/spree/gateway/_wing_mini_app.html.erb +88 -0
  34. data/app/views/spree/vpago_payments/processing_scripts/spree/gateway/_wing_mini_app.html.erb +15 -0
  35. data/app/views/spree/vpago_payments/success.html.erb +2 -0
  36. data/config/locales/en.yml +1 -0
  37. data/config/locales/km.yml +1 -0
  38. data/config/routes.rb +17 -4
  39. data/lib/spree_vpago/engine.rb +1 -0
  40. data/lib/spree_vpago/version.rb +1 -1
  41. data/lib/vpago/acleda_mini_app/checkout.rb +5 -9
  42. data/lib/vpago/acleda_mini_app/session_hash_validator.rb +35 -0
  43. data/lib/vpago/acleda_v2/payment_request_updater.rb +54 -0
  44. data/lib/vpago/http_timeouts.rb +6 -0
  45. data/lib/vpago/payway_v2/payment_request_updater.rb +5 -0
  46. data/lib/vpago/payway_v2/transaction_status.rb +2 -0
  47. data/lib/vpago/payway_v2/transaction_status_v2.rb +2 -0
  48. data/lib/vpago/true_money/base.rb +1 -1
  49. data/lib/vpago/true_money/transaction_status.rb +1 -1
  50. data/lib/vpago/vattanac/base.rb +3 -2
  51. data/lib/vpago/vattanac/payment_request_updater.rb +54 -0
  52. data/lib/vpago/vattanac/transaction_status.rb +17 -1
  53. data/lib/vpago/wing_mini_app/checkout.rb +60 -0
  54. data/lib/vpago/wing_mini_app/webhook_verifier.rb +78 -0
  55. metadata +27 -3
@@ -0,0 +1,6 @@
1
+ module Vpago
2
+ module HttpTimeouts
3
+ OPEN_TIMEOUT = 5
4
+ TIMEOUT = 15
5
+ end
6
+ end
@@ -28,6 +28,11 @@ module Vpago
28
28
  elsif checker.failed?
29
29
  mark_payment_as_failed(checker.error_message)
30
30
  end
31
+ rescue Faraday::TimeoutError, Faraday::ConnectionFailed => e
32
+ VpagoLogger.error(
33
+ label: 'Vpago::PaywayV2::PaymentRequestUpdater#process_payment_status gateway_timeout',
34
+ data: { payment_number: @payment.number, error_class: e.class.name, error_message: e.message }
35
+ )
31
36
  end
32
37
 
33
38
  def mark_payment_as_success(checker)
@@ -37,6 +37,8 @@ module Vpago
37
37
  def check_remote_status
38
38
  conn = Faraday::Connection.new do |faraday|
39
39
  faraday.request :url_encoded
40
+ faraday.options.open_timeout = Vpago::HttpTimeouts::OPEN_TIMEOUT
41
+ faraday.options.timeout = Vpago::HttpTimeouts::TIMEOUT
40
42
  end
41
43
 
42
44
  data = {
@@ -52,6 +52,8 @@ module Vpago
52
52
  def check_remote_status
53
53
  conn = Faraday::Connection.new do |faraday|
54
54
  faraday.request :url_encoded
55
+ faraday.options.open_timeout = Vpago::HttpTimeouts::OPEN_TIMEOUT
56
+ faraday.options.timeout = Vpago::HttpTimeouts::TIMEOUT
55
57
  end
56
58
 
57
59
  data = {
@@ -100,7 +100,7 @@ module Vpago
100
100
  end
101
101
 
102
102
  def fetch_access_token
103
- response = Faraday.post(
103
+ response = Faraday.new(request: { open_timeout: Vpago::HttpTimeouts::OPEN_TIMEOUT, timeout: Vpago::HttpTimeouts::TIMEOUT }).post(
104
104
  access_token_url,
105
105
  URI.encode_www_form(
106
106
  grant_type: 'client_credentials',
@@ -2,7 +2,7 @@ module Vpago
2
2
  module TrueMoney
3
3
  class TransactionStatus < Base
4
4
  def call
5
- @response = Faraday.get(check_transaction_url, nil, default_headers)
5
+ @response = Faraday.new(request: { open_timeout: Vpago::HttpTimeouts::OPEN_TIMEOUT, timeout: Vpago::HttpTimeouts::TIMEOUT }).get(check_transaction_url, nil, default_headers)
6
6
  end
7
7
 
8
8
  def success?
@@ -70,7 +70,8 @@ module Vpago
70
70
  private
71
71
 
72
72
  def fetch_access_token
73
- response = Faraday.post(access_token_url, { username: username, password: password }.to_json, { 'Content-Type' => CONTENT_TYPE_JSON })
73
+ response = Faraday.new(request: { open_timeout: Vpago::HttpTimeouts::OPEN_TIMEOUT, timeout: Vpago::HttpTimeouts::TIMEOUT })
74
+ .post(access_token_url, { username: username, password: password }.to_json, { 'Content-Type' => CONTENT_TYPE_JSON })
74
75
 
75
76
  raise "Access Token Error: #{response.status} - #{response.body}" unless response.success?
76
77
 
@@ -78,7 +79,7 @@ module Vpago
78
79
  end
79
80
 
80
81
  def post(url, body)
81
- response = Faraday.post(url, body.to_json, default_headers)
82
+ response = Faraday.new(request: { open_timeout: Vpago::HttpTimeouts::OPEN_TIMEOUT, timeout: Vpago::HttpTimeouts::TIMEOUT }).post(url, body.to_json, default_headers)
82
83
  parse_json(response.body)
83
84
  end
84
85
  end
@@ -0,0 +1,54 @@
1
+ module Vpago
2
+ module Vattanac
3
+ class PaymentRequestUpdater < ::Vpago::PaymentRequestUpdater
4
+ def call
5
+ return if @payment.order.paid?
6
+
7
+ if items_eligible?
8
+ process_payment_status
9
+ else
10
+ mark_items_as_ineligible
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def process_payment_status
17
+ checker = @payment.payment_method.check_transaction(@payment)
18
+
19
+ if checker.success?
20
+ mark_payment_as_success
21
+ elsif checker.failed? && !ignore_on_failed?
22
+ mark_payment_as_failed(checker.error_message)
23
+ end
24
+ rescue Faraday::TimeoutError, Faraday::ConnectionFailed => e
25
+ VpagoLogger.error(
26
+ label: 'Vpago::Vattanac::PaymentRequestUpdater#process_payment_status gateway_timeout',
27
+ data: { payment_number: @payment.number, error_class: e.class.name, error_message: e.message }
28
+ )
29
+ end
30
+
31
+ def items_eligible?
32
+ @payment&.order&.line_items&.all?(&:sufficient_stock?) == true # rubocop:disable Style/SafeNavigationChainLength
33
+ end
34
+
35
+ def mark_items_as_ineligible
36
+ @error_message = 'Items are not eligible due to insufficient stock'
37
+ marker_options = @options.merge(status: false, description: @error_message)
38
+ ::Vpago::PaymentStatusMarker.new(@payment, marker_options).call
39
+ end
40
+
41
+ def mark_payment_as_success
42
+ @error_message = nil
43
+ marker_options = @options.merge(status: true, description: nil)
44
+ ::Vpago::PaymentStatusMarker.new(@payment, marker_options).call
45
+ end
46
+
47
+ def mark_payment_as_failed(error_message)
48
+ @error_message = error_message
49
+ marker_options = @options.merge(status: false, description: @error_message)
50
+ ::Vpago::PaymentStatusMarker.new(@payment, marker_options).call
51
+ end
52
+ end
53
+ end
54
+ end
@@ -13,6 +13,22 @@ module Vpago
13
13
  @response.dig('data', 'status') == 'SUCCESS'
14
14
  end
15
15
 
16
+ def error_message
17
+ @response.dig('msgEntity', 'message') || @response.dig('data', 'message') || 'Unknown error'
18
+ end
19
+
20
+ # msgEntity.code is the API-envelope result code ("0" = call succeeded; check
21
+ # data.status for the actual transaction state). Any other code is a gateway-level
22
+ # error with no transaction data (e.g. "03" / "Transaction not found") and is
23
+ # treated as terminal failure.
24
+ def failed?
25
+ @response.dig('msgEntity', 'code').to_s != '0'
26
+ end
27
+
28
+ def pending?
29
+ !success? && !failed?
30
+ end
31
+
16
32
  private
17
33
 
18
34
  def payload
@@ -20,4 +36,4 @@ module Vpago
20
36
  end
21
37
  end
22
38
  end
23
- end
39
+ end
@@ -0,0 +1,60 @@
1
+ module Vpago
2
+ module WingMiniApp
3
+ # Builds the doPayment() payload (Wing Web JS Bridge SDK spec, Native API #2).
4
+ #
5
+ # useDefault is hardcoded true for this first cut — no "let the user pick
6
+ # another account" UI yet, same scope cut as shipping login before payment.
7
+ class Checkout
8
+ def initialize(payment)
9
+ @payment = payment
10
+ end
11
+
12
+ # Pure fields only — no payment_method preference lookup involved, safe to
13
+ # render/log/test directly. appId is left out here: it needs the gateway's
14
+ # own app_id, so it's added in #signed_payload alongside additionalKey instead.
15
+ def payload
16
+ {
17
+ account: account,
18
+ amount: amount,
19
+ currency: currency,
20
+ useDefault: true
21
+ }
22
+ end
23
+
24
+ # The full payload doPayment() actually needs, with appId and the
25
+ # server-side-only additionalKey.hash merged in. Never render
26
+ # `secret_api_key` itself into the page — only this derived hash.
27
+ def signed_payload
28
+ payload.merge(appId: app_id, additionalKey: { hash: hash, remark: '' })
29
+ end
30
+
31
+ def account
32
+ @payment.number
33
+ end
34
+
35
+ def amount
36
+ format('%.2f', @payment.amount)
37
+ end
38
+
39
+ def currency
40
+ @payment.currency
41
+ end
42
+
43
+ private
44
+
45
+ def app_id
46
+ payment_method.app_id
47
+ end
48
+
49
+ # uppercase(account+amount+currency+secretApiKey), per the spec.
50
+ def hash
51
+ plaintext = "#{account}#{amount}#{currency}#{payment_method.secret_api_key}"
52
+ Digest::SHA256.hexdigest(plaintext.upcase).upcase
53
+ end
54
+
55
+ def payment_method
56
+ @payment.payment_method
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,78 @@
1
+ module Vpago
2
+ module WingMiniApp
3
+ # Verifies a Wing getStatus/webhook payload (Wing Web JS Bridge SDK spec,
4
+ # Native-App Invoke #1 getStatus) is both authentic and correct for the
5
+ # payment it claims to settle. Both checks live here, in one place:
6
+ #
7
+ # - the secretKey signature (proves Wing sent this, for this orderRef —
8
+ # unlike getProfile, appId is our own configured value here, not a payload
9
+ # field, since the spec's getStatus response never includes one)
10
+ # - the doc-mandated amount/currency match (catches a validly-signed webhook
11
+ # that reports the wrong amount, since Wing holds the keys and could sign
12
+ # any amount for a real orderRef if something on their end got it wrong —
13
+ # not a forgery guard, since orderRef is itself part of what secretKey
14
+ # signs, so a valid signature is already bound to exactly this payment)
15
+ class WebhookVerifier
16
+ FIELDS = %w[orderRef debitAmount debitCcy transactionId transactionDate].freeze
17
+
18
+ # payment is the specific one this settlement claims to be for — both what
19
+ # verifies the signature (via its own payment_method's app_id/secret_api_key)
20
+ # and what the amount/currency check runs against.
21
+ def initialize(payload, payment)
22
+ @payload = payload.with_indifferent_access
23
+ @payment = payment
24
+ end
25
+
26
+ def valid?
27
+ valid_signature? && amount_matches?
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :payload, :payment
33
+
34
+ def payment_method
35
+ payment.payment_method
36
+ end
37
+
38
+ def valid_signature?
39
+ received = payload['secretKey']
40
+ received.present? && candidates.value?(received.to_s.upcase)
41
+ end
42
+
43
+ # Numeric comparison, not string: Wing's own spec says debitAmount is always
44
+ # 2-decimal ("1.00"), but real payloads have sent "1" (no decimals) — same
45
+ # kind of spec-vs-reality gap as getProfile's `sex` field.
46
+ def amount_matches?
47
+ payment.amount == BigDecimal(payload['debitAmount'].to_s) &&
48
+ payment.currency.to_s.casecmp(payload['debitCcy'].to_s).zero?
49
+ rescue ArgumentError, TypeError
50
+ false
51
+ end
52
+
53
+ # Same spec-vs-reality gap, applied to the signature itself: Wing's own
54
+ # secretKey may have been computed against the canonical 2-decimal
55
+ # debitAmount even though what actually reached us isn't. Try both so a
56
+ # formatting-only mismatch between what Wing hashed and what Wing sent
57
+ # still verifies.
58
+ def candidates
59
+ {
60
+ raw: hash_for(payload['debitAmount'].to_s),
61
+ normalized: hash_for(normalized_debit_amount)
62
+ }
63
+ end
64
+
65
+ def normalized_debit_amount
66
+ format('%.2f', BigDecimal(payload['debitAmount'].to_s))
67
+ rescue ArgumentError, TypeError
68
+ payload['debitAmount'].to_s
69
+ end
70
+
71
+ def hash_for(debit_amount)
72
+ fields = FIELDS.map { |field| field == 'debitAmount' ? debit_amount : payload[field].to_s }.join
73
+ plaintext = "#{payment_method.app_id}#{fields}#{payment_method.secret_api_key}"
74
+ Digest::SHA256.hexdigest(plaintext.upcase).upcase
75
+ end
76
+ end
77
+ end
78
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_vpago
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0.pre.pre2
4
+ version: 2.4.0.pre.pre4
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-08-17 00:00:00.000000000 Z
11
+ date: 2026-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -149,13 +149,22 @@ files:
149
149
  - app/assets/javascripts/vpago/vpago_payments/check_transaction_periodically.js
150
150
  - app/assets/javascripts/vpago/vpago_payments/request_process_payment.js
151
151
  - app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js
152
+ - app/assets/javascripts/vpago/wing_mini_app/login.js
153
+ - app/assets/javascripts/vpago/wing_mini_app/web_jsbridge.bundle.js
152
154
  - app/controllers/.gitkeep
155
+ - app/controllers/concerns/spree/mini_app_concern.rb
153
156
  - app/controllers/spree/acleda_redirects_controller.rb
157
+ - app/controllers/spree/admin/payment_acleda_v2_base_controller.rb
158
+ - app/controllers/spree/admin/payment_acleda_v2_checkers_controller.rb
159
+ - app/controllers/spree/admin/payment_acleda_v2_queriers_controller.rb
154
160
  - app/controllers/spree/admin/payment_methods_controller_decorator.rb
155
161
  - app/controllers/spree/admin/payment_payway_base_controller.rb
156
162
  - app/controllers/spree/admin/payment_payway_checkers_controller.rb
157
163
  - app/controllers/spree/admin/payment_payway_markers_controller.rb
158
164
  - app/controllers/spree/admin/payment_payway_queriers_controller.rb
165
+ - app/controllers/spree/admin/payment_vattanac_base_controller.rb
166
+ - app/controllers/spree/admin/payment_vattanac_checkers_controller.rb
167
+ - app/controllers/spree/admin/payment_vattanac_queriers_controller.rb
159
168
  - app/controllers/spree/admin/payment_wing_sdk_base_controller.rb
160
169
  - app/controllers/spree/admin/payment_wing_sdk_checkers_controller.rb
161
170
  - app/controllers/spree/admin/payment_wing_sdk_markers_controller.rb
@@ -167,7 +176,8 @@ files:
167
176
  - app/controllers/spree/admin/payouts_controller.rb
168
177
  - app/controllers/spree/admin/suspicious_orders_controller.rb
169
178
  - app/controllers/spree/api/v2/storefront/checkout_controller_decorator.rb
170
- - app/controllers/spree/miniapp/acledas_controller.rb
179
+ - app/controllers/spree/mini_app/acledas_controller.rb
180
+ - app/controllers/spree/mini_app/wings_controller.rb
171
181
  - app/controllers/spree/payway_card_popups_controller.rb
172
182
  - app/controllers/spree/payway_results_controller.rb
173
183
  - app/controllers/spree/payway_v2_card_popups_controller.rb
@@ -201,6 +211,7 @@ files:
201
211
  - app/models/spree/gateway/true_money.rb
202
212
  - app/models/spree/gateway/vattanac.rb
203
213
  - app/models/spree/gateway/vattanac_mini_app.rb
214
+ - app/models/spree/gateway/wing_mini_app.rb
204
215
  - app/models/spree/gateway/wing_sdk.rb
205
216
  - app/models/spree/payment_method/cash_on.rb
206
217
  - app/models/spree/payout.rb
@@ -275,12 +286,14 @@ files:
275
286
  - app/services/vpago/rsa_handler.rb
276
287
  - app/services/vpago/user_informers/firebase.rb
277
288
  - app/services/vpago/vattanac_mini_app_data_handler.rb
289
+ - app/services/vpago/wing_mini_app/session/create.rb
278
290
  - app/views/.gitkeep
279
291
  - app/views/layouts/acleda.html.erb
280
292
  - app/views/layouts/payway.html.erb
281
293
  - app/views/layouts/payway_v2.html.erb
282
294
  - app/views/layouts/vpago_payments.html.erb
283
295
  - app/views/layouts/wing.html.erb
296
+ - app/views/layouts/wing_mini_app.html.erb
284
297
  - app/views/spree/_payment_icon.html.erb
285
298
  - app/views/spree/acleda_redirects/show.html.erb
286
299
  - app/views/spree/admin/payments/source_forms/_payment_payway.html.erb
@@ -295,6 +308,7 @@ files:
295
308
  - app/views/spree/admin/payments/source_views/_vattanac.html.erb
296
309
  - app/views/spree/admin/payments/source_views/_vattanac_mini_app.html.erb
297
310
  - app/views/spree/admin/payments/source_views/_vpago_payment_tmpl.html.erb
311
+ - app/views/spree/admin/payments/source_views/_wing_mini_app.html.erb
298
312
  - app/views/spree/admin/payments/source_views/_wingsdk.html.erb
299
313
  - app/views/spree/admin/payout_profile_products/_form.html.erb
300
314
  - app/views/spree/admin/payout_profile_products/edit.html.erb
@@ -336,12 +350,14 @@ files:
336
350
  - app/views/spree/checkout/payment/payway_form.html.erb
337
351
  - app/views/spree/checkout/payment/payway_v2_form.html.erb
338
352
  - app/views/spree/checkout/payment/wingsdk_form.html.erb
353
+ - app/views/spree/mini_app/wings/show.html.erb
339
354
  - app/views/spree/payway_card_popups/_form.html.erb
340
355
  - app/views/spree/payway_card_popups/show.html.erb
341
356
  - app/views/spree/payway_results/failed.html.erb
342
357
  - app/views/spree/payway_results/success.html.erb
343
358
  - app/views/spree/payway_v2_card_popups/_form.html.erb
344
359
  - app/views/spree/payway_v2_card_popups/show.html.erb
360
+ - app/views/spree/vpago_payments/_success_script.html.erb
345
361
  - app/views/spree/vpago_payments/_transaction_checker.html.erb
346
362
  - app/views/spree/vpago_payments/checkout.html.erb
347
363
  - app/views/spree/vpago_payments/forms/spree/gateway/_acleda_mini_app.html.erb
@@ -350,8 +366,10 @@ files:
350
366
  - app/views/spree/vpago_payments/forms/spree/gateway/_true_money.html.erb
351
367
  - app/views/spree/vpago_payments/forms/spree/gateway/_vattanac.html.erb
352
368
  - app/views/spree/vpago_payments/forms/spree/gateway/_vattanac_mini_app.html.erb
369
+ - app/views/spree/vpago_payments/forms/spree/gateway/_wing_mini_app.html.erb
353
370
  - app/views/spree/vpago_payments/processing.html.erb
354
371
  - app/views/spree/vpago_payments/processing_scripts/spree/gateway/_payway_v2.html.erb
372
+ - app/views/spree/vpago_payments/processing_scripts/spree/gateway/_wing_mini_app.html.erb
355
373
  - app/views/spree/vpago_payments/success.html.erb
356
374
  - app/views/spree/wing_redirects/show.html.erb
357
375
  - bin/rails
@@ -397,6 +415,7 @@ files:
397
415
  - lib/vpago/acleda/payment_request_updater.rb
398
416
  - lib/vpago/acleda/transaction_status.rb
399
417
  - lib/vpago/acleda_mini_app/checkout.rb
418
+ - lib/vpago/acleda_mini_app/session_hash_validator.rb
400
419
  - lib/vpago/acleda_mobile/base.rb
401
420
  - lib/vpago/acleda_mobile/callback_validator.php
402
421
  - lib/vpago/acleda_mobile/callback_validator.rb
@@ -406,7 +425,9 @@ files:
406
425
  - lib/vpago/acleda_mobile/transaction_status.rb
407
426
  - lib/vpago/acleda_v2/base.rb
408
427
  - lib/vpago/acleda_v2/checkout.rb
428
+ - lib/vpago/acleda_v2/payment_request_updater.rb
409
429
  - lib/vpago/acleda_v2/transaction_status.rb
430
+ - lib/vpago/http_timeouts.rb
410
431
  - lib/vpago/payment_amount_calculator.rb
411
432
  - lib/vpago/payment_request_updater.rb
412
433
  - lib/vpago/payment_status_marker.rb
@@ -430,10 +451,13 @@ files:
430
451
  - lib/vpago/true_money/transaction_status.rb
431
452
  - lib/vpago/vattanac/base.rb
432
453
  - lib/vpago/vattanac/checkout.rb
454
+ - lib/vpago/vattanac/payment_request_updater.rb
433
455
  - lib/vpago/vattanac/transaction_status.rb
434
456
  - lib/vpago/vattanac_mini_app/base.rb
435
457
  - lib/vpago/vattanac_mini_app/checkout.rb
436
458
  - lib/vpago/vattanac_mini_app/refund_issuer.rb
459
+ - lib/vpago/wing_mini_app/checkout.rb
460
+ - lib/vpago/wing_mini_app/webhook_verifier.rb
437
461
  - lib/vpago/wing_sdk/base.rb
438
462
  - lib/vpago/wing_sdk/checkout.rb
439
463
  - lib/vpago/wing_sdk/payment_request_updater.rb