spree_vpago 2.3.13.pre.pre1 → 2.3.13

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a704b3b4c6172fcfac73d2b395be971f8706c137260c6d122e530160260f276
4
- data.tar.gz: fc86b46f2cde8a9de6426b413196cc707b32dc141c78d756d17ae9de654893f3
3
+ metadata.gz: bdd8f50bd5b048c05af17f829cfccd26404d0d7cda2045bb035d13ad1538a07b
4
+ data.tar.gz: 4ecd233d69198bb6519c593c4fb35d72c4abe68bf113f4fc73e95178fb205aff
5
5
  SHA512:
6
- metadata.gz: 229e3073db012f2f0a1ab6a9b47ea893eaf751b0d3937211490743d81a41800024e2263dd07269fdfdc3549449288bf13263df0737bf6a4dcda2a4a768acae53
7
- data.tar.gz: a8ea4e06485c9bd95d6f6616379c6c8dee5e8b6090dddb1a30446ec16ea0697984db1480a027ad7150b68e801bf295c50e13998fcc8232eddeb2fe9e32605920
6
+ metadata.gz: bf536c675b11021b9c5fcbcb2eaaa4ef74e7a5ba8a201988d8254d33836a355a6bb98748fed8432ad47b5464594a6baa9c24ae843e373cffa7b1c0612cbeee66
7
+ data.tar.gz: 30b0d2b5289f52036d72d4062d7940075ab261e6d0a6f2dafe5ba39d04a6f21a7df18cda72ff4e4682ea95723d8d05f2a5bb02018e6876f24b411f1b7eb57b96
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- spree_vpago (2.3.13.pre.pre1)
4
+ spree_vpago (2.3.13)
5
5
  faraday
6
6
  google-cloud-firestore
7
7
  spree_api (>= 4.5)
8
8
  spree_backend (>= 4.5)
9
9
  spree_core (>= 4.5)
10
- spree_extension (< 1.0)
10
+ spree_extension
11
11
  spree_multi_vendor (>= 2.4.1)
12
12
 
13
13
  GEM
@@ -1,5 +1,4 @@
1
1
  //= link_tree ../images
2
2
  //= link vpago/vpago_payments/check_transaction_periodically.js
3
- //= link vpago/vpago_payments/create_transaction.js
4
3
  //= link vpago/vpago_payments/request_process_payment.js
5
4
  //= link vpago/vpago_payments/user_informers/firebase.js
@@ -23,6 +23,11 @@ module Spree
23
23
  # GET
24
24
  def processing
25
25
  @order = @payment.order
26
+
27
+ # Common, not an edge case: the gateway callback or the checkout page's transaction
28
+ # checker often completes the order before the browser lands here. Skipping this page
29
+ # also skips its Firebase listener, so success must post order_is_completed itself
30
+ # (render_success_script) or an embedding iframe modal never closes.
26
31
  return redirect_to @payment.success_url, allow_other_host: true if @order.completed?
27
32
 
28
33
  VpagoLogger.log(label: 'Spree::VpagoPaymentsController#processing', data: vpago_log_context)
@@ -69,27 +74,6 @@ module Spree
69
74
  render json: { status: :pending }, status: :ok
70
75
  end
71
76
 
72
- # POST
73
- def create_transaction
74
- @payment = Vpago::PaymentFinder.new(params.permit!.to_h).find_and_verify
75
- raise ActiveRecord::RecordNotFound unless @payment.present?
76
-
77
- return render json: { error: true, message: 'unsupported' }, status: :not_implemented unless @payment.payment_method.support_create_transaction_api?
78
-
79
- result = VpagoLogger.log(
80
- label: 'Spree::VpagoPaymentsController#create_transaction',
81
- data: vpago_log_context
82
- ) { @payment.payment_method.create_transaction(@payment, platform: params[:platform]) }
83
-
84
- render json: result, status: :ok
85
- rescue Faraday::Error, JSON::ParserError, NoMethodError => e
86
- VpagoLogger.error(
87
- label: 'Spree::VpagoPaymentsController#create_transaction failed',
88
- data: vpago_log_context(error_class: e.class.name, error_message: e.message)
89
- )
90
- render json: { error: true, message: 'Failed to create transaction' }, status: :bad_gateway
91
- end
92
-
93
77
  # POST
