activemerchant 1.76.0 → 1.77.0
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/CHANGELOG +34 -0
- data/lib/active_merchant/billing/credit_card.rb +12 -13
- data/lib/active_merchant/billing/gateways/authorize_net.rb +7 -0
- data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +8 -0
- data/lib/active_merchant/billing/gateways/borgun.rb +1 -1
- data/lib/active_merchant/billing/gateways/card_connect.rb +286 -0
- data/lib/active_merchant/billing/gateways/cashnet.rb +14 -2
- data/lib/active_merchant/billing/gateways/data_cash.rb +10 -0
- data/lib/active_merchant/billing/gateways/elavon.rb +11 -0
- data/lib/active_merchant/billing/gateways/element.rb +1 -1
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +2 -2
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +2 -0
- data/lib/active_merchant/billing/gateways/global_collect.rb +15 -0
- data/lib/active_merchant/billing/gateways/global_transport.rb +11 -0
- data/lib/active_merchant/billing/gateways/hps.rb +12 -1
- data/lib/active_merchant/billing/gateways/litle.rb +1 -1
- data/lib/active_merchant/billing/gateways/mercury.rb +14 -1
- data/lib/active_merchant/billing/gateways/moneris_us.rb +11 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +1 -0
- data/lib/active_merchant/billing/gateways/payeezy.rb +9 -2
- data/lib/active_merchant/billing/gateways/payflow.rb +8 -1
- data/lib/active_merchant/billing/gateways/payment_express.rb +2 -1
- data/lib/active_merchant/billing/gateways/redsys.rb +1 -1
- data/lib/active_merchant/billing/gateways/safe_charge.rb +2 -2
- data/lib/active_merchant/billing/gateways/stripe.rb +33 -15
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/version.rb +1 -1
- data/lib/certs/cacert.pem +60 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2916b6ecc76df1529d668ccc2d077d93fbdb68d
|
4
|
+
data.tar.gz: 6b87fb1550cd04e17d5091a9b2229c35142efd3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a9f27cdd93c846986a4983379f86c7be7a263af8bcd3c240777497e70bda59a0cb4f0aa053edfbbc22f4f4e25d750e5f58a5b7c027fdd93b66b5bbb293466cd
|
7
|
+
data.tar.gz: 85016ac5ec4a5d450cb1ac171ed9557dad231711674f3bcd771a26d4de5ae9c11f2b300899249a5dab5c61255b726072878b3beb19838a0898645bbe974dc8d1
|
data/CHANGELOG
CHANGED
@@ -2,6 +2,40 @@
|
|
2
2
|
|
3
3
|
== HEAD
|
4
4
|
|
5
|
+
== Version 1.77.0 (January 31, 2018)
|
6
|
+
* Authorize.net: Allow Transaction Id to be passed for refuds [nfarve] #2698
|
7
|
+
* Forte: ensure unit tests are local-only [bpollack] #2696
|
8
|
+
* Moneris US: ensure unit tests are local-only [bpollack] #2696
|
9
|
+
* Payflow: Change Verify Method for Amex Cards [nfarve] #2693
|
10
|
+
* Safe Charge: fix an issue with variable shadowing in the adapter [bpollack] #2697
|
11
|
+
* Crashnet: add scrubbing support [bpollack] #2695
|
12
|
+
* Barclays EPDQ: add scrubbing support [bpollack] #2695
|
13
|
+
* Fat Zebra: add remote scrubbing test [bpollack] #2695
|
14
|
+
* Clearhaus: add remote scrubbing test [bpollack] #2695
|
15
|
+
* Borgun: add remote scrubbing test [bpollack] #2695
|
16
|
+
* Stripe: Added support for the quickchip entry mode option [rbalsdon]
|
17
|
+
* Ogone: Add tests for scrubbing [bpollack] #2700
|
18
|
+
* Global Transport: Add scrubbing support [bpollack] #2700
|
19
|
+
* HPS: Add scrubbing support [bpollack] #2700
|
20
|
+
* FirstData E4: Improve scrubbing and add remote scrubbing test [bpollack] #2700
|
21
|
+
* Elavon: Add scrubbing support [bpollack] #2700
|
22
|
+
* Data Cash: Add scrubbing support [bpollack] #2700
|
23
|
+
* Litle: Fix testing URL [wsmoak] #2673
|
24
|
+
* Barclays ePDQ Extra Plus: Add missing Entrust root certificates [pacso] #2614
|
25
|
+
* Moneris US: Add scrubbing support [bpollack] #2702
|
26
|
+
* Mercury: Add scrubbing support [bpollack] #2702
|
27
|
+
* Fat Zebra: Tweak remote scrubbing test [bpollack] #2704
|
28
|
+
* Card Connect: Add new gateway [nfarve] #2706
|
29
|
+
* Payeezy: Ensure store calls are properly scrubbed [dtykocki] #2709
|
30
|
+
* Payeezy: Add unit test for scrubbing store call [dtykocki] #2710
|
31
|
+
* Element: Correct URL used by store transactions [dtykocki] #2711
|
32
|
+
* Borgun: Add support for specifying TerminalID [bpollack] #2712
|
33
|
+
* Barclaycard Smartpay: 3DS Implementation [nfarve] #2714
|
34
|
+
* Payeezy: Surface gateway_message on failure [curiousepic] #2717
|
35
|
+
* Payment Express: Scrub merchant password [curiousepic] #2723
|
36
|
+
* Stripe: Fix Partial Application Fee Refunds [curiousepic] #2713
|
37
|
+
* GooglePay: Support network tokenized cards [joshnuss] #2725
|
38
|
+
|
5
39
|
== Version 1.76.0 (January 3, 2018)
|
6
40
|
* PayU Latam: Change default text for description [nfarve] #2669
|
7
41
|
* Checkout V2: Allows AVS and CVV result details to come through on authorizations [deedeelavinder] #2650
|
@@ -176,21 +176,20 @@ module ActiveMerchant #:nodoc:
|
|
176
176
|
# @return [String]
|
177
177
|
attr_accessor :icc_data
|
178
178
|
|
179
|
-
# Returns or sets
|
180
|
-
# This can be an arbitrary string.
|
179
|
+
# Returns or sets information about the source of the card data.
|
181
180
|
#
|
182
181
|
# @return [String]
|
183
|
-
attr_accessor :
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
182
|
+
attr_accessor :read_method
|
183
|
+
|
184
|
+
READ_METHOD_DESCRIPTIONS = {
|
185
|
+
nil => 'A card reader was not used.',
|
186
|
+
'fallback_no_chip' => 'Magstripe was read because the card has no chip.',
|
187
|
+
'fallback_chip_error' => "Magstripe was read because the card's chip failed.",
|
188
|
+
'contactless' => 'Data was read by a Contactless EMV kernel. Issuer script results are not available.',
|
189
|
+
'contactless_magstripe' => 'Contactless data was read with a non-EMV protocol.',
|
190
|
+
'contact' => 'Data was read using the EMV protocol. Issuer script results may follow.',
|
191
|
+
'contact_quickchip' => 'Data was read by the Quickchip EMV kernel. Issuer script results are not available.',
|
192
|
+
}
|
194
193
|
|
195
194
|
# Returns the ciphertext of the card's encrypted PIN.
|
196
195
|
#
|
@@ -168,6 +168,7 @@ module ActiveMerchant
|
|
168
168
|
xml.amount(amount(amount))
|
169
169
|
|
170
170
|
add_payment_source(xml, payment)
|
171
|
+
xml.refTransId(transaction_id_from(options[:transaction_id])) if options[:transaction_id]
|
171
172
|
add_invoice(xml, 'refundTransaction', options)
|
172
173
|
add_customer_data(xml, payment, options)
|
173
174
|
add_settings(xml, payment, options)
|
@@ -423,6 +424,12 @@ module ActiveMerchant
|
|
423
424
|
xml.settingValue(options[:header_email_receipt])
|
424
425
|
end
|
425
426
|
end
|
427
|
+
if options[:test_request]
|
428
|
+
xml.setting do
|
429
|
+
xml.settingName("testRequest")
|
430
|
+
xml.settingValue("1")
|
431
|
+
end
|
432
|
+
end
|
426
433
|
end
|
427
434
|
end
|
428
435
|
|
@@ -35,6 +35,7 @@ module ActiveMerchant #:nodoc:
|
|
35
35
|
post[:card] = credit_card_hash(creditcard)
|
36
36
|
post[:billingAddress] = billing_address_hash(options) if options[:billing_address]
|
37
37
|
post[:deliveryAddress] = shipping_address_hash(options) if options[:shipping_address]
|
38
|
+
add_3ds(post, options) if options[:execute_threed]
|
38
39
|
commit('authorise', post)
|
39
40
|
end
|
40
41
|
|
@@ -222,6 +223,8 @@ module ActiveMerchant #:nodoc:
|
|
222
223
|
case action
|
223
224
|
when 'store'
|
224
225
|
"#{test? ? self.test_url : self.live_url}/Recurring/v12/storeToken"
|
226
|
+
when 'finalize3ds'
|
227
|
+
"#{test? ? self.test_url : self.live_url}/Payment/v12/authorise3d"
|
225
228
|
else
|
226
229
|
"#{test? ? self.test_url : self.live_url}/Payment/v12/#{action}"
|
227
230
|
end
|
@@ -312,6 +315,11 @@ module ActiveMerchant #:nodoc:
|
|
312
315
|
hash[:shopperReference] = options[:customer] if options[:customer]
|
313
316
|
hash.keep_if { |_, v| v }
|
314
317
|
end
|
318
|
+
|
319
|
+
def add_3ds(post, options)
|
320
|
+
post[:additionalData] = { executeThreeD: 'true' }
|
321
|
+
post[:browserInfo] = { userAgent: options[:user_agent], acceptHeader: options[:accept_header] }
|
322
|
+
end
|
315
323
|
end
|
316
324
|
end
|
317
325
|
end
|
@@ -84,6 +84,7 @@ module ActiveMerchant #:nodoc:
|
|
84
84
|
def add_invoice(post, money, options)
|
85
85
|
post[:TrAmount] = amount(money)
|
86
86
|
post[:TrCurrency] = CURRENCY_CODES[options[:currency] || currency(money)]
|
87
|
+
post[:TerminalID] = options[:terminal_id] || '1'
|
87
88
|
end
|
88
89
|
|
89
90
|
def add_payment_method(post, payment_method)
|
@@ -129,7 +130,6 @@ module ActiveMerchant #:nodoc:
|
|
129
130
|
post[:Version] = '1000'
|
130
131
|
post[:Processor] = @options[:processor]
|
131
132
|
post[:MerchantID] = @options[:merchant_id]
|
132
|
-
post[:TerminalID] = 1
|
133
133
|
|
134
134
|
url = (test? ? test_url : live_url)
|
135
135
|
request = build_request(action, post)
|
@@ -0,0 +1,286 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
class CardConnectGateway < Gateway
|
4
|
+
self.test_url = 'https://fts.cardconnect.com:6443/cardconnect/rest/'
|
5
|
+
self.live_url = 'https://fts.cardconnect.com:8443/cardconnect/rest/'
|
6
|
+
|
7
|
+
self.supported_countries = ['US']
|
8
|
+
self.default_currency = 'USD'
|
9
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
10
|
+
|
11
|
+
self.homepage_url = 'https://cardconnect.com/'
|
12
|
+
self.display_name = 'Card Connect'
|
13
|
+
|
14
|
+
STANDARD_ERROR_CODE_MAPPING = {
|
15
|
+
'11' => STANDARD_ERROR_CODE[:card_declined],
|
16
|
+
'12' => STANDARD_ERROR_CODE[:incorrect_number],
|
17
|
+
'13' => STANDARD_ERROR_CODE[:incorrect_cvc],
|
18
|
+
'14' => STANDARD_ERROR_CODE[:incorrect_cvc],
|
19
|
+
'15' => STANDARD_ERROR_CODE[:invalid_expiry_date],
|
20
|
+
'16' => STANDARD_ERROR_CODE[:expired_card],
|
21
|
+
'17' => STANDARD_ERROR_CODE[:incorrect_zip],
|
22
|
+
'21' => STANDARD_ERROR_CODE[:config_error],
|
23
|
+
'22' => STANDARD_ERROR_CODE[:config_error],
|
24
|
+
'23' => STANDARD_ERROR_CODE[:config_error],
|
25
|
+
'24' => STANDARD_ERROR_CODE[:processing_error],
|
26
|
+
'25' => STANDARD_ERROR_CODE[:processing_error],
|
27
|
+
'27' => STANDARD_ERROR_CODE[:processing_error],
|
28
|
+
'28' => STANDARD_ERROR_CODE[:processing_error],
|
29
|
+
'29' => STANDARD_ERROR_CODE[:processing_error],
|
30
|
+
'31' => STANDARD_ERROR_CODE[:processing_error],
|
31
|
+
'32' => STANDARD_ERROR_CODE[:processing_error],
|
32
|
+
'33' => STANDARD_ERROR_CODE[:card_declined],
|
33
|
+
'34' => STANDARD_ERROR_CODE[:card_declined],
|
34
|
+
'35' => STANDARD_ERROR_CODE[:incorrect_zip],
|
35
|
+
'36' => STANDARD_ERROR_CODE[:processing_error],
|
36
|
+
'37' => STANDARD_ERROR_CODE[:incorrect_cvc],
|
37
|
+
'41' => STANDARD_ERROR_CODE[:processing_error],
|
38
|
+
'42' => STANDARD_ERROR_CODE[:processing_error],
|
39
|
+
'43' => STANDARD_ERROR_CODE[:processing_error],
|
40
|
+
'44' => STANDARD_ERROR_CODE[:config_error],
|
41
|
+
'61' => STANDARD_ERROR_CODE[:processing_error],
|
42
|
+
'62' => STANDARD_ERROR_CODE[:processing_error],
|
43
|
+
'63' => STANDARD_ERROR_CODE[:processing_error],
|
44
|
+
'64' => STANDARD_ERROR_CODE[:config_error],
|
45
|
+
'65' => STANDARD_ERROR_CODE[:processing_error],
|
46
|
+
'66' => STANDARD_ERROR_CODE[:processing_error],
|
47
|
+
'91' => STANDARD_ERROR_CODE[:processing_error],
|
48
|
+
'92' => STANDARD_ERROR_CODE[:processing_error],
|
49
|
+
'93' => STANDARD_ERROR_CODE[:processing_error],
|
50
|
+
'94' => STANDARD_ERROR_CODE[:processing_error],
|
51
|
+
'95' => STANDARD_ERROR_CODE[:config_error],
|
52
|
+
'96' => STANDARD_ERROR_CODE[:processing_error],
|
53
|
+
'NU' => STANDARD_ERROR_CODE[:card_declined],
|
54
|
+
'N3' => STANDARD_ERROR_CODE[:card_declined],
|
55
|
+
'NJ' => STANDARD_ERROR_CODE[:card_declined],
|
56
|
+
'51' => STANDARD_ERROR_CODE[:card_declined],
|
57
|
+
'C2' => STANDARD_ERROR_CODE[:incorrect_cvc],
|
58
|
+
'54' => STANDARD_ERROR_CODE[:expired_card],
|
59
|
+
'05' => STANDARD_ERROR_CODE[:card_declined],
|
60
|
+
'03' => STANDARD_ERROR_CODE[:config_error],
|
61
|
+
'60' => STANDARD_ERROR_CODE[:pickup_card]
|
62
|
+
}
|
63
|
+
|
64
|
+
def initialize(options = {})
|
65
|
+
requires!(options, :merchant_id, :username, :password)
|
66
|
+
require_valid_domain!(options, :domain)
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
def require_valid_domain!(options, param)
|
71
|
+
if options.key?(param)
|
72
|
+
raise ArgumentError.new('not a valid cardconnect domain') unless /\Dcardconnect.com:\d{1,}\D/ =~ options[param]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def purchase(money, payment, options = {})
|
77
|
+
if options[:po_number]
|
78
|
+
MultiResponse.run do |r|
|
79
|
+
r.process { authorize(money, payment, options) }
|
80
|
+
r.process { capture(money, r.authorization, options) }
|
81
|
+
end
|
82
|
+
else
|
83
|
+
post = {}
|
84
|
+
add_invoice(post, options)
|
85
|
+
add_money(post, money)
|
86
|
+
add_payment(post, payment)
|
87
|
+
add_currency(post, money, options)
|
88
|
+
add_address(post, options)
|
89
|
+
add_customer_data(post, options)
|
90
|
+
add_3DS(post, options)
|
91
|
+
post[:capture] = 'Y'
|
92
|
+
commit('auth', post)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def authorize(money, payment, options = {})
|
97
|
+
post = {}
|
98
|
+
add_money(post, money)
|
99
|
+
add_currency(post, money, options)
|
100
|
+
add_invoice(post, options)
|
101
|
+
add_payment(post, payment)
|
102
|
+
add_address(post, options)
|
103
|
+
add_customer_data(post, options)
|
104
|
+
add_3DS(post, options)
|
105
|
+
commit('auth', post)
|
106
|
+
end
|
107
|
+
|
108
|
+
def capture(money, authorization, options = {})
|
109
|
+
post = {}
|
110
|
+
add_money(post, money)
|
111
|
+
add_reference(post, authorization)
|
112
|
+
add_additional_data(post, options)
|
113
|
+
commit('capture', post)
|
114
|
+
end
|
115
|
+
|
116
|
+
def refund(money, authorization, options = {})
|
117
|
+
post = {}
|
118
|
+
add_money(post, money)
|
119
|
+
add_reference(post, authorization)
|
120
|
+
commit('refund', post)
|
121
|
+
end
|
122
|
+
|
123
|
+
def void(authorization, options = {})
|
124
|
+
post = {}
|
125
|
+
add_reference(post, authorization)
|
126
|
+
commit('void', post)
|
127
|
+
end
|
128
|
+
|
129
|
+
def verify(credit_card, options = {})
|
130
|
+
authorize(0, credit_card, options)
|
131
|
+
end
|
132
|
+
|
133
|
+
def supports_scrubbing?
|
134
|
+
true
|
135
|
+
end
|
136
|
+
|
137
|
+
def scrub(transcript)
|
138
|
+
transcript
|
139
|
+
.gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]')
|
140
|
+
.gsub(%r(("cvv2\\":\\")\d*), '\1[FILTERED]')
|
141
|
+
.gsub(%r(("merchid\\":\\")\d*), '\1[FILTERED]')
|
142
|
+
.gsub(%r((&?"account\\":\\")\d*), '\1[FILTERED]')
|
143
|
+
.gsub(%r((&?"token\\":\\")\d*), '\1[FILTERED]')
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def add_customer_data(post, options)
|
149
|
+
post[:email] = options[:email] if options[:email]
|
150
|
+
end
|
151
|
+
|
152
|
+
def add_address(post, options)
|
153
|
+
if address = options[:billing_address] || options[:address]
|
154
|
+
post[:address] = address[:address1] if address[:address1]
|
155
|
+
post[:address].concat(" #{address[:address2]}") if address[:address2]
|
156
|
+
post[:city] = address[:city] if address[:city]
|
157
|
+
post[:region] = address[:state] if address[:state]
|
158
|
+
post[:country] = address[:country] if address[:country]
|
159
|
+
post[:postal] = address[:zip] if address[:zip]
|
160
|
+
post[:phone] = address[:phone] if address[:phone]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def add_money(post, money)
|
165
|
+
post[:amount] = amount(money)
|
166
|
+
end
|
167
|
+
|
168
|
+
def add_currency(post, money, options)
|
169
|
+
post[:currency] = (options[:currency] || currency(money))
|
170
|
+
end
|
171
|
+
|
172
|
+
def add_invoice(post, options)
|
173
|
+
post[:orderid] = options[:order_id]
|
174
|
+
post[:ecomind] = (options[:recurring] ? 'R' : 'E')
|
175
|
+
end
|
176
|
+
|
177
|
+
def add_payment(post, payment)
|
178
|
+
post[:name] = payment.name
|
179
|
+
if card_brand(payment) == 'check'
|
180
|
+
add_echeck(post, payment)
|
181
|
+
else
|
182
|
+
post[:account] = payment.number
|
183
|
+
post[:expiry] = expdate(payment)
|
184
|
+
post[:cvv2] = payment.verification_value
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def add_echeck(post, payment)
|
189
|
+
post[:accttype] = 'ECHK'
|
190
|
+
post[:account] = payment.account_number
|
191
|
+
post[:bankaba] = payment.routing_number
|
192
|
+
end
|
193
|
+
|
194
|
+
def add_reference(post, authorization)
|
195
|
+
post[:retref] = authorization
|
196
|
+
end
|
197
|
+
|
198
|
+
def add_additional_data(post, options)
|
199
|
+
post[:ponumber] = options[:po_number]
|
200
|
+
post[:taxamnt] = options[:tax_amount] if options[:tax_amount]
|
201
|
+
post[:frtamnt] = options[:freight_amount] if options[:freight_amount]
|
202
|
+
post[:dutyamnt] = options[:duty_amount] if options[:duty_amount]
|
203
|
+
post[:orderdate] = options[:order_date] if options[:order_date]
|
204
|
+
post[:shipfromzip] = options[:ship_from_zip] if options[:ship_from_zip]
|
205
|
+
if (shipping_address = options[:shipping_address])
|
206
|
+
post[:shiptozip] = shipping_address[:zip]
|
207
|
+
post[:shiptocountry] = shipping_address[:country]
|
208
|
+
end
|
209
|
+
if options[:items]
|
210
|
+
post[:items] = options[:items].map do |item|
|
211
|
+
updated = {}
|
212
|
+
item.each_pair do |k, v|
|
213
|
+
updated.merge!(k.to_s.gsub(/_/, '') => v)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def add_3DS(post, options)
|
220
|
+
post[:secureflag] = options[:secure_flag] if options[:secure_flag]
|
221
|
+
post[:securevalue] = options[:secure_value] if options[:secure_value]
|
222
|
+
post[:securexid] = options[:secure_xid] if options[:secure_xid]
|
223
|
+
end
|
224
|
+
|
225
|
+
def headers
|
226
|
+
{
|
227
|
+
'Authorization' => 'Basic ' + Base64.strict_encode64("#{@options[:username]}:#{@options[:password]}"),
|
228
|
+
'Content-Type' => 'application/json'
|
229
|
+
}
|
230
|
+
end
|
231
|
+
|
232
|
+
def expdate(credit_card)
|
233
|
+
"#{format(credit_card.month, :two_digits)}#{format(credit_card.year, :two_digits)}"
|
234
|
+
end
|
235
|
+
|
236
|
+
def parse(body)
|
237
|
+
JSON.parse(body)
|
238
|
+
end
|
239
|
+
|
240
|
+
def url(action)
|
241
|
+
if test?
|
242
|
+
test_url + action
|
243
|
+
else
|
244
|
+
(@options[:domain] ? @options[:domain] : live_url) + action
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def commit(action, parameters)
|
249
|
+
parameters[:merchid] = @options[:merchant_id]
|
250
|
+
url = url(action)
|
251
|
+
response = parse(ssl_request(:put, url, post_data(parameters), headers))
|
252
|
+
|
253
|
+
Response.new(
|
254
|
+
success_from(response),
|
255
|
+
message_from(response),
|
256
|
+
response,
|
257
|
+
authorization: authorization_from(response),
|
258
|
+
avs_result: AVSResult.new(code: response['avsresp']),
|
259
|
+
cvv_result: CVVResult.new(response['cvvresp']),
|
260
|
+
test: test?,
|
261
|
+
error_code: error_code_from(response)
|
262
|
+
)
|
263
|
+
end
|
264
|
+
|
265
|
+
def success_from(response)
|
266
|
+
response['respstat'] == 'A'
|
267
|
+
end
|
268
|
+
|
269
|
+
def message_from(response)
|
270
|
+
response['setlstat'] ? "#{response['resptext']} #{response['setlstat']}" : response['resptext']
|
271
|
+
end
|
272
|
+
|
273
|
+
def authorization_from(response)
|
274
|
+
response['retref']
|
275
|
+
end
|
276
|
+
|
277
|
+
def post_data(parameters = {})
|
278
|
+
parameters.to_json
|
279
|
+
end
|
280
|
+
|
281
|
+
def error_code_from(response)
|
282
|
+
STANDARD_ERROR_CODE_MAPPING[response['respcode']] unless success_from(response)
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
end
|
@@ -3,7 +3,8 @@ module ActiveMerchant #:nodoc:
|
|
3
3
|
class CashnetGateway < Gateway
|
4
4
|
include Empty
|
5
5
|
|
6
|
-
self.live_url
|
6
|
+
self.live_url = "https://commerce.cashnet.com/"
|
7
|
+
self.test_url = "https://train.cashnet.com/"
|
7
8
|
|
8
9
|
self.supported_countries = ["US"]
|
9
10
|
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
|
@@ -54,11 +55,22 @@ module ActiveMerchant #:nodoc:
|
|
54
55
|
commit('REFUND', money, post)
|
55
56
|
end
|
56
57
|
|
58
|
+
def supports_scrubbing?
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
62
|
+
def scrub(transcript)
|
63
|
+
transcript
|
64
|
+
.gsub(%r{(password=)[^&]+}, '\1[FILTERED]')
|
65
|
+
.gsub(%r{(cardno=)[^&]+}, '\1[FILTERED]')
|
66
|
+
.gsub(%r{(cid=)[^&]+}, '\1[FILTERED]')
|
67
|
+
end
|
68
|
+
|
57
69
|
private
|
58
70
|
|
59
71
|
def commit(action, money, fields)
|
60
72
|
fields[:amount] = amount(money)
|
61
|
-
url = live_url + CGI.escape(@options[:merchant_gateway_name])
|
73
|
+
url = (test? ? test_url : live_url) + CGI.escape(@options[:merchant_gateway_name])
|
62
74
|
raw_response = ssl_post(url, post_data(action, fields))
|
63
75
|
parsed_response = parse(raw_response)
|
64
76
|
|
@@ -77,6 +77,16 @@ module ActiveMerchant
|
|
77
77
|
commit(build_transaction_refund_request(money, reference))
|
78
78
|
end
|
79
79
|
|
80
|
+
def supports_scrubbing?
|
81
|
+
true
|
82
|
+
end
|
83
|
+
|
84
|
+
def scrub(transcript)
|
85
|
+
transcript.
|
86
|
+
gsub(/(<pan>)\d+(<\/pan>)/i, '\1[FILTERED]\2').
|
87
|
+
gsub(/(<cv2>)\d+(<\/cv2>)/i, '\1[FILTERED]\2').
|
88
|
+
gsub(/(<password>).+(<\/password>)/i, '\1[FILTERED]\2')
|
89
|
+
end
|
80
90
|
|
81
91
|
private
|
82
92
|
|
@@ -136,6 +136,17 @@ module ActiveMerchant #:nodoc:
|
|
136
136
|
commit(:update, nil, form, options)
|
137
137
|
end
|
138
138
|
|
139
|
+
def supports_scrubbing?
|
140
|
+
true
|
141
|
+
end
|
142
|
+
|
143
|
+
def scrub(transcript)
|
144
|
+
transcript.
|
145
|
+
gsub(%r((&?ssl_pin=)[^&]*)i, '\1[FILTERED]').
|
146
|
+
gsub(%r((&?ssl_card_number=)[^&\\n\r\n]*)i, '\1[FILTERED]').
|
147
|
+
gsub(%r((&?ssl_cvv2cvc2=)[^&]*)i, '\1[FILTERED]')
|
148
|
+
end
|
149
|
+
|
139
150
|
private
|
140
151
|
|
141
152
|
def add_invoice(form,options)
|
@@ -15,7 +15,7 @@ module ActiveMerchant #:nodoc:
|
|
15
15
|
self.display_name = 'Element'
|
16
16
|
|
17
17
|
SERVICE_TEST_URL = 'https://certservices.elementexpress.com/express.asmx'
|
18
|
-
SERVICE_LIVE_URL = 'https://
|
18
|
+
SERVICE_LIVE_URL = 'https://services.elementexpress.com/express.asmx'
|
19
19
|
|
20
20
|
def initialize(options={})
|
21
21
|
requires!(options, :account_id, :account_token, :application_id, :acceptor_id, :application_name, :application_version)
|
@@ -78,8 +78,8 @@ module ActiveMerchant #:nodoc:
|
|
78
78
|
def scrub(transcript)
|
79
79
|
transcript.
|
80
80
|
gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
|
81
|
-
gsub(%r(("card_number
|
82
|
-
gsub(%r(("cvv
|
81
|
+
gsub(%r(("card_number\\?":\\?")[^"\\]*)i, '\1[FILTERED]').
|
82
|
+
gsub(%r(("cvv\\?":\\?")\d+), '\1[FILTERED]')
|
83
83
|
end
|
84
84
|
|
85
85
|
private
|
@@ -144,7 +144,9 @@ module ActiveMerchant #:nodoc:
|
|
144
144
|
transcript
|
145
145
|
.gsub(%r((<Card_Number>).+(</Card_Number>)), '\1[FILTERED]\2')
|
146
146
|
.gsub(%r((<VerificationStr2>).+(</VerificationStr2>)), '\1[FILTERED]\2')
|
147
|
+
.gsub(%r((<Password>).+(</Password>))i, '\1[FILTERED]\2')
|
147
148
|
.gsub(%r((<CAVV>).+(</CAVV>)), '\1[FILTERED]\2')
|
149
|
+
.gsub(%r((Card Number : ).*\d)i, '\1[FILTERED]')
|
148
150
|
end
|
149
151
|
|
150
152
|
def supports_network_tokenization?
|
@@ -33,6 +33,7 @@ module ActiveMerchant #:nodoc:
|
|
33
33
|
add_payment(post, payment, options)
|
34
34
|
add_customer_data(post, options, payment)
|
35
35
|
add_address(post, payment, options)
|
36
|
+
add_creator_info(post, options)
|
36
37
|
|
37
38
|
commit(:authorize, post)
|
38
39
|
end
|
@@ -41,6 +42,7 @@ module ActiveMerchant #:nodoc:
|
|
41
42
|
post = nestable_hash
|
42
43
|
add_order(post, money, options)
|
43
44
|
add_customer_data(post, options)
|
45
|
+
add_creator_info(post, options)
|
44
46
|
commit(:capture, post, authorization)
|
45
47
|
end
|
46
48
|
|
@@ -48,11 +50,13 @@ module ActiveMerchant #:nodoc:
|
|
48
50
|
post = nestable_hash
|
49
51
|
add_amount(post, money, options)
|
50
52
|
add_refund_customer_data(post, options)
|
53
|
+
add_creator_info(post, options)
|
51
54
|
commit(:refund, post, authorization)
|
52
55
|
end
|
53
56
|
|
54
57
|
def void(authorization, options={})
|
55
58
|
post = nestable_hash
|
59
|
+
add_creator_info(post, options)
|
56
60
|
commit(:void, post, authorization)
|
57
61
|
end
|
58
62
|
|
@@ -99,6 +103,17 @@ module ActiveMerchant #:nodoc:
|
|
99
103
|
}
|
100
104
|
end
|
101
105
|
|
106
|
+
def add_creator_info(post, options)
|
107
|
+
post['sdkIdentifier'] = options[:sdk_identifier] if options[:sdk_identifier]
|
108
|
+
post['sdkCreator'] = options[:sdk_creator] if options[:sdk_creator]
|
109
|
+
post['integrator'] = options[:integrator] if options[:integrator]
|
110
|
+
post['shoppingCartExtension'] = {}
|
111
|
+
post['shoppingCartExtension']['creator'] = options[:creator] if options[:creator]
|
112
|
+
post['shoppingCartExtension']['name'] = options[:name] if options[:name]
|
113
|
+
post['shoppingCartExtension']['version'] = options[:version] if options[:version]
|
114
|
+
post['shoppingCartExtension']['extensionID'] = options[:extension_ID] if options[:extension_ID]
|
115
|
+
end
|
116
|
+
|
102
117
|
def add_amount(post, money, options={})
|
103
118
|
post["amountOfMoney"] = {
|
104
119
|
"amount" => amount(money),
|
@@ -75,6 +75,17 @@ module ActiveMerchant #:nodoc:
|
|
75
75
|
commit('CardVerify', post, options)
|
76
76
|
end
|
77
77
|
|
78
|
+
def supports_scrubbing?
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def scrub(transcript)
|
83
|
+
transcript.
|
84
|
+
gsub(%r((&?CardNum=)[^&]*)i, '\1[FILTERED]').
|
85
|
+
gsub(%r((&?CVNum=)[^&]*)i, '\1[FILTERED]').
|
86
|
+
gsub(%r((&?GlobalPassword=)[^&]*)i, '\1[FILTERED]')
|
87
|
+
end
|
88
|
+
|
78
89
|
private
|
79
90
|
|
80
91
|
def add_address(post, options)
|
@@ -73,6 +73,17 @@ module ActiveMerchant #:nodoc:
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
def supports_scrubbing?
|
77
|
+
true
|
78
|
+
end
|
79
|
+
|
80
|
+
def scrub(transcript)
|
81
|
+
transcript.
|
82
|
+
gsub(%r((<hps:CardNbr>)[^<]*(<\/hps:CardNbr>))i, '\1[FILTERED]\2').
|
83
|
+
gsub(%r((<hps:CVV2>)[^<]*(<\/hps:CVV2>))i, '\1[FILTERED]\2').
|
84
|
+
gsub(%r((<hps:SecretAPIKey>)[^<]*(<\/hps:SecretAPIKey>))i, '\1[FILTERED]\2')
|
85
|
+
end
|
86
|
+
|
76
87
|
private
|
77
88
|
|
78
89
|
def add_reference(xml, transaction_id)
|
@@ -218,7 +229,7 @@ module ActiveMerchant #:nodoc:
|
|
218
229
|
data = build_request(action, &request)
|
219
230
|
|
220
231
|
response = begin
|
221
|
-
parse(ssl_post((test? ? test_url : live_url), data, 'Content-
|
232
|
+
parse(ssl_post((test? ? test_url : live_url), data, 'Content-Type' => 'text/xml'))
|
222
233
|
rescue ResponseError => e
|
223
234
|
parse(e.response.body)
|
224
235
|
end
|
@@ -5,7 +5,7 @@ module ActiveMerchant #:nodoc:
|
|
5
5
|
class LitleGateway < Gateway
|
6
6
|
SCHEMA_VERSION = '9.12'
|
7
7
|
|
8
|
-
self.test_url = 'https://www.
|
8
|
+
self.test_url = 'https://www.testvantivcnp.com/sandbox/communicator/online'
|
9
9
|
self.live_url = 'https://payments.vantivcnp.com/vap/communicator/online'
|
10
10
|
|
11
11
|
self.supported_countries = ['US']
|
@@ -81,6 +81,19 @@ module ActiveMerchant #:nodoc:
|
|
81
81
|
commit('CardLookup', request)
|
82
82
|
end
|
83
83
|
|
84
|
+
def supports_scrubbing?
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
def scrub(transcript)
|
89
|
+
transcript.
|
90
|
+
gsub(%r(<), "<").
|
91
|
+
gsub(%r(>), ">").
|
92
|
+
gsub(%r((<pw>).*(</pw>))i, '\1[FILTERED]\2').
|
93
|
+
gsub(%r((<AcctNo>)(\d|x)*(</AcctNo>))i, '\1[FILTERED]\3').
|
94
|
+
gsub(%r((<CVVData>)\d*(</CVVData>))i, '\1[FILTERED]\2')
|
95
|
+
end
|
96
|
+
|
84
97
|
private
|
85
98
|
|
86
99
|
def build_non_authorized_request(action, money, credit_card, options)
|
@@ -126,7 +139,7 @@ module ActiveMerchant #:nodoc:
|
|
126
139
|
xml.tag! 'TranInfo' do
|
127
140
|
xml.tag! "AuthCode", auth_code
|
128
141
|
xml.tag! "AcqRefData", acq_ref_data
|
129
|
-
xml.tag! "ProcessData", process_data
|
142
|
+
xml.tag! "ProcessData", process_data
|
130
143
|
end
|
131
144
|
end
|
132
145
|
end
|
@@ -137,6 +137,17 @@ module ActiveMerchant #:nodoc:
|
|
137
137
|
commit('us_res_update_cc', post)
|
138
138
|
end
|
139
139
|
|
140
|
+
def supports_scrubbing?
|
141
|
+
true
|
142
|
+
end
|
143
|
+
|
144
|
+
def scrub(transcript)
|
145
|
+
transcript.
|
146
|
+
gsub(%r((<pan>)[^<]*(</pan>))i, '\1[FILTERED]\2').
|
147
|
+
gsub(%r((<api_token>)[^<]*(</api_token>))i, '\1[FILTERED]\2').
|
148
|
+
gsub(%r((<cvd_value>)[^<]*(</cvd_value>))i, '\1[FILTERED]\2')
|
149
|
+
end
|
150
|
+
|
140
151
|
private # :nodoc: all
|
141
152
|
|
142
153
|
def expdate(creditcard)
|
@@ -334,6 +334,7 @@ module ActiveMerchant #:nodoc:
|
|
334
334
|
def add_invoice(post, options)
|
335
335
|
add_pair post, 'orderID', options[:order_id] || generate_unique_id[0...30]
|
336
336
|
add_pair post, 'COM', options[:description]
|
337
|
+
add_pair post, 'ORIG', options[:origin] if options[:origin]
|
337
338
|
end
|
338
339
|
|
339
340
|
def add_creditcard(post, creditcard)
|
@@ -104,10 +104,17 @@ module ActiveMerchant
|
|
104
104
|
def scrub(transcript)
|
105
105
|
transcript.
|
106
106
|
gsub(%r((Token: )(\w|-)+), '\1[FILTERED]').
|
107
|
+
gsub(%r((Apikey: )(\w|-)+), '\1[FILTERED]').
|
107
108
|
gsub(%r((\\?"card_number\\?":\\?")\d+), '\1[FILTERED]').
|
108
109
|
gsub(%r((\\?"cvv\\?":\\?")\d+), '\1[FILTERED]').
|
109
110
|
gsub(%r((\\?"account_number\\?":\\?")\d+), '\1[FILTERED]').
|
110
|
-
gsub(%r((\\?"routing_number\\?":\\?")\d+), '\1[FILTERED]')
|
111
|
+
gsub(%r((\\?"routing_number\\?":\\?")\d+), '\1[FILTERED]').
|
112
|
+
gsub(%r((\\?card_number=)\d+(&?)), '\1[FILTERED]').
|
113
|
+
gsub(%r((\\?cvv=)\d+(&?)), '\1[FILTERED]').
|
114
|
+
gsub(%r((\\?apikey=)\w+(&?)), '\1[FILTERED]').
|
115
|
+
gsub(%r{(\\?"credit_card\.card_number\\?":)(\\?"[^"]+\\?")}, '\1[FILTERED]').
|
116
|
+
gsub(%r{(\\?"credit_card\.cvv\\?":)(\\?"[^"]+\\?")}, '\1[FILTERED]').
|
117
|
+
gsub(%r{(\\?"apikey\\?":)(\\?"[^"]+\\?")}, '\1[FILTERED]')
|
111
118
|
end
|
112
119
|
|
113
120
|
private
|
@@ -345,7 +352,7 @@ module ActiveMerchant
|
|
345
352
|
elsif response.key?('fault')
|
346
353
|
response['fault'].to_h['faultstring']
|
347
354
|
else
|
348
|
-
response['bank_message'] || 'Failure to successfully create token.'
|
355
|
+
response['bank_message'] || response['gateway_message'] || 'Failure to successfully create token.'
|
349
356
|
end
|
350
357
|
end
|
351
358
|
|
@@ -45,7 +45,14 @@ module ActiveMerchant #:nodoc:
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def verify(payment, options={})
|
48
|
-
|
48
|
+
if credit_card_type(payment) == 'Amex'
|
49
|
+
MultiResponse.run(:use_first_response) do |r|
|
50
|
+
r.process { authorize(100, payment, options) }
|
51
|
+
r.process(:ignore_result) { void(r.authorization, options) }
|
52
|
+
end
|
53
|
+
else
|
54
|
+
authorize(0, payment, options)
|
55
|
+
end
|
49
56
|
end
|
50
57
|
|
51
58
|
def verify_credentials
|
@@ -128,7 +128,8 @@ module ActiveMerchant #:nodoc:
|
|
128
128
|
|
129
129
|
def scrub(transcript)
|
130
130
|
transcript.
|
131
|
-
gsub(%r((
|
131
|
+
gsub(%r((<PostPassword>).+(</PostPassword>)), '\1[FILTERED]\2').
|
132
|
+
gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]\2').
|
132
133
|
gsub(%r((<CardNumber>)\d+(</CardNumber>)), '\1[FILTERED]\2').
|
133
134
|
gsub(%r((<Cvc2>)\d+(</Cvc2>)), '\1[FILTERED]\2')
|
134
135
|
end
|
@@ -170,8 +170,8 @@ module ActiveMerchant #:nodoc:
|
|
170
170
|
if childnode.elements.size == 0
|
171
171
|
element_name_to_symbol(response, childnode)
|
172
172
|
else
|
173
|
-
childnode.traverse do |
|
174
|
-
element_name_to_symbol(response,
|
173
|
+
childnode.traverse do |node|
|
174
|
+
element_name_to_symbol(response, node)
|
175
175
|
end
|
176
176
|
end
|
177
177
|
end
|
@@ -112,6 +112,7 @@ module ActiveMerchant #:nodoc:
|
|
112
112
|
end
|
113
113
|
r.process do
|
114
114
|
post = create_post_for_auth_or_purchase(money, payment, options)
|
115
|
+
post[:card][:processing_method] = 'quick_chip' if quickchip_payment?(payment)
|
115
116
|
commit(:post, 'charges', post, options)
|
116
117
|
end
|
117
118
|
end.responses.last
|
@@ -150,7 +151,7 @@ module ActiveMerchant #:nodoc:
|
|
150
151
|
|
151
152
|
return r unless options[:refund_fee_amount]
|
152
153
|
|
153
|
-
r.process {
|
154
|
+
r.process { fetch_application_fee(identification, options) }
|
154
155
|
r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r.responses.last), options) }
|
155
156
|
end
|
156
157
|
end
|
@@ -165,9 +166,7 @@ module ActiveMerchant #:nodoc:
|
|
165
166
|
|
166
167
|
def application_fee_from_response(response)
|
167
168
|
return unless response.success?
|
168
|
-
|
169
|
-
application_fees = response.params["data"].select { |fee| fee["object"] == "application_fee" }
|
170
|
-
application_fees.first["id"] unless application_fees.empty?
|
169
|
+
response.params["application_fee"] unless response.params["application_fee"].empty?
|
171
170
|
end
|
172
171
|
|
173
172
|
def refund_application_fee(money, identification, options = {})
|
@@ -175,9 +174,11 @@ module ActiveMerchant #:nodoc:
|
|
175
174
|
|
176
175
|
post = {}
|
177
176
|
add_amount(post, money, options)
|
178
|
-
options.merge!(:key => @fee_refund_api_key)
|
177
|
+
options.merge!(:key => @fee_refund_api_key) if @fee_refund_api_key
|
178
|
+
options.delete(:stripe_account)
|
179
179
|
|
180
|
-
commit(:post, "application_fees/#{CGI.escape(identification)}/
|
180
|
+
refund_fee = commit(:post, "application_fees/#{CGI.escape(identification)}/refunds", post, options)
|
181
|
+
application_fee_response!(refund_fee, "Application fee could not be refunded: #{refund_fee.message}")
|
181
182
|
end
|
182
183
|
|
183
184
|
# Note: creating a new credit card will not change the customer's existing default credit card (use :set_default => true)
|
@@ -305,6 +306,7 @@ module ActiveMerchant #:nodoc:
|
|
305
306
|
|
306
307
|
if emv_payment?(payment)
|
307
308
|
add_statement_address(post, options)
|
309
|
+
add_emv_metadata(post, payment)
|
308
310
|
else
|
309
311
|
add_amount(post, money, options, true)
|
310
312
|
add_customer_data(post, options)
|
@@ -369,7 +371,7 @@ module ActiveMerchant #:nodoc:
|
|
369
371
|
|
370
372
|
def add_statement_address(post, options)
|
371
373
|
return unless statement_address = options[:statement_address]
|
372
|
-
return unless [:address1, :city, :zip, :state].all? { |key| statement_address[key].present? }
|
374
|
+
return unless [:address1, :city, :zip, :state].all? { |key| statement_address[key].present? }
|
373
375
|
|
374
376
|
post[:statement_address] = {}
|
375
377
|
post[:statement_address][:line1] = statement_address[:address1]
|
@@ -383,8 +385,7 @@ module ActiveMerchant #:nodoc:
|
|
383
385
|
card = {}
|
384
386
|
if emv_payment?(creditcard)
|
385
387
|
add_emv_creditcard(post, creditcard.icc_data)
|
386
|
-
post[:card][:read_method] = "contactless" if creditcard.
|
387
|
-
post[:card][:read_method] = "contactless_magstripe_mode" if creditcard.contactless_magstripe
|
388
|
+
post[:card][:read_method] = "contactless" if creditcard.read_method == 'contactless'
|
388
389
|
if creditcard.encrypted_pin_cryptogram.present? && creditcard.encrypted_pin_ksn.present?
|
389
390
|
post[:card][:encrypted_pin] = creditcard.encrypted_pin_cryptogram
|
390
391
|
post[:card][:encrypted_pin_key_id] = creditcard.encrypted_pin_ksn
|
@@ -392,9 +393,11 @@ module ActiveMerchant #:nodoc:
|
|
392
393
|
elsif creditcard.respond_to?(:number)
|
393
394
|
if creditcard.respond_to?(:track_data) && creditcard.track_data.present?
|
394
395
|
card[:swipe_data] = creditcard.track_data
|
395
|
-
|
396
|
-
|
397
|
-
|
396
|
+
if creditcard.respond_to?(:read_method)
|
397
|
+
card[:fallback_reason] = 'no_chip' if creditcard.read_method == 'fallback_no_chip'
|
398
|
+
card[:fallback_reason] = 'chip_error' if creditcard.read_method == 'fallback_chip_error'
|
399
|
+
card[:read_method] = "contactless_magstripe_mode" if creditcard.read_method == 'contactless_magstripe'
|
400
|
+
end
|
398
401
|
else
|
399
402
|
card[:number] = creditcard.number
|
400
403
|
card[:exp_month] = creditcard.month
|
@@ -446,16 +449,27 @@ module ActiveMerchant #:nodoc:
|
|
446
449
|
end
|
447
450
|
|
448
451
|
def add_metadata(post, options = {})
|
449
|
-
post[:metadata]
|
452
|
+
post[:metadata] ||= {}
|
453
|
+
post[:metadata].merge!(options[:metadata]) if options[:metadata]
|
450
454
|
post[:metadata][:email] = options[:email] if options[:email]
|
451
455
|
post[:metadata][:order_id] = options[:order_id] if options[:order_id]
|
452
456
|
post.delete(:metadata) if post[:metadata].empty?
|
453
457
|
end
|
454
458
|
|
455
|
-
def
|
459
|
+
def add_emv_metadata(post, creditcard)
|
460
|
+
post[:metadata] ||= {}
|
461
|
+
post[:metadata][:card_read_method] = creditcard.read_method if creditcard.respond_to?(:read_method)
|
462
|
+
end
|
463
|
+
|
464
|
+
def fetch_application_fee(identification, options = {})
|
456
465
|
options.merge!(:key => @fee_refund_api_key)
|
457
466
|
|
458
|
-
commit(:get, "
|
467
|
+
fetch_charge = commit(:get, "charges/#{CGI.escape(identification)}", nil, options)
|
468
|
+
application_fee_response!(fetch_charge, "Application fee id could not be retrieved: #{fetch_charge.message}")
|
469
|
+
end
|
470
|
+
|
471
|
+
def application_fee_response!(response, message)
|
472
|
+
response.success? ? response : Response.new(false, message)
|
459
473
|
end
|
460
474
|
|
461
475
|
def parse(body)
|
@@ -586,6 +600,10 @@ module ActiveMerchant #:nodoc:
|
|
586
600
|
payment.respond_to?(:emv?) && payment.emv?
|
587
601
|
end
|
588
602
|
|
603
|
+
def quickchip_payment?(payment)
|
604
|
+
payment.respond_to?(:read_method) && payment.read_method == 'contact_quickchip'
|
605
|
+
end
|
606
|
+
|
589
607
|
def card_from_response(response)
|
590
608
|
response["card"] || response["active_card"] || response["source"] || {}
|
591
609
|
end
|
@@ -17,7 +17,7 @@ module ActiveMerchant #:nodoc:
|
|
17
17
|
attr_accessor :payment_cryptogram, :eci, :transaction_id
|
18
18
|
attr_writer :source
|
19
19
|
|
20
|
-
SOURCES =
|
20
|
+
SOURCES = %i(apple_pay android_pay google_pay)
|
21
21
|
|
22
22
|
def source
|
23
23
|
if defined?(@source) && SOURCES.include?(@source)
|
data/lib/certs/cacert.pem
CHANGED
@@ -501,6 +501,66 @@ W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
|
|
501
501
|
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
502
502
|
-----END CERTIFICATE-----
|
503
503
|
|
504
|
+
Entrust G2 Root Certificate Authority
|
505
|
+
=====================================
|
506
|
+
-----BEGIN CERTIFICATE-----
|
507
|
+
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
|
508
|
+
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
|
509
|
+
cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
|
510
|
+
IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
|
511
|
+
dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
|
512
|
+
NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
|
513
|
+
dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
|
514
|
+
dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
|
515
|
+
aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
|
516
|
+
YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
517
|
+
AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
|
518
|
+
RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
|
519
|
+
cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
|
520
|
+
wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
|
521
|
+
U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
|
522
|
+
jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
|
523
|
+
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
|
524
|
+
BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
|
525
|
+
jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
|
526
|
+
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
|
527
|
+
1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
|
528
|
+
nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
|
529
|
+
VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
|
530
|
+
-----END CERTIFICATE-----
|
531
|
+
|
532
|
+
Entrust L1M Chain Root Certificate
|
533
|
+
==================================
|
534
|
+
-----BEGIN CERTIFICATE-----
|
535
|
+
MIIE/zCCA+egAwIBAgIEUdNARDANBgkqhkiG9w0BAQsFADCBsDELMAkGA1UEBhMC
|
536
|
+
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
537
|
+
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
538
|
+
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
539
|
+
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE0MDkyMjE3MTQ1N1oXDTI0MDkyMzAx
|
540
|
+
MzE1M1owgb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgw
|
541
|
+
JgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQL
|
542
|
+
EzAoYykgMjAwOSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9u
|
543
|
+
bHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
544
|
+
eSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuoS2ctueDGvi
|
545
|
+
mekwAad26jK4lUEaydphTlhyz/72gnm/c2EGCqUn2LNf00VOHHLWTjLycooP94MZ
|
546
|
+
0GqAgABFHrDH55q/ElcnHKNoLwqHvWprDl5l8xx31dSFjXAhtLMy54ui1YY5ArG4
|
547
|
+
0kfO5MlJxDun3vtUfVe+8OhuwnmyOgtV4lCYFjITXC94VsHClLPyWuQnmp8k18bs
|
548
|
+
0JslguPMwsRFxYyXegZrKhGfqQpuSDtv29QRGUL3jwe/9VNfnD70FyzmaaxOMkxi
|
549
|
+
d+q36OW7NLwZi66cUee3frVTsTMi5W3PcDwa+uKbZ7aD9I2lr2JMTeBYrGQ0EgP4
|
550
|
+
to2UYySkcQIDAQABo4IBDzCCAQswDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQI
|
551
|
+
MAYBAf8CAQEwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz
|
552
|
+
cC5lbnRydXN0Lm5ldDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLmVudHJ1
|
553
|
+
c3QubmV0L3Jvb3RjYTEuY3JsMDsGA1UdIAQ0MDIwMAYEVR0gADAoMCYGCCsGAQUF
|
554
|
+
BwIBFhpodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NQUzAdBgNVHQ4EFgQUanImetAe
|
555
|
+
733nO2lR1GyNn5ASZqswHwYDVR0jBBgwFoAUaJDkZ6SmU4DHhmak8fdLQ/uEvW0w
|
556
|
+
DQYJKoZIhvcNAQELBQADggEBAGkzg/woem99751V68U+ep11s8zDODbZNKIoaBjq
|
557
|
+
HmnTvefQd9q4AINOSs9v0fHBIj905PeYSZ6btp7h25h3LVY0sag82f3Azce/BQPU
|
558
|
+
AsXx5cbaCKUTx2IjEdFhMB1ghEXveajGJpOkt800uGnFE/aRs8lFc3a2kvZ2Clvh
|
559
|
+
A0e36SlMkTIjN0qcNdh4/R0f5IOJJICtt/nP5F2l1HHEhVtwH9s/HAHrGkUmMRTM
|
560
|
+
Zb9n3srMM2XlQZHXN75BGpad5oqXnafOrE6aPb0BoGrZTyIAi0TVaWJ7LuvMuueS
|
561
|
+
fWlnPfy4fN5Bh9Bp6roKGHoalUOzeXEodm2h+1dK7E3IDhA=
|
562
|
+
-----END CERTIFICATE-----
|
563
|
+
|
504
564
|
RSA Security 2048 v3
|
505
565
|
====================
|
506
566
|
-----BEGIN CERTIFICATE-----
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activemerchant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.77.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -187,6 +187,7 @@ files:
|
|
187
187
|
- lib/active_merchant/billing/gateways/braintree_orange.rb
|
188
188
|
- lib/active_merchant/billing/gateways/bridge_pay.rb
|
189
189
|
- lib/active_merchant/billing/gateways/cams.rb
|
190
|
+
- lib/active_merchant/billing/gateways/card_connect.rb
|
190
191
|
- lib/active_merchant/billing/gateways/card_save.rb
|
191
192
|
- lib/active_merchant/billing/gateways/card_stream.rb
|
192
193
|
- lib/active_merchant/billing/gateways/cardknox.rb
|
@@ -415,7 +416,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
415
416
|
version: '0'
|
416
417
|
requirements: []
|
417
418
|
rubyforge_project: activemerchant
|
418
|
-
rubygems_version: 2.
|
419
|
+
rubygems_version: 2.6.14
|
419
420
|
signing_key:
|
420
421
|
specification_version: 4
|
421
422
|
summary: Framework and tools for dealing with credit card transactions.
|