spree_vpago 2.3.1 → 2.3.4
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 +1 -1
- data/app/controllers/spree/vpago_payments_controller.rb +61 -29
- data/app/jobs/vpago/payment_processor_job.rb +16 -1
- data/app/models/vpago/order_decorator.rb +25 -14
- data/app/services/vpago/payment_processable.rb +12 -11
- data/lib/spree_vpago/version.rb +1 -1
- data/lib/vpago_logger.rb +59 -0
- data/node_modules/.yarn-integrity +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4e73bfb9e0eac7606f41017d8ca6c90e9853296a588f4fccd305331ec4c0c6bc
|
|
4
|
+
data.tar.gz: d8180f240e40c47b8983c460892079d2d954638a486855deda122e7971c90bed
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 34e2bd88bce6cb6a090d57fe8e6ea7c9ade90f813d834c998a66a697a96b881700ac084b78dd1074a9ec62d63a87d77942f421a25d9f6c046272526a6a407231
|
|
7
|
+
data.tar.gz: 231f3bdd5f51c7dd42b78dd1e93b45937031e32abf49383388f4c62c57de4668d2b64dd9bb89fa6f81d325a25db760c7daaa296b2dc5d69c64ee94b9b3badebf
|
data/Gemfile.lock
CHANGED
|
@@ -17,7 +17,7 @@ module Spree
|
|
|
17
17
|
|
|
18
18
|
@order = @payment.order
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#checkout', data: vpago_log_context)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
# GET
|
|
@@ -27,7 +27,7 @@ module Spree
|
|
|
27
27
|
|
|
28
28
|
@order = @payment.order
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#processing', data: vpago_log_context)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# GET
|
|
@@ -38,7 +38,7 @@ module Spree
|
|
|
38
38
|
@order = @payment.order
|
|
39
39
|
raise CanCan::AccessDenied unless @order.completed?
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#success', data: vpago_log_context)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
# GET
|
|
@@ -49,20 +49,21 @@ module Spree
|
|
|
49
49
|
return render json: { status: :success }, status: :ok if @payment.completed?
|
|
50
50
|
return render json: { status: :failed }, status: :ok if @payment.failed?
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
52
|
+
unless @payment.payment_method.support_check_transaction_api?
|
|
53
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#check_transaction unsupported', data: vpago_log_context)
|
|
54
|
+
return render json: { status: :pending }, status: :ok
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
checker = VpagoLogger.log(
|
|
58
|
+
label: 'Spree::VpagoPaymentsController#check_transaction',
|
|
59
|
+
data: vpago_log_context
|
|
60
|
+
) { @payment.payment_method.check_transaction(@payment) }
|
|
61
|
+
|
|
62
|
+
if checker.success?
|
|
63
|
+
render json: { status: :success }, status: :ok
|
|
64
|
+
elsif checker.try(:failed?) == true
|
|
65
|
+
render json: { status: :failed }, status: :ok
|
|
64
66
|
else
|
|
65
|
-
Rails.logger.info("[Vpago][#{@payment.number}] Payment method does not support check transaction API")
|
|
66
67
|
render json: { status: :pending }, status: :ok
|
|
67
68
|
end
|
|
68
69
|
end
|
|
@@ -75,30 +76,35 @@ module Spree
|
|
|
75
76
|
@payment = Vpago::PaymentFinder.new(return_params).find_and_verify
|
|
76
77
|
|
|
77
78
|
if @payment.nil?
|
|
78
|
-
|
|
79
|
+
VpagoLogger.error(
|
|
80
|
+
label: 'Spree::VpagoPaymentsController#process_payment payment_not_found',
|
|
81
|
+
data: vpago_log_context(params: return_params)
|
|
82
|
+
)
|
|
79
83
|
return render_not_found
|
|
80
84
|
end
|
|
81
85
|
|
|
82
|
-
|
|
86
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#process_payment payment_found', data: vpago_log_context)
|
|
83
87
|
|
|
84
88
|
# for ABA reviewing mode, we can disable pushback from bank, and only process it from our app UI instead.
|
|
85
89
|
# This will give ABA team to know that we don't rely on just pushback and have fallback to process payment.
|
|
86
90
|
if @payment.payment_method.type_payway_v2? && @payment.payment_method.reviewing_mode? && request_from_external_server?
|
|
87
|
-
|
|
91
|
+
VpagoLogger.log(label: 'Spree::VpagoPaymentsController#process_payment skipped_reviewing_mode', data: vpago_log_context)
|
|
88
92
|
return render json: { status: :ok }, status: :ok
|
|
89
93
|
end
|
|
90
94
|
|
|
91
95
|
unless @payment.order.paid?
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
96
|
+
VpagoLogger.log(
|
|
97
|
+
label: 'Spree::VpagoPaymentsController#process_payment enqueue_payment_processor_job',
|
|
98
|
+
data: vpago_log_context
|
|
99
|
+
) { Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) }
|
|
96
100
|
end
|
|
97
101
|
|
|
98
|
-
Rails.logger.info("[Vpago][#{@payment.number}] Successfully enqueued payment processor job for payment #{@payment.number}")
|
|
99
102
|
render json: { status: :ok }, status: :ok
|
|
100
103
|
rescue StandardError => e
|
|
101
|
-
|
|
104
|
+
VpagoLogger.error(
|
|
105
|
+
label: 'Spree::VpagoPaymentsController#process_payment failed',
|
|
106
|
+
data: vpago_log_context(error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5))
|
|
107
|
+
)
|
|
102
108
|
render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
|
|
103
109
|
end
|
|
104
110
|
|
|
@@ -107,14 +113,28 @@ module Spree
|
|
|
107
113
|
return render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok if request.method != 'POST'
|
|
108
114
|
|
|
109
115
|
@payment = Spree::Payment.find_by(number: params.dig(:data, :external_ref_id))
|
|
110
|
-
return render_not_found unless @payment
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
if @payment.nil?
|
|
118
|
+
VpagoLogger.error(
|
|
119
|
+
label: 'Spree::VpagoPaymentsController#true_money_process_payment payment_not_found',
|
|
120
|
+
data: vpago_log_context(external_ref_id: params.dig(:data, :external_ref_id))
|
|
121
|
+
)
|
|
122
|
+
return render_not_found
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
unless @payment.order.paid?
|
|
126
|
+
VpagoLogger.log(
|
|
127
|
+
label: 'Spree::VpagoPaymentsController#true_money_process_payment enqueue_payment_processor_job',
|
|
128
|
+
data: vpago_log_context
|
|
129
|
+
) { Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) }
|
|
130
|
+
end
|
|
114
131
|
|
|
115
132
|
render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok
|
|
116
133
|
rescue StandardError => e
|
|
117
|
-
|
|
134
|
+
VpagoLogger.error(
|
|
135
|
+
label: 'Spree::VpagoPaymentsController#true_money_process_payment failed',
|
|
136
|
+
data: vpago_log_context(error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5))
|
|
137
|
+
)
|
|
118
138
|
render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
|
|
119
139
|
end
|
|
120
140
|
|
|
@@ -144,5 +164,17 @@ module Spree
|
|
|
144
164
|
def request_from_external_server?
|
|
145
165
|
params[:internal_client].blank? || params[:internal_client] == 'false'
|
|
146
166
|
end
|
|
167
|
+
|
|
168
|
+
def vpago_log_context(extra = {})
|
|
169
|
+
{
|
|
170
|
+
timestamp: Time.current.utc.iso8601(3),
|
|
171
|
+
remote_ip: request.remote_ip,
|
|
172
|
+
payment_number: @payment&.number,
|
|
173
|
+
order_number: @payment&.order&.number,
|
|
174
|
+
payment_method_type: @payment&.payment_method&.type,
|
|
175
|
+
payment_method_name: @payment&.payment_method&.name,
|
|
176
|
+
request_id: request.request_id
|
|
177
|
+
}.merge(extra)
|
|
178
|
+
end
|
|
147
179
|
end
|
|
148
180
|
end
|
|
@@ -5,7 +5,22 @@ module Vpago
|
|
|
5
5
|
|
|
6
6
|
def perform(options)
|
|
7
7
|
payment = Spree::Payment.find_by!(number: options[:payment_number])
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
VpagoLogger.log(
|
|
10
|
+
label: 'Vpago::PaymentProcessorJob#perform',
|
|
11
|
+
data: {
|
|
12
|
+
payment_number: payment.number,
|
|
13
|
+
order_number: payment.order.number,
|
|
14
|
+
payment_method_type: payment.payment_method.type,
|
|
15
|
+
payment_method_name: payment.payment_method.name
|
|
16
|
+
}
|
|
17
|
+
) { Vpago::PaymentProcessor.new(payment: payment).call }
|
|
18
|
+
rescue StandardError => e
|
|
19
|
+
VpagoLogger.error(
|
|
20
|
+
label: 'Vpago::PaymentProcessorJob#perform failed',
|
|
21
|
+
data: { payment_number: options[:payment_number], error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5) }
|
|
22
|
+
)
|
|
23
|
+
raise
|
|
9
24
|
end
|
|
10
25
|
end
|
|
11
26
|
end
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
module Vpago
|
|
2
2
|
module OrderDecorator
|
|
3
3
|
extend Spree::DisplayMoney
|
|
4
|
+
|
|
4
5
|
money_methods :order_adjustment_total, :shipping_discount
|
|
5
6
|
|
|
6
7
|
def self.prepended(base)
|
|
7
8
|
base.has_many :payouts, class_name: 'Spree::Payout', through: :payments
|
|
8
|
-
base.has_many :vendor_payment_methods, -> {
|
|
9
|
+
base.has_many :vendor_payment_methods, -> { where(spree_payment_methods: { deleted_at: nil }).reorder(nil).distinct },
|
|
9
10
|
class_name: 'Spree::PaymentMethod',
|
|
10
11
|
through: :line_items
|
|
11
12
|
|
|
@@ -51,19 +52,29 @@ module Vpago
|
|
|
51
52
|
|
|
52
53
|
# override
|
|
53
54
|
def available_payment_methods(store = nil)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
vendor_payment_methods
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
@available_payment_methods ||= begin
|
|
56
|
+
payment_methods = if respond_to?(:tenant) && tenant.present?
|
|
57
|
+
tenant_payment_methods
|
|
58
|
+
elsif vendor_payment_methods.any?
|
|
59
|
+
vendor_payment_methods
|
|
60
|
+
else
|
|
61
|
+
store ||= self.store
|
|
62
|
+
store.payment_methods
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
payment_methods = if early_adopter?
|
|
66
|
+
payment_methods.available_on_frontend_for_early_adopter.select { |pm| pm.available_for_order?(self) }
|
|
67
|
+
else
|
|
68
|
+
payment_methods.available_on_front_end.select { |pm| pm.available_for_order?(self) }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
payment_methods = payment_methods.select(&:support_payout?) if required_payway_payout?
|
|
72
|
+
payment_methods
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def early_adopter?
|
|
77
|
+
user.present? && user.respond_to?(:early_adopter?) && user.early_adopter?
|
|
67
78
|
end
|
|
68
79
|
|
|
69
80
|
def tenant_payment_methods
|
|
@@ -24,17 +24,18 @@ module Vpago
|
|
|
24
24
|
:unable_to_complete_order
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
def log_process(method, *args, &)
|
|
28
|
+
VpagoLogger.log(
|
|
29
|
+
label: "#{self.class.name}##{method}",
|
|
30
|
+
data: {
|
|
31
|
+
payment_number: @payment.number,
|
|
32
|
+
order_number: @payment.order.number,
|
|
33
|
+
payment_method_type: @payment.payment_method.type,
|
|
34
|
+
payment_method_name: @payment.payment_method.name,
|
|
35
|
+
args: args
|
|
36
|
+
},
|
|
37
|
+
&
|
|
38
|
+
)
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def user_informer
|
data/lib/spree_vpago/version.rb
CHANGED
data/lib/vpago_logger.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# lib/vpago_logger.rb
|
|
2
|
+
module VpagoLogger
|
|
3
|
+
def self.log(label:, data: nil)
|
|
4
|
+
message = { label: label, data: safe_serialize(data) }
|
|
5
|
+
start_time = Time.current
|
|
6
|
+
Rails.logger.info(message.to_json)
|
|
7
|
+
|
|
8
|
+
return unless block_given?
|
|
9
|
+
|
|
10
|
+
# Capture the block's return value and return it to preserve existing behavior for callers expecting that value.
|
|
11
|
+
block_result = yield
|
|
12
|
+
|
|
13
|
+
message[:start_time] = start_time.iso8601(3)
|
|
14
|
+
message[:duration_ms] = (Time.current - start_time) * 1000
|
|
15
|
+
message[:result] = safe_serialize(block_result)
|
|
16
|
+
Rails.logger.info(message.to_json)
|
|
17
|
+
block_result
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.error(label:, data: nil)
|
|
21
|
+
message = {
|
|
22
|
+
label: label,
|
|
23
|
+
data: safe_serialize(data)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Rails.logger.error(message.to_json)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Safely serializes objects for JSON logging.
|
|
30
|
+
#
|
|
31
|
+
# @param obj [Object] The object to serialize
|
|
32
|
+
# @param depth [Integer] Internal parameter tracking recursion depth (max: 50)
|
|
33
|
+
# @return [Object] A JSON-safe representation of the input object
|
|
34
|
+
def self.safe_serialize(obj, depth: 0)
|
|
35
|
+
return '[Max Depth Exceeded]' if depth > 50
|
|
36
|
+
|
|
37
|
+
if obj.is_a?(Hash)
|
|
38
|
+
obj.each_with_object({}) do |(k, v), memo|
|
|
39
|
+
memo[safe_serialize(k, depth: depth + 1)] = safe_serialize(v, depth: depth + 1)
|
|
40
|
+
end
|
|
41
|
+
elsif obj.is_a?(Array)
|
|
42
|
+
obj.map { |item| safe_serialize(item, depth: depth + 1) }
|
|
43
|
+
elsif obj.is_a?(Date)
|
|
44
|
+
obj.iso8601
|
|
45
|
+
elsif obj.is_a?(Time) || obj.is_a?(DateTime) || obj.is_a?(ActiveSupport::TimeWithZone)
|
|
46
|
+
obj.iso8601(3)
|
|
47
|
+
elsif obj.is_a?(ActiveJob::Base)
|
|
48
|
+
{
|
|
49
|
+
job_class: obj.class.name,
|
|
50
|
+
job_id: obj.job_id,
|
|
51
|
+
arguments: safe_serialize(obj.arguments, depth: depth + 1)
|
|
52
|
+
}
|
|
53
|
+
elsif obj.respond_to?(:id)
|
|
54
|
+
{ class: obj.class.name, id: obj.id }
|
|
55
|
+
else
|
|
56
|
+
obj.to_s
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
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.3.
|
|
4
|
+
version: 2.3.4
|
|
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-06-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -421,6 +421,7 @@ files:
|
|
|
421
421
|
- lib/vpago/wing_sdk/payment_retriever.rb
|
|
422
422
|
- lib/vpago/wing_sdk/transaction_status_checker.rb
|
|
423
423
|
- lib/vpago/wing_sdk/transaction_status_response.rb
|
|
424
|
+
- lib/vpago_logger.rb
|
|
424
425
|
- node_modules/.yarn-integrity
|
|
425
426
|
- package-lock.json
|
|
426
427
|
- package.json
|