94
78
  def process_payment
95
79
  return render json: { status: :ok }, status: :ok if request.method != 'POST'
@@ -174,9 +158,9 @@ module Spree
174
158
  raise ActiveRecord::RecordNotFound unless @payment.present?
175
159
  end
176
160
 
177
- # frame-ancestors (set above) supersedes X-Frame-Options in modern
178
- # browsers, but the default SAMEORIGIN header would still block legacy
179
- # browsers from embedding these pages, so drop it for the iframe actions.
161
+ # These pages are embedded in iframes on many partner sites we don't
162
+ # enumerate, so framing is left unrestricted: no frame-ancestors policy, and
163
+ # Rails' default SAMEORIGIN header is dropped for the iframe actions.
180
164
  def allow_iframe_embedding
181
165
  response.headers.delete('X-Frame-Options')
182
166
  end
@@ -13,6 +13,12 @@ module Vpago
13
13
  render partial: 'spree/vpago_payments/transaction_checker'
14
14
  end
15
15
 
16
+ # Host apps override success.html.erb; call this from every override so an
17
+ # embedding iframe modal still learns the order completed.
18
+ def render_success_script
19
+ render partial: 'spree/vpago_payments/success_script'
20
+ end
21
+
16
22
  # Each payment method may have their own additional processing script,
17
23
  # so we will look for the partial based on the payment method class name.
18
24
  #
@@ -168,12 +168,6 @@ module Spree
168
168
  checker
169
169
  end
170
170
 
171
- def create_transaction(payment, options = {})
172
- creator = Vpago::PaywayV2::TransactionCreator.new(payment, disable_return_deeplink: options[:platform] == 'web')
173
- creator.call
174
- creator.json_response
175
- end
176
-
177
171
  private
178
172
 
179
173
  def cancel_pre_auth(payment)
@@ -78,9 +78,5 @@ module Spree
78
78
  checker.call
79
79
  checker
80
80
  end
81
-
82
- def create_transaction(payment, options = {})
83
- Vpago::TrueMoney::Checkout.new(payment).generate_payment_urls(options[:platform])
84
- end
85
81
  end
86
82
  end
@@ -24,7 +24,6 @@ module Vpago
24
24
  :success_url,
25
25
  :success_deeplink_url,
26
26
  :check_transaction_url,
27
- :create_transaction_url,
28
27
  :process_payment_url,
29
28
  to: :url_constructor
30
29
 
@@ -43,12 +43,6 @@ module Vpago
43
43
  respond_to?(:check_transaction)
44
44
  end
45
45
 
46
- # The payment method must implement `create_transaction(payment, options = {})`,
47
- # returning a Hash suitable for `render json:` directly.
48
- def support_create_transaction_api?
49
- respond_to?(:create_transaction)
50
- end
51
-
52
46
  # TODO: we have already implement purchase for payway_v2.
53
47
  # make sure to implement this on other payment method as well.
54
48
  def purchase(_amount, _source, _gateway_options = {})
@@ -18,7 +18,6 @@ module Vpago
18
18
  def success_deeplink_url = "#{app_scheme}://#{URI(base_url).host}/book/payment?number=#{order.number}&tk=#{order.token}"
19
19
 
20
20
  def check_transaction_url = "#{base_url}/vpago_payments/check_transaction?#{query}"
21
- def create_transaction_url = "#{base_url}/vpago_payments/create_transaction?#{query}"
22
21
  def process_payment_url = "#{base_url}/vpago_payments/process_payment?#{query}"
23
22
 
24
23
  def query
@@ -11,7 +11,6 @@
11
11
  <%= yield :head %>
12
12
 
13
13
  <%= javascript_include_tag "vpago/vpago_payments/check_transaction_periodically", 'data-turbo-track': 'reload' %>
