activemerchant 1.95.0 → 1.96.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +45 -0
- data/README.md +3 -0
- data/lib/active_merchant/billing/avs_result.rb +4 -5
- data/lib/active_merchant/billing/credit_card.rb +2 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +14 -0
- data/lib/active_merchant/billing/gateway.rb +10 -0
- data/lib/active_merchant/billing/gateways/adyen.rb +19 -6
- data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +39 -10
- data/lib/active_merchant/billing/gateways/blue_snap.rb +4 -1
- data/lib/active_merchant/billing/gateways/bpoint.rb +4 -4
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +11 -1
- data/lib/active_merchant/billing/gateways/card_connect.rb +1 -0
- data/lib/active_merchant/billing/gateways/cecabank.rb +7 -7
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +24 -24
- data/lib/active_merchant/billing/gateways/credorax.rb +29 -3
- data/lib/active_merchant/billing/gateways/cyber_source.rb +2 -2
- data/lib/active_merchant/billing/gateways/decidir.rb +232 -0
- data/lib/active_merchant/billing/gateways/global_collect.rb +2 -6
- data/lib/active_merchant/billing/gateways/hps.rb +46 -1
- data/lib/active_merchant/billing/gateways/kushki.rb +1 -1
- data/lib/active_merchant/billing/gateways/migs.rb +8 -0
- data/lib/active_merchant/billing/gateways/mundipagg.rb +1 -1
- data/lib/active_merchant/billing/gateways/nab_transact.rb +1 -1
- data/lib/active_merchant/billing/gateways/nmi.rb +39 -1
- data/lib/active_merchant/billing/gateways/opp.rb +20 -1
- data/lib/active_merchant/billing/gateways/payflow.rb +40 -2
- data/lib/active_merchant/billing/gateways/paypal.rb +14 -1
- data/lib/active_merchant/billing/gateways/realex.rb +11 -5
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +43 -29
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +2 -2
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +24 -5
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +8 -5
- data/lib/active_merchant/billing/gateways/worldpay.rb +157 -37
- data/lib/active_merchant/country.rb +1 -0
- data/lib/active_merchant/version.rb +1 -1
- metadata +3 -2
@@ -5,7 +5,7 @@ module ActiveMerchant #:nodoc:
|
|
5
5
|
|
6
6
|
self.supported_countries = ['US']
|
7
7
|
self.default_currency = 'USD'
|
8
|
-
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
8
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :alelo]
|
9
9
|
|
10
10
|
self.homepage_url = 'https://www.mundipagg.com/'
|
11
11
|
self.display_name = 'Mundipagg'
|
@@ -12,7 +12,7 @@ module ActiveMerchant #:nodoc:
|
|
12
12
|
|
13
13
|
self.test_url = 'https://demo.transact.nab.com.au/xmlapi/payment'
|
14
14
|
self.live_url = 'https://transact.nab.com.au/live/xmlapi/payment'
|
15
|
-
self.test_periodic_url = 'https://transact.nab.com.au/
|
15
|
+
self.test_periodic_url = 'https://demo.transact.nab.com.au/xmlapi/periodic'
|
16
16
|
self.live_periodic_url = 'https://transact.nab.com.au/xmlapi/periodic'
|
17
17
|
|
18
18
|
self.supported_countries = ['AU']
|
@@ -31,9 +31,11 @@ module ActiveMerchant #:nodoc:
|
|
31
31
|
post = {}
|
32
32
|
add_invoice(post, amount, options)
|
33
33
|
add_payment_method(post, payment_method, options)
|
34
|
+
add_stored_credential(post, options)
|
34
35
|
add_customer_data(post, options)
|
35
36
|
add_vendor_data(post, options)
|
36
37
|
add_merchant_defined_fields(post, options)
|
38
|
+
add_level3_fields(post, options)
|
37
39
|
|
38
40
|
commit('sale', post)
|
39
41
|
end
|
@@ -42,9 +44,11 @@ module ActiveMerchant #:nodoc:
|
|
42
44
|
post = {}
|
43
45
|
add_invoice(post, amount, options)
|
44
46
|
add_payment_method(post, payment_method, options)
|
47
|
+
add_stored_credential(post, options)
|
45
48
|
add_customer_data(post, options)
|
46
49
|
add_vendor_data(post, options)
|
47
50
|
add_merchant_defined_fields(post, options)
|
51
|
+
add_level3_fields(post, options)
|
48
52
|
|
49
53
|
commit('auth', post)
|
50
54
|
end
|
@@ -81,6 +85,7 @@ module ActiveMerchant #:nodoc:
|
|
81
85
|
add_payment_method(post, payment_method, options)
|
82
86
|
add_customer_data(post, options)
|
83
87
|
add_vendor_data(post, options)
|
88
|
+
add_level3_fields(post, options)
|
84
89
|
|
85
90
|
commit('credit', post)
|
86
91
|
end
|
@@ -91,6 +96,7 @@ module ActiveMerchant #:nodoc:
|
|
91
96
|
add_customer_data(post, options)
|
92
97
|
add_vendor_data(post, options)
|
93
98
|
add_merchant_defined_fields(post, options)
|
99
|
+
add_level3_fields(post, options)
|
94
100
|
|
95
101
|
commit('validate', post)
|
96
102
|
end
|
@@ -117,7 +123,7 @@ module ActiveMerchant #:nodoc:
|
|
117
123
|
|
118
124
|
def scrub(transcript)
|
119
125
|
transcript.
|
120
|
-
gsub(%r((password=)
|
126
|
+
gsub(%r((password=)[^&\n]*), '\1[FILTERED]').
|
121
127
|
gsub(%r((ccnumber=)\d+), '\1[FILTERED]').
|
122
128
|
gsub(%r((cvv=)\d+), '\1[FILTERED]').
|
123
129
|
gsub(%r((checkaba=)\d+), '\1[FILTERED]').
|
@@ -131,6 +137,10 @@ module ActiveMerchant #:nodoc:
|
|
131
137
|
|
132
138
|
private
|
133
139
|
|
140
|
+
def add_level3_fields(post, options)
|
141
|
+
add_fields_to_post_if_present(post, options, [:tax, :shipping, :ponumber])
|
142
|
+
end
|
143
|
+
|
134
144
|
def add_invoice(post, money, options)
|
135
145
|
post[:amount] = amount(money)
|
136
146
|
post[:orderid] = options[:order_id]
|
@@ -170,6 +180,34 @@ module ActiveMerchant #:nodoc:
|
|
170
180
|
end
|
171
181
|
end
|
172
182
|
|
183
|
+
def add_stored_credential(post, options)
|
184
|
+
return unless (stored_credential = options[:stored_credential])
|
185
|
+
|
186
|
+
if stored_credential[:initiator] == 'cardholder'
|
187
|
+
post[:initiated_by] = 'customer'
|
188
|
+
else
|
189
|
+
post[:initiated_by] = 'merchant'
|
190
|
+
end
|
191
|
+
|
192
|
+
# :reason_type, when provided, overrides anything previously set in
|
193
|
+
# post[:billing_method] (see `add_invoice` and the :recurring) option
|
194
|
+
case stored_credential[:reason_type]
|
195
|
+
when 'recurring'
|
196
|
+
post[:billing_method] = 'recurring'
|
197
|
+
when 'installment'
|
198
|
+
post[:billing_method] = 'installment'
|
199
|
+
when 'unscheduled'
|
200
|
+
post.delete(:billing_method)
|
201
|
+
end
|
202
|
+
|
203
|
+
if stored_credential[:initial_transaction]
|
204
|
+
post[:stored_credential_indicator] = 'stored'
|
205
|
+
else
|
206
|
+
post[:stored_credential_indicator] = 'used'
|
207
|
+
post[:initial_transaction_id] = stored_credential[:network_transaction_id]
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
173
211
|
def add_customer_data(post, options)
|
174
212
|
post[:email] = options[:email]
|
175
213
|
post[:ipaddress] = options[:ip]
|
@@ -125,6 +125,9 @@ module ActiveMerchant #:nodoc:
|
|
125
125
|
|
126
126
|
def purchase(money, payment, options={})
|
127
127
|
# debit
|
128
|
+
if payment.is_a?(String)
|
129
|
+
options[:registrationId] = payment
|
130
|
+
end
|
128
131
|
execute_dbpa(options[:risk_workflow] ? 'PA.CP': 'DB',
|
129
132
|
money, payment, options)
|
130
133
|
end
|
@@ -156,6 +159,10 @@ module ActiveMerchant #:nodoc:
|
|
156
159
|
end
|
157
160
|
end
|
158
161
|
|
162
|
+
def store(credit_card, options = {})
|
163
|
+
execute_store(credit_card, options.merge(store: true))
|
164
|
+
end
|
165
|
+
|
159
166
|
def supports_scrubbing?
|
160
167
|
true
|
161
168
|
end
|
@@ -169,6 +176,15 @@ module ActiveMerchant #:nodoc:
|
|
169
176
|
|
170
177
|
private
|
171
178
|
|
179
|
+
def execute_store(payment, options)
|
180
|
+
post = {}
|
181
|
+
add_payment_method(post, payment, options)
|
182
|
+
add_address(post, options)
|
183
|
+
add_options(post, options)
|
184
|
+
add_3d_secure(post, options)
|
185
|
+
commit(post, nil, options)
|
186
|
+
end
|
187
|
+
|
172
188
|
def execute_dbpa(txtype, money, payment, options)
|
173
189
|
post = {}
|
174
190
|
post[:paymentType] = txtype
|
@@ -243,6 +259,7 @@ module ActiveMerchant #:nodoc:
|
|
243
259
|
end
|
244
260
|
|
245
261
|
def add_payment_method(post, payment, options)
|
262
|
+
return if payment.is_a?(String)
|
246
263
|
if options[:registrationId]
|
247
264
|
post[:card] = {
|
248
265
|
cvv: payment.verification_value,
|
@@ -278,7 +295,9 @@ module ActiveMerchant #:nodoc:
|
|
278
295
|
end
|
279
296
|
|
280
297
|
def build_url(url, authorization, options)
|
281
|
-
if options[:
|
298
|
+
if options[:store]
|
299
|
+
url.gsub(/payments/, 'registrations')
|
300
|
+
elsif options[:registrationId]
|
282
301
|
"#{url.gsub(/payments/, 'registrations')}/#{options[:registrationId]}/payments"
|
283
302
|
elsif authorization
|
284
303
|
"#{url}/#{authorization}"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'nokogiri'
|
1
2
|
require 'active_merchant/billing/gateways/payflow/payflow_common_api'
|
2
3
|
require 'active_merchant/billing/gateways/payflow/payflow_response'
|
3
4
|
require 'active_merchant/billing/gateways/payflow_express'
|
@@ -187,7 +188,44 @@ module ActiveMerchant #:nodoc:
|
|
187
188
|
end
|
188
189
|
end
|
189
190
|
end
|
190
|
-
xml.target
|
191
|
+
add_level_two_three_fields(xml.target!, options)
|
192
|
+
end
|
193
|
+
|
194
|
+
def add_level_two_three_fields(xml_string, options)
|
195
|
+
if options[:level_two_fields] || options[:level_three_fields]
|
196
|
+
xml_doc = Nokogiri::XML.parse(xml_string)
|
197
|
+
%i[level_two_fields level_three_fields].each do |fields|
|
198
|
+
xml_string = add_fields(xml_doc, options[fields]) if options[fields]
|
199
|
+
end
|
200
|
+
end
|
201
|
+
xml_string
|
202
|
+
end
|
203
|
+
|
204
|
+
def check_fields(parent, fields, xml_doc)
|
205
|
+
fields.each do |k, v|
|
206
|
+
if v.is_a? String
|
207
|
+
new_node = Nokogiri::XML::Node.new(k, xml_doc)
|
208
|
+
new_node.add_child(v)
|
209
|
+
xml_doc.at_css(parent).add_child(new_node)
|
210
|
+
else
|
211
|
+
check_subparent_before_continuing(parent, k, xml_doc)
|
212
|
+
check_fields(k, v, xml_doc)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
xml_doc
|
216
|
+
end
|
217
|
+
|
218
|
+
def check_subparent_before_continuing(parent, subparent, xml_doc)
|
219
|
+
unless xml_doc.at_css(subparent)
|
220
|
+
subparent_node = Nokogiri::XML::Node.new(subparent, xml_doc)
|
221
|
+
xml_doc.at_css(parent).add_child(subparent_node)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def add_fields(xml_doc, options_fields)
|
226
|
+
fields_to_add = JSON.parse(options_fields)
|
227
|
+
check_fields('Invoice', fields_to_add, xml_doc)
|
228
|
+
xml_doc.root.to_s
|
191
229
|
end
|
192
230
|
|
193
231
|
def build_check_request(action, money, check, options)
|
@@ -213,7 +251,7 @@ module ActiveMerchant #:nodoc:
|
|
213
251
|
end
|
214
252
|
end
|
215
253
|
end
|
216
|
-
xml.target
|
254
|
+
add_level_two_three_fields(xml.target!, options)
|
217
255
|
end
|
218
256
|
|
219
257
|
def add_credit_card(xml, credit_card, options = {})
|
@@ -9,7 +9,7 @@ module ActiveMerchant #:nodoc:
|
|
9
9
|
include PaypalRecurringApi
|
10
10
|
|
11
11
|
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
12
|
-
self.supported_countries = ['US']
|
12
|
+
self.supported_countries = ['CA', 'NZ', 'GB', 'US']
|
13
13
|
self.homepage_url = 'https://www.paypal.com/us/webapps/mpp/paypal-payments-pro'
|
14
14
|
self.display_name = 'PayPal Payments Pro (US)'
|
15
15
|
|
@@ -90,6 +90,8 @@ module ActiveMerchant #:nodoc:
|
|
90
90
|
xml.tag! 'n2:Payer', options[:email]
|
91
91
|
add_address(xml, 'n2:Address', address)
|
92
92
|
end
|
93
|
+
|
94
|
+
add_three_d_secure(xml, options) if options[:three_d_secure]
|
93
95
|
end
|
94
96
|
end
|
95
97
|
|
@@ -98,6 +100,17 @@ module ActiveMerchant #:nodoc:
|
|
98
100
|
xml.tag! 'n2:SoftDescriptorCity', options[:soft_descriptor_city] unless options[:soft_descriptor_city].blank?
|
99
101
|
end
|
100
102
|
|
103
|
+
def add_three_d_secure(xml, options)
|
104
|
+
three_d_secure = options[:three_d_secure]
|
105
|
+
xml.tag! 'ThreeDSecureRequest' do
|
106
|
+
xml.tag! 'MpiVendor3ds', 'Y'
|
107
|
+
xml.tag! 'AuthStatus3ds', three_d_secure[:trans_status] unless three_d_secure[:trans_status].blank?
|
108
|
+
xml.tag! 'Cavv', three_d_secure[:cavv] unless three_d_secure[:cavv].blank?
|
109
|
+
xml.tag! 'Eci3ds', three_d_secure[:eci] unless three_d_secure[:eci].blank?
|
110
|
+
xml.tag! 'Xid', three_d_secure[:xid] unless three_d_secure[:xid].blank?
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
101
114
|
def credit_card_type(type)
|
102
115
|
case type
|
103
116
|
when 'visa' then 'Visa'
|
@@ -289,12 +289,18 @@ module ActiveMerchant
|
|
289
289
|
end
|
290
290
|
|
291
291
|
def add_three_d_secure(xml, options)
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
xml.tag! '
|
292
|
+
return unless three_d_secure = options[:three_d_secure]
|
293
|
+
version = three_d_secure.fetch(:version, '')
|
294
|
+
xml.tag! 'mpi' do
|
295
|
+
if version =~ /^2/
|
296
|
+
xml.tag! 'authentication_value', three_d_secure[:cavv]
|
297
|
+
xml.tag! 'ds_trans_id', three_d_secure[:ds_transaction_id]
|
298
|
+
else
|
299
|
+
xml.tag! 'cavv', three_d_secure[:cavv]
|
300
|
+
xml.tag! 'xid', three_d_secure[:xid]
|
297
301
|
end
|
302
|
+
xml.tag! 'eci', three_d_secure[:eci]
|
303
|
+
xml.tag! 'message_version', version
|
298
304
|
end
|
299
305
|
end
|
300
306
|
|
@@ -35,19 +35,13 @@ module ActiveMerchant #:nodoc:
|
|
35
35
|
# Public: Run a purchase transaction.
|
36
36
|
#
|
37
37
|
# money - The monetary amount of the transaction in cents.
|
38
|
-
# payment_method - The CreditCard or the Spreedly payment method token.
|
38
|
+
# payment_method - The CreditCard or Check or the Spreedly payment method token.
|
39
39
|
# options - A hash of options:
|
40
40
|
# :store - Retain the payment method if the purchase
|
41
41
|
# succeeds. Defaults to false. (optional)
|
42
42
|
def purchase(money, payment_method, options = {})
|
43
|
-
|
44
|
-
|
45
|
-
else
|
46
|
-
MultiResponse.run do |r|
|
47
|
-
r.process { save_card(options[:store], payment_method, options) }
|
48
|
-
r.process { purchase_with_token(money, r.authorization, options) }
|
49
|
-
end
|
50
|
-
end
|
43
|
+
request = build_transaction_request(money, payment_method, options)
|
44
|
+
commit("gateways/#{options[:gateway_token] || @options[:gateway_token]}/purchase.xml", request)
|
51
45
|
end
|
52
46
|
|
53
47
|
# Public: Run an authorize transaction.
|
@@ -58,14 +52,8 @@ module ActiveMerchant #:nodoc:
|
|
58
52
|
# :store - Retain the payment method if the authorize
|
59
53
|
# succeeds. Defaults to false. (optional)
|
60
54
|
def authorize(money, payment_method, options = {})
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
MultiResponse.run do |r|
|
65
|
-
r.process { save_card(options[:store], payment_method, options) }
|
66
|
-
r.process { authorize_with_token(money, r.authorization, options) }
|
67
|
-
end
|
68
|
-
end
|
55
|
+
request = build_transaction_request(money, payment_method, options)
|
56
|
+
commit("gateways/#{@options[:gateway_token]}/authorize.xml", request)
|
69
57
|
end
|
70
58
|
|
71
59
|
def capture(money, authorization, options={})
|
@@ -79,6 +67,7 @@ module ActiveMerchant #:nodoc:
|
|
79
67
|
def refund(money, authorization, options={})
|
80
68
|
request = build_xml_request('transaction') do |doc|
|
81
69
|
add_invoice(doc, money, options)
|
70
|
+
add_extra_options(:gateway_specific_fields, doc, options)
|
82
71
|
end
|
83
72
|
|
84
73
|
commit("transactions/#{authorization}/credit.xml", request)
|
@@ -155,32 +144,25 @@ module ActiveMerchant #:nodoc:
|
|
155
144
|
end
|
156
145
|
|
157
146
|
def purchase_with_token(money, payment_method_token, options)
|
158
|
-
request =
|
147
|
+
request = build_transaction_request(money, payment_method_token, options)
|
159
148
|
commit("gateways/#{options[:gateway_token] || @options[:gateway_token]}/purchase.xml", request)
|
160
149
|
end
|
161
150
|
|
162
151
|
def authorize_with_token(money, payment_method_token, options)
|
163
|
-
request =
|
152
|
+
request = build_transaction_request(money, payment_method_token, options)
|
164
153
|
commit("gateways/#{@options[:gateway_token]}/authorize.xml", request)
|
165
154
|
end
|
166
155
|
|
167
156
|
def verify_with_token(payment_method_token, options)
|
168
|
-
request =
|
169
|
-
add_invoice(doc, nil, options)
|
170
|
-
doc.payment_method_token(payment_method_token)
|
171
|
-
doc.retain_on_success(true) if options[:store]
|
172
|
-
add_extra_options(:gateway_specific_fields, doc, options)
|
173
|
-
end
|
174
|
-
|
157
|
+
request = build_transaction_request(nil, payment_method_token, options)
|
175
158
|
commit("gateways/#{@options[:gateway_token]}/verify.xml", request)
|
176
159
|
end
|
177
160
|
|
178
|
-
def
|
161
|
+
def build_transaction_request(money, payment_method, options)
|
179
162
|
build_xml_request('transaction') do |doc|
|
180
163
|
add_invoice(doc, money, options)
|
164
|
+
add_payment_method(doc, payment_method, options)
|
181
165
|
add_extra_options(:gateway_specific_fields, doc, options)
|
182
|
-
doc.payment_method_token(payment_method_token)
|
183
|
-
doc.retain_on_success(true) if options[:store]
|
184
166
|
end
|
185
167
|
end
|
186
168
|
|
@@ -190,6 +172,27 @@ module ActiveMerchant #:nodoc:
|
|
190
172
|
doc.order_id(options[:order_id])
|
191
173
|
doc.ip(options[:ip]) if options[:ip]
|
192
174
|
doc.description(options[:description]) if options[:description]
|
175
|
+
|
176
|
+
if options[:merchant_name_descriptor]
|
177
|
+
doc.merchant_name_descriptor(options[:merchant_name_descriptor])
|
178
|
+
end
|
179
|
+
if options[:merchant_location_descriptor]
|
180
|
+
doc.merchant_location_descriptor(options[:merchant_location_descriptor])
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def add_payment_method(doc, payment_method, options)
|
185
|
+
doc.retain_on_success(true) if options[:store]
|
186
|
+
|
187
|
+
if payment_method.is_a?(String)
|
188
|
+
doc.payment_method_token(payment_method)
|
189
|
+
elsif payment_method.is_a?(CreditCard)
|
190
|
+
add_credit_card(doc, payment_method, options)
|
191
|
+
elsif payment_method.is_a?(Check)
|
192
|
+
add_bank_account(doc, payment_method, options)
|
193
|
+
else
|
194
|
+
raise TypeError, 'Payment method not supported'
|
195
|
+
end
|
193
196
|
end
|
194
197
|
|
195
198
|
def add_credit_card(doc, credit_card, options)
|
@@ -210,6 +213,17 @@ module ActiveMerchant #:nodoc:
|
|
210
213
|
end
|
211
214
|
end
|
212
215
|
|
216
|
+
def add_bank_account(doc, bank_account, options)
|
217
|
+
doc.bank_account do
|
218
|
+
doc.first_name(bank_account.first_name)
|
219
|
+
doc.last_name(bank_account.last_name)
|
220
|
+
doc.bank_routing_number(bank_account.routing_number)
|
221
|
+
doc.bank_account_number(bank_account.account_number)
|
222
|
+
doc.bank_account_type(bank_account.account_type)
|
223
|
+
doc.bank_account_holder_type(bank_account.account_holder_type)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
213
227
|
def add_extra_options(type, doc, options)
|
214
228
|
doc.send(type) do
|
215
229
|
extra_options_to_doc(doc, options[type])
|
@@ -544,7 +544,7 @@ module ActiveMerchant #:nodoc:
|
|
544
544
|
end
|
545
545
|
end
|
546
546
|
doc['v1'].addrLn1 billing_address[:address1] if billing_address[:address1]
|
547
|
-
doc['v1'].addrLn2 billing_address[:address2]
|
547
|
+
doc['v1'].addrLn2 billing_address[:address2] unless billing_address[:address2].blank?
|
548
548
|
doc['v1'].city billing_address[:city] if billing_address[:city]
|
549
549
|
doc['v1'].state billing_address[:state] if billing_address[:state]
|
550
550
|
doc['v1'].zipCode billing_address[:zip] if billing_address[:zip]
|
@@ -559,7 +559,7 @@ module ActiveMerchant #:nodoc:
|
|
559
559
|
doc['v1'].ship do
|
560
560
|
doc['v1'].fullName fullname unless fullname.blank?
|
561
561
|
doc['v1'].addrLn1 shipping_address[:address1] if shipping_address[:address1]
|
562
|
-
doc['v1'].addrLn2 shipping_address[:address2]
|
562
|
+
doc['v1'].addrLn2 shipping_address[:address2] unless shipping_address[:address2].blank?
|
563
563
|
doc['v1'].city shipping_address[:city] if shipping_address[:city]
|
564
564
|
doc['v1'].state shipping_address[:state] if shipping_address[:state]
|
565
565
|
doc['v1'].zipCode shipping_address[:zip] if shipping_address[:zip]
|
@@ -104,6 +104,8 @@ module ActiveMerchant #:nodoc:
|
|
104
104
|
TEST_LOGIN = 'TestMerchant'
|
105
105
|
TEST_PASSWORD = 'password'
|
106
106
|
|
107
|
+
VOIDABLE_ACTIONS = %w(preauth sale postauth credit)
|
108
|
+
|
107
109
|
self.money_format = :cents
|
108
110
|
self.supported_cardtypes = [:visa, :master, :discover, :american_express, :diners_club, :jcb]
|
109
111
|
self.supported_countries = ['US']
|
@@ -179,9 +181,10 @@ module ActiveMerchant #:nodoc:
|
|
179
181
|
# postauth, we preserve active_merchant's nomenclature of capture() for consistency with the rest of the library. To process
|
180
182
|
# a postauthorization with TC, you need an amount in cents or a money object, and a TC transid.
|
181
183
|
def capture(money, authorization, options = {})
|
184
|
+
transaction_id, _ = split_authorization(authorization)
|
182
185
|
parameters = {
|
183
186
|
:amount => amount(money),
|
184
|
-
:transid =>
|
187
|
+
:transid => transaction_id,
|
185
188
|
}
|
186
189
|
add_aggregator(parameters, options)
|
187
190
|
|
@@ -191,9 +194,10 @@ module ActiveMerchant #:nodoc:
|
|
191
194
|
# refund() allows you to return money to a card that was previously billed. You need to supply the amount, in cents or a money object,
|
192
195
|
# that you want to refund, and a TC transid for the transaction that you are refunding.
|
193
196
|
def refund(money, identification, options = {})
|
197
|
+
transaction_id, _ = split_authorization(identification)
|
194
198
|
parameters = {
|
195
199
|
:amount => amount(money),
|
196
|
-
:transid =>
|
200
|
+
:transid => transaction_id
|
197
201
|
}
|
198
202
|
add_aggregator(parameters, options)
|
199
203
|
|
@@ -214,18 +218,24 @@ module ActiveMerchant #:nodoc:
|
|
214
218
|
# TrustCommerce to allow for reversal transactions before you can use this
|
215
219
|
# method.
|
216
220
|
#
|
221
|
+
# void() is also used to to cancel a capture (postauth), purchase (sale),
|
222
|
+
# or refund (credit) or a before it is sent for settlement.
|
223
|
+
#
|
217
224
|
# NOTE: AMEX preauth's cannot be reversed. If you want to clear it more
|
218
225
|
# quickly than the automatic expiration (7-10 days), you will have to
|
219
226
|
# capture it and then immediately issue a credit for the same amount
|
220
227
|
# which should clear the customers credit card with 48 hours according to
|
221
228
|
# TC.
|
222
229
|
def void(authorization, options = {})
|
230
|
+
transaction_id, original_action = split_authorization(authorization)
|
231
|
+
action = (VOIDABLE_ACTIONS - ['preauth']).include?(original_action) ? 'void' : 'reversal'
|
232
|
+
|
223
233
|
parameters = {
|
224
|
-
:transid =>
|
234
|
+
:transid => transaction_id,
|
225
235
|
}
|
226
236
|
add_aggregator(parameters, options)
|
227
237
|
|
228
|
-
commit(
|
238
|
+
commit(action, parameters)
|
229
239
|
end
|
230
240
|
|
231
241
|
# recurring() a TrustCommerce account that is activated for Citadel, TrustCommerce's
|
@@ -416,7 +426,7 @@ module ActiveMerchant #:nodoc:
|
|
416
426
|
message = message_from(data)
|
417
427
|
Response.new(success, message, data,
|
418
428
|
:test => test?,
|
419
|
-
:authorization => data
|
429
|
+
:authorization => authorization_from(action, data),
|
420
430
|
:cvv_result => data['cvv'],
|
421
431
|
:avs_result => { :code => data['avs'] }
|
422
432
|
)
|
@@ -446,6 +456,15 @@ module ActiveMerchant #:nodoc:
|
|
446
456
|
end
|
447
457
|
end
|
448
458
|
|
459
|
+
def authorization_from(action, data)
|
460
|
+
authorization = data['transid']
|
461
|
+
authorization = "#{authorization}|#{action}" if authorization && VOIDABLE_ACTIONS.include?(action)
|
462
|
+
authorization
|
463
|
+
end
|
464
|
+
|
465
|
+
def split_authorization(authorization)
|
466
|
+
authorization.split('|')
|
467
|
+
end
|
449
468
|
end
|
450
469
|
end
|
451
470
|
end
|