spree_vpago 2.1.9 → 2.2.0.pre.addpaymentlogger
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/Gemfile.lock +2 -2
- data/app/controllers/spree/vpago_payments_controller.rb +50 -6
- data/app/controllers/spree/webhook/payways_controller.rb +2 -2
- data/app/jobs/vpago/payment_processor_job.rb +60 -0
- data/app/lib/vpago/timing_helper.rb +28 -0
- data/lib/spree_vpago/version.rb +1 -1
- data/lib/vpago/payway_v2/transaction_status.rb +30 -1
- data/lib/vpago_logger.rb +15 -0
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a95a94461d263e091ae13318a66e83076486a6e6a0e51e0de47f491afa0ce47
|
|
4
|
+
data.tar.gz: 36a1f1b281927c5b86495436434d9b6da2c09c33f5f97ce167365f941121f762
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4879b458c00839752fe57237d8baf3847ce3f31df77b3f1a6efe482882f4bb2470916f8d347801baa8bb8000a9f4489d2a5b9e4925eb23c626d5a076626b0566
|
|
7
|
+
data.tar.gz: ebe9ba8f2e11dc363beadd8a5a996ce1a3ab327138b594d445b58476f04118aacc87b7514a58591b8b46217dbc8a7d132c776609957e22ec16fe9b46a316ea67
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
spree_vpago (2.
|
|
4
|
+
spree_vpago (2.2.0.pre.addpaymentlogger)
|
|
5
5
|
faraday
|
|
6
6
|
google-cloud-firestore
|
|
7
7
|
spree_api (>= 4.5)
|
|
@@ -188,7 +188,7 @@ GEM
|
|
|
188
188
|
faraday-http-cache (2.5.0)
|
|
189
189
|
faraday (>= 0.8)
|
|
190
190
|
faraday-net_http (3.0.2)
|
|
191
|
-
faraday-retry (2.
|
|
191
|
+
faraday-retry (2.4.0)
|
|
192
192
|
faraday (~> 2.0)
|
|
193
193
|
ffaker (2.21.0)
|
|
194
194
|
ffi (1.15.5)
|
|
@@ -44,14 +44,15 @@ module Spree
|
|
|
44
44
|
return render_not_found unless @payment.present?
|
|
45
45
|
|
|
46
46
|
unless @payment.order.paid?
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
enqueued_at = Time.now.to_f
|
|
48
|
+
log_enqueue_start(@payment, enqueued_at, return_params)
|
|
49
|
+
|
|
50
|
+
Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number, enqueued_at: enqueued_at)
|
|
50
51
|
end
|
|
51
52
|
|
|
52
53
|
render json: { status: :ok }, status: :ok
|
|
53
54
|
rescue StandardError => e
|
|
54
|
-
|
|
55
|
+
log_enqueue_error(e)
|
|
55
56
|
render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
|
|
56
57
|
end
|
|
57
58
|
|
|
@@ -62,14 +63,21 @@ module Spree
|
|
|
62
63
|
@payment = Spree::Payment.find_by(number: params.dig(:data, :external_ref_id))
|
|
63
64
|
return render_not_found unless @payment
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
unless @payment.order.paid?
|
|
67
|
+
enqueued_at = Time.now.to_f
|
|
68
|
+
log_enqueue_start(@payment, enqueued_at)
|
|
69
|
+
|
|
70
|
+
Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number, enqueued_at: enqueued_at)
|
|
71
|
+
end
|
|
66
72
|
|
|
67
73
|
render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok
|
|
68
74
|
rescue StandardError => e
|
|
69
|
-
|
|
75
|
+
log_enqueue_error(e)
|
|
70
76
|
render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
|
|
71
77
|
end
|
|
72
78
|
|
|
79
|
+
private
|
|
80
|
+
|
|
73
81
|
def sanitize_return_params
|
|
74
82
|
sanitized_params = params.permit!.to_h
|
|
75
83
|
|
|
@@ -92,5 +100,41 @@ module Spree
|
|
|
92
100
|
format.json { render json: { status: :unauthorized }, status: :unauthorized }
|
|
93
101
|
end
|
|
94
102
|
end
|
|
103
|
+
|
|
104
|
+
def log_enqueue_start(payment, enqueued_at, return_params = {})
|
|
105
|
+
VpagoLogger.log(
|
|
106
|
+
event: 'vpago.payment_processor_job.enqueue',
|
|
107
|
+
data: {
|
|
108
|
+
payment_number: payment.number,
|
|
109
|
+
order_number: payment.order&.number,
|
|
110
|
+
request_id: request.request_id,
|
|
111
|
+
payment_method_type: payment.payment_method&.type,
|
|
112
|
+
payment_method_name: payment.payment_method&.name,
|
|
113
|
+
gateway: detect_payway_gateway_version(payment.payment_method),
|
|
114
|
+
tran_id: (return_params[:tran_id] || return_params['tran_id']),
|
|
115
|
+
enqueued_at: enqueued_at
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def log_enqueue_error(error)
|
|
121
|
+
VpagoLogger.error(
|
|
122
|
+
event: 'vpago.payment_processor_job.enqueue.error',
|
|
123
|
+
data: {
|
|
124
|
+
request_id: request.request_id,
|
|
125
|
+
payment_number: @payment&.number,
|
|
126
|
+
error_class: error.class.name,
|
|
127
|
+
error_message: error.message
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def detect_payway_gateway_version(payment_method)
|
|
133
|
+
return nil unless payment_method
|
|
134
|
+
return 'payway_v2' if payment_method.type_payway_v2?
|
|
135
|
+
return 'payway_v1' if payment_method.type_payway?
|
|
136
|
+
|
|
137
|
+
nil
|
|
138
|
+
end
|
|
95
139
|
end
|
|
96
140
|
end
|
|
@@ -4,7 +4,7 @@ module Spree
|
|
|
4
4
|
skip_before_action :verify_authenticity_token, only: %i[return v2_return continue v2_continue]
|
|
5
5
|
|
|
6
6
|
# match via: [:get, :post]
|
|
7
|
-
# {"response"=>"{\"tran_id\":\"PE13LXT1\",\"status\":0
|
|
7
|
+
# {"response"=>"{\"tran_id\":\"PE13LXT1\",\"status\":0}"}
|
|
8
8
|
def v2_return
|
|
9
9
|
handler_service = v2_request_updater_service
|
|
10
10
|
|
|
@@ -48,7 +48,7 @@ module Spree
|
|
|
48
48
|
request_updater.call
|
|
49
49
|
|
|
50
50
|
order = payment.order
|
|
51
|
-
order
|
|
51
|
+
order.reload
|
|
52
52
|
|
|
53
53
|
if order.paid? || payment.pending?
|
|
54
54
|
render plain: :success
|
|
@@ -1,11 +1,71 @@
|
|
|
1
1
|
# Put :payment_processing at a higher priority in your project: config/sidekiq.yml
|
|
2
|
+
require 'vpago/timing_helper'
|
|
3
|
+
|
|
2
4
|
module Vpago
|
|
3
5
|
class PaymentProcessorJob < ::ApplicationUniqueJob
|
|
4
6
|
queue_as :payment_processing
|
|
5
7
|
|
|
6
8
|
def perform(options)
|
|
9
|
+
started_at = Vpago::TimingHelper.current_time
|
|
10
|
+
enqueued_at = options[:enqueued_at]
|
|
11
|
+
queue_wait_ms = calculate_queue_wait_ms(enqueued_at)
|
|
12
|
+
|
|
13
|
+
log_job_start(options[:payment_number], queue_wait_ms)
|
|
14
|
+
|
|
7
15
|
payment = Spree::Payment.find_by!(number: options[:payment_number])
|
|
8
16
|
Vpago::PaymentProcessor.new(payment: payment).call
|
|
17
|
+
|
|
18
|
+
log_job_finish(options[:payment_number], queue_wait_ms, started_at)
|
|
19
|
+
rescue StandardError => e
|
|
20
|
+
log_job_error(options[:payment_number], queue_wait_ms, started_at, e)
|
|
21
|
+
raise
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def calculate_queue_wait_ms(enqueued_at)
|
|
27
|
+
return nil unless enqueued_at
|
|
28
|
+
|
|
29
|
+
((Time.now.to_f - enqueued_at.to_f) * 1000.0).round(1)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def log_job_start(payment_number, queue_wait_ms)
|
|
33
|
+
VpagoLogger.log(
|
|
34
|
+
event: 'vpago.payment_processor_job.start',
|
|
35
|
+
data: {
|
|
36
|
+
payment_number: payment_number,
|
|
37
|
+
queue: self.class.queue_name,
|
|
38
|
+
queue_wait_ms: queue_wait_ms
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def log_job_finish(payment_number, queue_wait_ms, started_at)
|
|
44
|
+
runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
|
|
45
|
+
VpagoLogger.log(
|
|
46
|
+
event: 'vpago.payment_processor_job.finish',
|
|
47
|
+
data: {
|
|
48
|
+
payment_number: payment_number,
|
|
49
|
+
queue: self.class.queue_name,
|
|
50
|
+
queue_wait_ms: queue_wait_ms,
|
|
51
|
+
runtime_ms: runtime_ms
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def log_job_error(payment_number, queue_wait_ms, started_at, error)
|
|
57
|
+
runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
|
|
58
|
+
VpagoLogger.error(
|
|
59
|
+
event: 'vpago.payment_processor_job.error',
|
|
60
|
+
data: {
|
|
61
|
+
payment_number: payment_number,
|
|
62
|
+
queue: self.class.queue_name,
|
|
63
|
+
queue_wait_ms: queue_wait_ms,
|
|
64
|
+
runtime_ms: runtime_ms,
|
|
65
|
+
error_class: error.class.name,
|
|
66
|
+
error_message: error.message
|
|
67
|
+
}
|
|
68
|
+
)
|
|
9
69
|
end
|
|
10
70
|
end
|
|
11
71
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Vpago
|
|
2
|
+
module TimingHelper
|
|
3
|
+
# Gets the current monotonic timestamp.
|
|
4
|
+
#
|
|
5
|
+
# @return [Float] current timestamp from Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
6
|
+
def self.current_time
|
|
7
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Measures elapsed time in milliseconds from a given start timestamp.
|
|
11
|
+
#
|
|
12
|
+
# @param started_at [Float] timestamp from Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
13
|
+
# @return [Float] elapsed time in milliseconds, rounded to 1 decimal place
|
|
14
|
+
def self.elapsed_ms(started_at)
|
|
15
|
+
((Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at) * 1000.0).round(1)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Yields to a block and measures its execution time in milliseconds.
|
|
19
|
+
#
|
|
20
|
+
# @yield the block to measure
|
|
21
|
+
# @return [Float] elapsed time in milliseconds, rounded to 1 decimal place
|
|
22
|
+
def self.measure_ms
|
|
23
|
+
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
24
|
+
yield
|
|
25
|
+
elapsed_ms(started_at)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/spree_vpago/version.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'faraday'
|
|
2
|
+
require 'vpago/timing_helper'
|
|
2
3
|
|
|
3
4
|
module Vpago
|
|
4
5
|
module PaywayV2
|
|
@@ -35,6 +36,8 @@ module Vpago
|
|
|
35
36
|
end
|
|
36
37
|
|
|
37
38
|
def check_remote_status
|
|
39
|
+
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
40
|
+
|
|
38
41
|
conn = Faraday::Connection.new do |faraday|
|
|
39
42
|
faraday.request :url_encoded
|
|
40
43
|
end
|
|
@@ -46,7 +49,33 @@ module Vpago
|
|
|
46
49
|
hash: checker_hmac
|
|
47
50
|
}
|
|
48
51
|
|
|
49
|
-
conn.post(check_transaction_url, data)
|
|
52
|
+
response = conn.post(check_transaction_url, data)
|
|
53
|
+
|
|
54
|
+
runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
|
|
55
|
+
Rails.logger.info(
|
|
56
|
+
{
|
|
57
|
+
event: 'vpago.payway.check_transaction',
|
|
58
|
+
version: 'v2',
|
|
59
|
+
payment_number: transaction_id,
|
|
60
|
+
http_status: response.status,
|
|
61
|
+
runtime_ms: runtime_ms
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
response
|
|
66
|
+
rescue StandardError => e
|
|
67
|
+
runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
|
|
68
|
+
Rails.logger.error(
|
|
69
|
+
{
|
|
70
|
+
event: 'vpago.payway.check_transaction.error',
|
|
71
|
+
version: 'v2',
|
|
72
|
+
payment_number: transaction_id,
|
|
73
|
+
runtime_ms: runtime_ms,
|
|
74
|
+
error_class: e.class.name,
|
|
75
|
+
error_message: e.message
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
raise
|
|
50
79
|
end
|
|
51
80
|
|
|
52
81
|
def payout_total
|
data/lib/vpago_logger.rb
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module VpagoLogger
|
|
2
|
+
def self.log(event:, data: nil)
|
|
3
|
+
message = { event: event }
|
|
4
|
+
message.merge!(data) if data
|
|
5
|
+
|
|
6
|
+
Rails.logger.info(message.to_json)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.error(event:, data: nil)
|
|
10
|
+
message = { event: event }
|
|
11
|
+
message.merge!(data) if data
|
|
12
|
+
|
|
13
|
+
Rails.logger.error(message.to_json)
|
|
14
|
+
end
|
|
15
|
+
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
|
+
version: 2.2.0.pre.addpaymentlogger
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- You
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-02-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -188,6 +188,7 @@ files:
|
|
|
188
188
|
- app/jobs/vpago/payment_capturer_job.rb
|
|
189
189
|
- app/jobs/vpago/payment_processor_job.rb
|
|
190
190
|
- app/jobs/vpago/payment_voider_job.rb
|
|
191
|
+
- app/lib/vpago/timing_helper.rb
|
|
191
192
|
- app/models/.gitkeep
|
|
192
193
|
- app/models/concerns/vpago/payoutable.rb
|
|
193
194
|
- app/models/spree/gateway/acleda.rb
|
|
@@ -418,6 +419,7 @@ files:
|
|
|
418
419
|
- lib/vpago/wing_sdk/payment_retriever.rb
|
|
419
420
|
- lib/vpago/wing_sdk/transaction_status_checker.rb
|
|
420
421
|
- lib/vpago/wing_sdk/transaction_status_response.rb
|
|
422
|
+
- lib/vpago_logger.rb
|
|
421
423
|
- node_modules/.yarn-integrity
|
|
422
424
|
- package-lock.json
|
|
423
425
|
- package.json
|
|
@@ -439,9 +441,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
439
441
|
version: 3.2.0
|
|
440
442
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
441
443
|
requirements:
|
|
442
|
-
- - "
|
|
444
|
+
- - ">"
|
|
443
445
|
- !ruby/object:Gem::Version
|
|
444
|
-
version:
|
|
446
|
+
version: 1.3.1
|
|
445
447
|
requirements:
|
|
446
448
|
- none
|
|
447
449
|
rubygems_version: 3.4.1
|