14
- <%= javascript_include_tag "vpago/vpago_payments/create_transaction", 'data-turbo-track': 'reload' %>
15
14
  <%= javascript_include_tag "vpago/vpago_payments/request_process_payment", 'data-turbo-track': 'reload' %>
16
15
  <%= javascript_include_tag "vpago/vpago_payments/user_informers/#{user_informer}", 'data-turbo-track': 'reload' %>
17
16
  </head>
@@ -0,0 +1,7 @@
1
+ <script>
2
+ // processing redirects here without rendering once the order is complete, so its
3
+ // Firebase listener never posts this. success only renders for completed orders.
4
+ if (window.parent !== window) {
5
+ window.parent.postMessage("order_is_completed", "*");
6
+ }
7
+ </script>
@@ -43,48 +43,55 @@
43
43
  }
44
44
 
45
45
  function submitFormViaJs(){
46
- window.createTransaction({
47
- url: "<%= raw @payment.create_transaction_url %>&platform=<%= params[:platform] %>",
48
- onSuccess: function(data) {
49
- console.log("[Vpago] checkout response data:", JSON.stringify(data));
50
-
51
- // When status code is 4 (duplicated transaction),
52
- // Possibly user refresh the checkout page even after the transaction is completed.
53
- // So in this case, we should hide loading spinner and show redirect container UI
54
- // While it check transaction status in the background. It will automatically redirect user to the result page after checking.
55
- if (data.status.code === 4){
56
- showRedirectContainer();
57
- return;
58
- }
46
+ var formData = new FormData(document.getElementById("aba_merchant_request"));
47
+ var checkoutUrl = document.getElementById("aba_merchant_request").action;
59
48
 
60
- let deeplinkTriggered = false;
49
+ fetch(checkoutUrl, {
50
+ method: "POST",
51
+ body: formData
52
+ })
53
+ .then(function(response) {
54
+ return response.json();
55
+ })
56
+ .then(function(data) {
57
+ console.log("[Vpago] checkout response data:", JSON.stringify(data));
61
58
 
62
- if (data.abapay_deeplink && shouldOpenAbaPayDeeplink) {
63
- window.location.href = data.abapay_deeplink;
64
- deeplinkTriggered = true;
65
- }
59
+ // When status code is 4 (duplicated transaction),
60
+ // Possibly user refresh the checkout page even after the transaction is completed.
61
+ // So in this case, we should hide loading spinner and show redirect container UI
62
+ // While it check transaction status in the background. It will automatically redirect user to the result page after checking.
63
+ if (data.status.code === 4){
64
+ showRedirectContainer();
65
+ return;
66
+ }
67
+
68
+ let deeplinkTriggered = false;
66
69
 
67
- if (data.checkout_qr_url && shouldOpenCheckoutUrl) {
68
- // If a deeplink is triggered, add a short delay before navigating to the checkout URL.
69
- // Without this delay, some platforms (especially Android) may ignore or cancel the deeplink
70
- // because a second navigation happens too quickly.
71
- if (deeplinkTriggered){
72
- setTimeout(() => {
73
- window.location.href = data.checkout_qr_url;
74
- }, 300);
75
- } else {
70
+ if (data.abapay_deeplink && shouldOpenAbaPayDeeplink) {
71
+ window.location.href = data.abapay_deeplink;
72
+ deeplinkTriggered = true;
73
+ }
74
+
75
+ if (data.checkout_qr_url && shouldOpenCheckoutUrl) {
76
+ // If a deeplink is triggered, add a short delay before navigating to the checkout URL.
77
+ // Without this delay, some platforms (especially Android) may ignore or cancel the deeplink
78
+ // because a second navigation happens too quickly.
79
+ if (deeplinkTriggered){
80
+ setTimeout(() => {
76
81
  window.location.href = data.checkout_qr_url;
77
- }
82
+ }, 300);
83
+ } else {
84
+ window.location.href = data.checkout_qr_url;
78
85
  }
86
+ }
79
87
 
80
- var shouldShowRedirectContainer = !shouldOpenCheckoutUrl && shouldOpenAbaPayDeeplink;
81
- if(shouldShowRedirectContainer){
82
- showRedirectContainer("Open ABA Mobile", () => window.location.href = data.abapay_deeplink);
83
- }
84
- },
85
- onError: function() {
86
- document.getElementById('vpago_loading_container').textContent = "We couldn't start your payment. Please go back and try again.";
88
+ var shouldShowRedirectContainer = !shouldOpenCheckoutUrl && shouldOpenAbaPayDeeplink;
89
+ if(shouldShowRedirectContainer){
90
+ showRedirectContainer("Open ABA Mobile", () => window.location.href = data.abapay_deeplink);
87
91
  }
92
+ })
93
+ .catch(function(error) {
94
+ console.error("Payment request failed:", error);
88
95
  });
89
96
  }
90
97
 
@@ -1,3 +1,6 @@
1
+ <% @checkout = ::Vpago::TrueMoney::Checkout.new(@payment) %>
2
+ <% redirect_urls = @checkout.generate_payment_urls(params[:platform]) %>
3
+
1
4
  <script>
2
5
  function showRedirectContainer(buttonLabel, onClick) {
3
6
  const loadingContainer = document.getElementById('vpago_loading_container');
@@ -13,22 +16,19 @@
13
16
 
14
17
  document.addEventListener("DOMContentLoaded", () => {
15
18
  const platform = "<%= params[:platform] %>";
19
+ const redirectUrls = <%= redirect_urls.to_json.html_safe %>;
16
20
 
17
- window.createTransaction({
18
- url: "<%= raw @payment.create_transaction_url %>&platform=<%= params[:platform] %>",
19
- onSuccess: function(redirectUrls) {
20
- if (platform === "app") {
21
- window.location.href = redirectUrls.deeplink;
22
- setTimeout(() => {
23
- window.location.href = redirectUrls.webview;
24
- }, 1500);
25
- } else {
26
- window.open(redirectUrls.webview, '_blank');
27
- }
28
- },
29
- onError: function() {
30
- document.getElementById('vpago_loading_container').textContent = "We couldn't start your payment. Please go back and try again.";
21
+ function setupConfirmPaymentButton() {
22
+ if (platform === "app") {
23
+ window.location.href = redirectUrls.deeplink;
24
+ setTimeout(() => {
25
+ window.location.href = redirectUrls.webview;
26
+ }, 1500);
27
+ } else {
28
+ window.open(redirectUrls.webview, '_blank');
31
29
  }
32
- });
30
+ }
31
+
32
+ setupConfirmPaymentButton();
33
33
  });
34
34
  </script>
@@ -1,3 +1,5 @@
1
1
  <h1>
2
2
  Success
3
3
  </h1>
4
+
5
+ <%= render_success_script %>
data/config/routes.rb CHANGED
@@ -24,7 +24,6 @@ Spree::Core::Engine.add_routes do
24
24
  get :success
25
25
 
26
26
  match :check_transaction, via: %i[get]
27
- match :create_transaction, via: %i[post]
28
27
  match :process_payment, via: %i[get post]
29
28
  match :true_money_process_payment, via: %i[get post]
30
29
  end
@@ -1,7 +1,7 @@
1
1
  module SpreeVpago
2
2
  module_function
3
3
 
4
- VERSION = '2.3.13-pre1'.freeze
4
+ VERSION = '2.3.13'.freeze
5
5
 
6
6
  def version
7
7
  Gem::Version.new VERSION
data/spree_vpago.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.add_dependency 'spree_api', spree_version
27
27
  s.add_dependency 'spree_backend', spree_version
28
28
  s.add_dependency 'spree_core', spree_version
29
- s.add_dependency 'spree_extension', '< 1.0'
29
+ s.add_dependency 'spree_extension'
30
30
  s.add_dependency 'spree_multi_vendor', '>= 2.4.1'
31
31
 
32
32
  s.metadata['rubygems_mfa_required'] = 'true'
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.3.13.pre.pre1
4
+ version: 2.3.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-09-17 00:00:00.000000000 Z
11
+ date: 2026-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: spree_extension
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "<"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '1.0'
89
+ version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "<"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '1.0'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: spree_multi_vendor
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -147,7 +147,6 @@ files:
147
147
  - app/assets/images/vpago/payway/abapay.png
148
148
  - app/assets/images/vpago/payway/cards.png
149
149
  - app/assets/javascripts/vpago/vpago_payments/check_transaction_periodically.js
150
- - app/assets/javascripts/vpago/vpago_payments/create_transaction.js
151
150
  - app/assets/javascripts/vpago/vpago_payments/request_process_payment.js
152
151
  - app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js
153
152
  - app/controllers/.gitkeep
@@ -345,6 +344,7 @@ files:
345
344
  - app/views/spree/payway_results/success.html.erb
346
345
  - app/views/spree/payway_v2_card_popups/_form.html.erb
347
346
  - app/views/spree/payway_v2_card_popups/show.html.erb
347
+ - app/views/spree/vpago_payments/_success_script.html.erb
348
348
  - app/views/spree/vpago_payments/_transaction_checker.html.erb
349
349
  - app/views/spree/vpago_payments/checkout.html.erb
350
350
  - app/views/spree/vpago_payments/forms/spree/gateway/_acleda_v2.html.erb
@@ -425,7 +425,6 @@ files:
425
425
  - lib/vpago/payway_v2/payouts_params_constructor.rb
426
426
  - lib/vpago/payway_v2/pre_auth_canceler.rb
427
427
  - lib/vpago/payway_v2/pre_auth_completer.rb
428
- - lib/vpago/payway_v2/transaction_creator.rb
429
428
  - lib/vpago/payway_v2/transaction_status.rb
430
429
  - lib/vpago/payway_v2/transaction_status_v2.rb
431
430
  - lib/vpago/true_money/base.rb
@@ -467,9 +466,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
467
466
  version: 3.2.0
468
467
  required_rubygems_version: !ruby/object:Gem::Requirement
469
468
  requirements:
470
- - - ">"
469
+ - - ">="
471
470
  - !ruby/object:Gem::Version
472
- version: 1.3.1
471
+ version: '0'
473
472
  requirements:
474
473
  - none
475
474
  rubygems_version: 3.4.1
@@ -1,35 +0,0 @@
1
- /**
2
- * Calls our own server, which creates the bank transaction on the browser's
3
- * behalf and returns the bank's response as JSON.
4
- *
5
- * @param {Object} options
6
- * @param {string} options.url
7
- * @param {Function} options.onSuccess
8
- * @param {Function} options.onError
9
- */
10
- async function createTransaction({ url, onSuccess, onError }) {
11
- try {
12
- const response = await fetch(url, {
13
- method: "POST",
14
- headers: {
15
- "X-CSRF-Token": document
16
- .querySelector('meta[name="csrf-token"]')
17
- .getAttribute("content"),
18
- },
19
- });
20
- const data = await response.json();
21
-
22
- if (!response.ok || data.error) {
23
- console.error("[Vpago] createTransaction failed:", JSON.stringify(data));
24
- onError(data);
25
- return;
26
- }
27
-
28
- onSuccess(data);
29
- } catch (error) {
30
- console.error("[Vpago] createTransaction request failed:", error);
31
- onError(error);
32
- }
33
- }
34
-
35
- window.createTransaction = createTransaction;
@@ -1,29 +0,0 @@
1
- require 'faraday'
2
-
3
- module Vpago
4
- module PaywayV2
5
- class TransactionCreator < Checkout
6
- def call
7
- @response = submit_transaction
8
- end
9
-
10
- def json_response
11
- @json_response ||= JSON.parse(@response.body)
12
- rescue JSON::ParserError
13
- {}
14
- end
15
-
16
- private
17
-
18
- def submit_transaction
19
- conn = Faraday::Connection.new do |faraday|
20
- faraday.request :url_encoded
21
- faraday.options.open_timeout = Vpago::HttpTimeouts::OPEN_TIMEOUT
22
- faraday.options.timeout = Vpago::HttpTimeouts::TIMEOUT
23
- end
24
-
25
- conn.post(checkout_url, gateway_params)
26
- end
27
- end
28
- end
29
- end