activemerchant 1.92.0 → 1.94.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 +23 -2
- data/lib/active_merchant/billing/credit_card_methods.rb +2 -2
- data/lib/active_merchant/billing/gateways/adyen.rb +41 -13
- data/lib/active_merchant/billing/gateways/card_connect.rb +1 -0
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +71 -44
- data/lib/active_merchant/billing/gateways/cyber_source.rb +9 -8
- data/lib/active_merchant/billing/gateways/elavon.rb +9 -0
- data/lib/active_merchant/billing/gateways/mundipagg.rb +2 -1
- data/lib/active_merchant/billing/gateways/stripe.rb +31 -28
- data/lib/active_merchant/billing/gateways/worldpay.rb +7 -2
- data/lib/active_merchant/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a2728fa6c7116ab636feb7ba715c2e4d5305fb54898d1687d633cbfb2a4795f
|
|
4
|
+
data.tar.gz: d63425c0a65919bc4a2a007d41b145a355a341667be616ae8fc0337ce2d8d145
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f577b5623169e0e7a1a12f4f2fa212517fba33a5ec40fb61a8e14c9df629939a4e31ed6a24ed9fabe783404553ff98ff8bdb5f0fabdc3c9da8fe8bc31c8ad97f
|
|
7
|
+
data.tar.gz: 2d37c0742319a5533236acaeb9e885692b8610208d540adda49dc21147584a3dbc50ba28632d014fb7d280d4ff9202032e5fe05dde1b1741eabf4889e9a08a42
|
data/CHANGELOG
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
|
2
2
|
|
|
3
3
|
== HEAD
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
== Version 1.94.0 (May 21, 2019)
|
|
5
|
+
* Mundipagg: Fix number lengths for both VR and Sodexo [dtykocki] #3195
|
|
6
|
+
* Stripe: Support show and list webhook endpoints [jknipp] #3196
|
|
7
|
+
* CardConnect: Add frontendid parameter to requests [gcatlin] #3198
|
|
8
|
+
* Adyen: Correct formatting of Billing Address [nfarve] #3200
|
|
9
|
+
* Stripe: Stripe: Show payment source [jknipp] #3202
|
|
10
|
+
* Checkout V2: Checkout V2: Correct success criteria [curiousepic] #3205
|
|
11
|
+
* Adyen: Add normalized hash of 3DS 2.0 data fields from web browsers [davidsantoso] #3207
|
|
12
|
+
* Stripe: Do not attempt application fee refund if refund was not successful [jasonwebster] #3206
|
|
13
|
+
* Elavon: Send transaction_currency if currency is provided [gcatlin] #3201
|
|
14
|
+
* Elavon: Multi-currency support [jknipp] #3210
|
|
15
|
+
* Adyen: Support preAuths and Synchronous Adjusts [curiousepic] #3212
|
|
16
|
+
* WorldPay: Support Unknown Card Type [tanyajajodia] #3213
|
|
17
|
+
* Mundipagg: Make gateway_affiliation_id an option [curiousepic] #3219
|
|
18
|
+
* CyberSource: Adds Elo Card Type [tanyajajodia] #3220
|
|
19
|
+
* CyberSource: Support standalone credit for cards [curiousepic] 3225
|
|
20
|
+
|
|
21
|
+
== Version 1.93.0 (April 18, 2019)
|
|
22
|
+
* Stripe: Do not consider a refund unsuccessful if only refunding the fee failed [jasonwebster] #3188
|
|
23
|
+
* Stripe: Fix webhook creation for connected account [jknipp] #3193
|
|
24
|
+
* Adyen: Upgrade to v40 API version [davidsantoso] #3192
|
|
25
|
+
|
|
26
|
+
== Version 1.92.0 (April 8, 2019)
|
|
6
27
|
* BluePay: Send customer IP address when provided [jknipp] #3149
|
|
7
28
|
* PaymentExpress: Use ip field for client_info field [jknipp] #3150
|
|
8
29
|
* Bambora Asia-Pacific: Adds Store [molbrown] #3147
|
|
@@ -13,8 +13,8 @@ module ActiveMerchant #:nodoc:
|
|
|
13
13
|
'dankort' => ->(num) { num =~ /^5019\d{12}$/ },
|
|
14
14
|
'maestro' => ->(num) { (12..19).cover?(num&.size) && in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) },
|
|
15
15
|
'forbrugsforeningen' => ->(num) { num =~ /^600722\d{10}$/ },
|
|
16
|
-
'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818)\d{
|
|
17
|
-
'vr' => ->(num) { num =~ /^(627416|637036)\d{
|
|
16
|
+
'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818)\d{10}$/ },
|
|
17
|
+
'vr' => ->(num) { num =~ /^(627416|637036)\d{10}$/ },
|
|
18
18
|
'carnet' => lambda { |num|
|
|
19
19
|
num&.size == 16 && (
|
|
20
20
|
in_bin_range?(num.slice(0, 6), CARNET_RANGES) ||
|
|
@@ -4,8 +4,8 @@ module ActiveMerchant #:nodoc:
|
|
|
4
4
|
|
|
5
5
|
# we recommend setting up merchant-specific endpoints.
|
|
6
6
|
# https://docs.adyen.com/developers/api-manual#apiendpoints
|
|
7
|
-
self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/
|
|
8
|
-
self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/
|
|
7
|
+
self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/v40'
|
|
8
|
+
self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/v40'
|
|
9
9
|
|
|
10
10
|
self.supported_countries = ['AT', 'AU', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GI', 'GR', 'HK', 'HU', 'IE', 'IS', 'IT', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SG', 'SK', 'SI', 'US']
|
|
11
11
|
self.default_currency = 'USD'
|
|
@@ -80,6 +80,7 @@ module ActiveMerchant #:nodoc:
|
|
|
80
80
|
post = init_post(options)
|
|
81
81
|
add_invoice_for_modification(post, money, options)
|
|
82
82
|
add_reference(post, authorization, options)
|
|
83
|
+
add_extra_data(post, nil, options)
|
|
83
84
|
commit('adjustAuthorisation', post, options)
|
|
84
85
|
end
|
|
85
86
|
|
|
@@ -174,6 +175,9 @@ module ActiveMerchant #:nodoc:
|
|
|
174
175
|
post[:additionalData][:overwriteBrand] = normalize(options[:overwrite_brand]) if options[:overwrite_brand]
|
|
175
176
|
post[:additionalData][:customRoutingFlag] = options[:custom_routing_flag] if options[:custom_routing_flag]
|
|
176
177
|
post[:additionalData]['paymentdatasource.type'] = NETWORK_TOKENIZATION_CARD_SOURCE[payment.source.to_s] if payment.is_a?(NetworkTokenizationCreditCard)
|
|
178
|
+
post[:additionalData][:authorisationType] = options[:authorisation_type] if options[:authorisation_type]
|
|
179
|
+
post[:additionalData][:adjustAuthorisationData] = options[:adjust_authorisation_data] if options[:adjust_authorisation_data]
|
|
180
|
+
post[:additionalData][:RequestedTestAcquirerResponseCode] = options[:requested_test_acquirer_response_code] if options[:requested_test_acquirer_response_code] && test?
|
|
177
181
|
post[:deviceFingerprint] = options[:device_fingerprint] if options[:device_fingerprint]
|
|
178
182
|
add_risk_data(post, options)
|
|
179
183
|
end
|
|
@@ -214,13 +218,13 @@ module ActiveMerchant #:nodoc:
|
|
|
214
218
|
def add_address(post, options)
|
|
215
219
|
return unless post[:card]&.kind_of?(Hash)
|
|
216
220
|
if (address = options[:billing_address] || options[:address]) && address[:country]
|
|
217
|
-
post[:
|
|
218
|
-
post[:
|
|
219
|
-
post[:
|
|
220
|
-
post[:
|
|
221
|
-
post[:
|
|
222
|
-
post[:
|
|
223
|
-
post[:
|
|
221
|
+
post[:billingAddress] = {}
|
|
222
|
+
post[:billingAddress][:street] = address[:address1] || 'N/A'
|
|
223
|
+
post[:billingAddress][:houseNumberOrName] = address[:address2] || 'N/A'
|
|
224
|
+
post[:billingAddress][:postalCode] = address[:zip] if address[:zip]
|
|
225
|
+
post[:billingAddress][:city] = address[:city] || 'N/A'
|
|
226
|
+
post[:billingAddress][:stateOrProvince] = address[:state] || 'N/A'
|
|
227
|
+
post[:billingAddress][:country] = address[:country] if address[:country]
|
|
224
228
|
end
|
|
225
229
|
end
|
|
226
230
|
|
|
@@ -308,9 +312,31 @@ module ActiveMerchant #:nodoc:
|
|
|
308
312
|
end
|
|
309
313
|
|
|
310
314
|
def add_3ds(post, options)
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
315
|
+
if three_ds_2_options = options[:three_ds_2]
|
|
316
|
+
if browser_info = three_ds_2_options[:browser_info]
|
|
317
|
+
post[:browserInfo] = {
|
|
318
|
+
acceptHeader: browser_info[:accept_header],
|
|
319
|
+
colorDepth: browser_info[:depth],
|
|
320
|
+
javaEnabled: browser_info[:java],
|
|
321
|
+
language: browser_info[:language],
|
|
322
|
+
screenHeight: browser_info[:height],
|
|
323
|
+
screenWidth: browser_info[:width],
|
|
324
|
+
timeZoneOffset: browser_info[:timezone],
|
|
325
|
+
userAgent: browser_info[:user_agent]
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if device_channel = three_ds_2_options[:channel]
|
|
329
|
+
post[:threeDS2RequestData] = {
|
|
330
|
+
deviceChannel: device_channel,
|
|
331
|
+
notificationURL: three_ds_2_options[:notification_url] || 'https://example.com/notification'
|
|
332
|
+
}
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
else
|
|
336
|
+
return unless options[:execute_threed] || options[:threed_dynamic]
|
|
337
|
+
post[:browserInfo] = { userAgent: options[:user_agent], acceptHeader: options[:accept_header] }
|
|
338
|
+
post[:additionalData] = { executeThreeD: 'true' } if options[:execute_threed]
|
|
339
|
+
end
|
|
314
340
|
end
|
|
315
341
|
|
|
316
342
|
def parse(body)
|
|
@@ -374,8 +400,10 @@ module ActiveMerchant #:nodoc:
|
|
|
374
400
|
case action.to_s
|
|
375
401
|
when 'authorise', 'authorise3d'
|
|
376
402
|
['Authorised', 'Received', 'RedirectShopper'].include?(response['resultCode'])
|
|
377
|
-
when 'capture', 'refund', 'cancel'
|
|
403
|
+
when 'capture', 'refund', 'cancel'
|
|
378
404
|
response['response'] == "[#{action}-received]"
|
|
405
|
+
when 'adjustAuthorisation'
|
|
406
|
+
response['response'] == 'Authorised' || response['response'] == '[adjustAuthorisation-received]'
|
|
379
407
|
else
|
|
380
408
|
false
|
|
381
409
|
end
|
|
@@ -267,6 +267,7 @@ module ActiveMerchant #:nodoc:
|
|
|
267
267
|
end
|
|
268
268
|
|
|
269
269
|
def commit(action, parameters, verb: :put, path: '')
|
|
270
|
+
parameters[:frontendid] = application_id
|
|
270
271
|
parameters[:merchid] = @options[:merchant_id]
|
|
271
272
|
url = url(action, path)
|
|
272
273
|
response = parse(ssl_request(verb, url, post_data(parameters), headers))
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
module ActiveMerchant #:nodoc:
|
|
2
2
|
module Billing #:nodoc:
|
|
3
3
|
class CheckoutV2Gateway < Gateway
|
|
4
|
-
self.display_name = 'Checkout.com
|
|
4
|
+
self.display_name = 'Checkout.com Unified Payments'
|
|
5
5
|
self.homepage_url = 'https://www.checkout.com/'
|
|
6
|
-
self.live_url = 'https://
|
|
7
|
-
self.test_url = 'https://sandbox.checkout.com
|
|
6
|
+
self.live_url = 'https://api.checkout.com'
|
|
7
|
+
self.test_url = 'https://api.sandbox.checkout.com'
|
|
8
8
|
|
|
9
9
|
self.supported_countries = ['AD', 'AE', 'AT', 'BE', 'BG', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FO', 'FI', 'FR', 'GB', 'GI', 'GL', 'GR', 'HR', 'HU', 'IE', 'IS', 'IL', 'IT', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SI', 'SM', 'SK', 'SJ', 'TR', 'VA']
|
|
10
10
|
self.default_currency = 'USD'
|
|
11
11
|
self.money_format = :cents
|
|
12
|
-
self.supported_cardtypes = [:visa, :master, :american_express, :diners_club]
|
|
12
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :maestro, :discover]
|
|
13
13
|
|
|
14
14
|
def initialize(options={})
|
|
15
15
|
requires!(options, :secret_key)
|
|
@@ -30,11 +30,12 @@ module ActiveMerchant #:nodoc:
|
|
|
30
30
|
|
|
31
31
|
def authorize(amount, payment_method, options={})
|
|
32
32
|
post = {}
|
|
33
|
-
post[:
|
|
33
|
+
post[:capture] = false
|
|
34
34
|
add_invoice(post, amount, options)
|
|
35
35
|
add_payment_method(post, payment_method)
|
|
36
36
|
add_customer_data(post, options)
|
|
37
37
|
add_transaction_data(post, options)
|
|
38
|
+
add_3ds(post, options)
|
|
38
39
|
|
|
39
40
|
commit(:authorize, post)
|
|
40
41
|
end
|
|
@@ -81,49 +82,69 @@ module ActiveMerchant #:nodoc:
|
|
|
81
82
|
private
|
|
82
83
|
|
|
83
84
|
def add_invoice(post, money, options)
|
|
84
|
-
post[:
|
|
85
|
-
post[:
|
|
85
|
+
post[:amount] = localized_amount(money, options[:currency])
|
|
86
|
+
post[:reference] = options[:order_id]
|
|
86
87
|
post[:currency] = options[:currency] || currency(money)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
if options[:descriptor_name] || options[:descriptor_city]
|
|
89
|
+
post[:billing_descriptor] = {}
|
|
90
|
+
post[:billing_descriptor][:name] = options[:descriptor_name] if options[:descriptor_name]
|
|
91
|
+
post[:billing_descriptor][:city] = options[:descriptor_city] if options[:descriptor_city]
|
|
92
|
+
end
|
|
93
|
+
post[:metadata] = {}
|
|
94
|
+
post[:metadata][:udf5] = application_id || 'ActiveMerchant'
|
|
90
95
|
end
|
|
91
96
|
|
|
92
97
|
def add_payment_method(post, payment_method)
|
|
93
|
-
post[:
|
|
94
|
-
post[:
|
|
95
|
-
post[:
|
|
96
|
-
post[:
|
|
97
|
-
post[:
|
|
98
|
-
post[:
|
|
98
|
+
post[:source] = {}
|
|
99
|
+
post[:source][:type] = 'card'
|
|
100
|
+
post[:source][:name] = payment_method.name
|
|
101
|
+
post[:source][:number] = payment_method.number
|
|
102
|
+
post[:source][:cvv] = payment_method.verification_value
|
|
103
|
+
post[:source][:expiry_year] = format(payment_method.year, :four_digits)
|
|
104
|
+
post[:source][:expiry_month] = format(payment_method.month, :two_digits)
|
|
99
105
|
end
|
|
100
106
|
|
|
101
107
|
def add_customer_data(post, options)
|
|
102
|
-
post[:
|
|
103
|
-
post[:
|
|
108
|
+
post[:customer] = {}
|
|
109
|
+
post[:customer][:email] = options[:email] || nil
|
|
110
|
+
post[:payment_ip] = options[:ip] if options[:ip]
|
|
104
111
|
address = options[:billing_address]
|
|
105
|
-
if(address && post[:
|
|
106
|
-
post[:
|
|
107
|
-
post[:
|
|
108
|
-
post[:
|
|
109
|
-
post[:
|
|
110
|
-
post[:
|
|
111
|
-
post[:
|
|
112
|
-
post[:
|
|
113
|
-
post[:
|
|
112
|
+
if(address && post[:source])
|
|
113
|
+
post[:source][:billing_address] = {}
|
|
114
|
+
post[:source][:billing_address][:address_line1] = address[:address1] unless address[:address1].blank?
|
|
115
|
+
post[:source][:billing_address][:address_line2] = address[:address2] unless address[:address2].blank?
|
|
116
|
+
post[:source][:billing_address][:city] = address[:city] unless address[:city].blank?
|
|
117
|
+
post[:source][:billing_address][:state] = address[:state] unless address[:state].blank?
|
|
118
|
+
post[:source][:billing_address][:country] = address[:country] unless address[:country].blank?
|
|
119
|
+
post[:source][:billing_address][:zip] = address[:zip] unless address[:zip].blank?
|
|
120
|
+
post[:source][:phone] = { number: address[:phone] } unless address[:phone].blank?
|
|
114
121
|
end
|
|
115
122
|
end
|
|
116
123
|
|
|
117
124
|
def add_transaction_data(post, options={})
|
|
118
|
-
post[:
|
|
119
|
-
post[:
|
|
120
|
-
post[:
|
|
125
|
+
post[:card_on_file] = true if options[:card_on_file] == true
|
|
126
|
+
post[:payment_type] = 'Regular' if options[:transaction_indicator] == 1
|
|
127
|
+
post[:payment_type] = 'Recurring' if options[:transaction_indicator] == 2
|
|
128
|
+
post[:previous_payment_id] = options[:previous_charge_id] if options[:previous_charge_id]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def add_3ds(post, options)
|
|
132
|
+
if options[:three_d_secure]
|
|
133
|
+
post[:'3ds'] = {}
|
|
134
|
+
post[:'3ds'][:enabled] = true
|
|
135
|
+
post[:'3ds'][:eci] = options[:eci] if options[:eci]
|
|
136
|
+
post[:'3ds'][:cryptogram] = options[:cavv] if options[:cavv]
|
|
137
|
+
post[:'3ds'][:xid] = options[:xid] if options[:xid]
|
|
138
|
+
end
|
|
121
139
|
end
|
|
122
140
|
|
|
123
141
|
def commit(action, post, authorization = nil)
|
|
124
142
|
begin
|
|
125
143
|
raw_response = ssl_post(url(post, action, authorization), post.to_json, headers)
|
|
126
144
|
response = parse(raw_response)
|
|
145
|
+
if action == :capture && response.key?('_links')
|
|
146
|
+
response['id'] = response['_links']['payment']['href'].split('/')[-1]
|
|
147
|
+
end
|
|
127
148
|
rescue ResponseError => e
|
|
128
149
|
raise unless(e.response.code.to_s =~ /4\d\d/)
|
|
129
150
|
response = parse(e.response.body)
|
|
@@ -160,9 +181,15 @@ module ActiveMerchant #:nodoc:
|
|
|
160
181
|
|
|
161
182
|
def url(post, action, authorization)
|
|
162
183
|
if action == :authorize
|
|
163
|
-
"#{base_url}/
|
|
184
|
+
"#{base_url}/payments"
|
|
185
|
+
elsif action == :capture
|
|
186
|
+
"#{base_url}/payments/#{authorization}/captures"
|
|
187
|
+
elsif action == :refund
|
|
188
|
+
"#{base_url}/payments/#{authorization}/refunds"
|
|
189
|
+
elsif action == :void
|
|
190
|
+
"#{base_url}/payments/#{authorization}/voids"
|
|
164
191
|
else
|
|
165
|
-
"#{base_url}/
|
|
192
|
+
"#{base_url}/payments/#{authorization}/#{action}"
|
|
166
193
|
end
|
|
167
194
|
end
|
|
168
195
|
|
|
@@ -171,33 +198,33 @@ module ActiveMerchant #:nodoc:
|
|
|
171
198
|
end
|
|
172
199
|
|
|
173
200
|
def avs_result(response)
|
|
174
|
-
response['
|
|
201
|
+
response['source'] && response['source']['avs_check'] ? AVSResult.new(code: response['source']['avs_check']) : nil
|
|
175
202
|
end
|
|
176
203
|
|
|
177
204
|
def cvv_result(response)
|
|
178
|
-
response['
|
|
205
|
+
response['source'] && response['source']['cvv_check'] ? CVVResult.new(response['source']['cvv_check']) : nil
|
|
179
206
|
end
|
|
180
207
|
|
|
181
208
|
def parse(body)
|
|
182
209
|
JSON.parse(body)
|
|
183
210
|
rescue JSON::ParserError
|
|
184
211
|
{
|
|
185
|
-
'message' => 'Invalid JSON response received from
|
|
212
|
+
'message' => 'Invalid JSON response received from Checkout.com Unified Payments Gateway. Please contact Checkout.com if you continue to receive this message.',
|
|
186
213
|
'raw_response' => scrub(body)
|
|
187
214
|
}
|
|
188
215
|
end
|
|
189
216
|
|
|
190
217
|
def success_from(response)
|
|
191
|
-
|
|
218
|
+
response['response_summary'] == 'Approved' || !response.key?('response_summary') && response.key?('action_id')
|
|
192
219
|
end
|
|
193
220
|
|
|
194
221
|
def message_from(succeeded, response)
|
|
195
222
|
if succeeded
|
|
196
223
|
'Succeeded'
|
|
197
|
-
elsif response['
|
|
198
|
-
response['
|
|
224
|
+
elsif response['error_type']
|
|
225
|
+
response['error_type'] + ': ' + response['error_codes'].first
|
|
199
226
|
else
|
|
200
|
-
response['
|
|
227
|
+
response['response_summary'] || response['response_code'] || 'Unable to read error message'
|
|
201
228
|
end
|
|
202
229
|
end
|
|
203
230
|
|
|
@@ -220,12 +247,12 @@ module ActiveMerchant #:nodoc:
|
|
|
220
247
|
|
|
221
248
|
def error_code_from(succeeded, response)
|
|
222
249
|
return if succeeded
|
|
223
|
-
if response['
|
|
224
|
-
"#{response["
|
|
225
|
-
elsif response['
|
|
226
|
-
response['
|
|
250
|
+
if response['error_type'] && response['error_codes']
|
|
251
|
+
"#{response["error_type"]}: #{response["error_codes"].join(", ")}"
|
|
252
|
+
elsif response['error_type']
|
|
253
|
+
response['error_type']
|
|
227
254
|
else
|
|
228
|
-
STANDARD_ERROR_CODE_MAPPING[response['
|
|
255
|
+
STANDARD_ERROR_CODE_MAPPING[response['response_code']]
|
|
229
256
|
end
|
|
230
257
|
end
|
|
231
258
|
end
|
|
@@ -26,7 +26,7 @@ module ActiveMerchant #:nodoc:
|
|
|
26
26
|
|
|
27
27
|
XSD_VERSION = '1.153'
|
|
28
28
|
|
|
29
|
-
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb, :dankort, :maestro]
|
|
29
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb, :dankort, :maestro, :elo]
|
|
30
30
|
self.supported_countries = %w(US BR CA CN DK FI FR DE IN JP MX NO SE GB SG LB)
|
|
31
31
|
|
|
32
32
|
self.default_currency = 'USD'
|
|
@@ -43,7 +43,8 @@ module ActiveMerchant #:nodoc:
|
|
|
43
43
|
:diners_club => '005',
|
|
44
44
|
:jcb => '007',
|
|
45
45
|
:dankort => '034',
|
|
46
|
-
:maestro => '042'
|
|
46
|
+
:maestro => '042',
|
|
47
|
+
:elo => '054'
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
@@response_codes = {
|
|
@@ -142,9 +143,10 @@ module ActiveMerchant #:nodoc:
|
|
|
142
143
|
end
|
|
143
144
|
end
|
|
144
145
|
|
|
145
|
-
# Adds credit to a subscription (stand alone credit).
|
|
146
|
-
def credit(money,
|
|
147
|
-
|
|
146
|
+
# Adds credit to a card or subscription (stand alone credit).
|
|
147
|
+
def credit(money, creditcard_or_reference, options = {})
|
|
148
|
+
setup_address_hash(options)
|
|
149
|
+
commit(build_credit_request(money, creditcard_or_reference, options), :credit, money, options)
|
|
148
150
|
end
|
|
149
151
|
|
|
150
152
|
# Stores a customer subscription/profile with type "on-demand".
|
|
@@ -327,11 +329,10 @@ module ActiveMerchant #:nodoc:
|
|
|
327
329
|
xml.target!
|
|
328
330
|
end
|
|
329
331
|
|
|
330
|
-
def build_credit_request(money,
|
|
332
|
+
def build_credit_request(money, creditcard_or_reference, options)
|
|
331
333
|
xml = Builder::XmlMarkup.new :indent => 2
|
|
332
334
|
|
|
333
|
-
|
|
334
|
-
add_subscription(xml, options, reference)
|
|
335
|
+
add_payment_method_or_subscription(xml, money, creditcard_or_reference, options)
|
|
335
336
|
add_credit_service(xml)
|
|
336
337
|
|
|
337
338
|
xml.target!
|
|
@@ -42,6 +42,7 @@ module ActiveMerchant #:nodoc:
|
|
|
42
42
|
else
|
|
43
43
|
add_creditcard(form, payment_method)
|
|
44
44
|
end
|
|
45
|
+
add_currency(form, money, options)
|
|
45
46
|
add_address(form, options)
|
|
46
47
|
add_customer_data(form, options)
|
|
47
48
|
add_test_mode(form, options)
|
|
@@ -54,6 +55,7 @@ module ActiveMerchant #:nodoc:
|
|
|
54
55
|
add_salestax(form, options)
|
|
55
56
|
add_invoice(form, options)
|
|
56
57
|
add_creditcard(form, creditcard)
|
|
58
|
+
add_currency(form, money, options)
|
|
57
59
|
add_address(form, options)
|
|
58
60
|
add_customer_data(form, options)
|
|
59
61
|
add_test_mode(form, options)
|
|
@@ -69,6 +71,7 @@ module ActiveMerchant #:nodoc:
|
|
|
69
71
|
add_approval_code(form, authorization)
|
|
70
72
|
add_invoice(form, options)
|
|
71
73
|
add_creditcard(form, options[:credit_card])
|
|
74
|
+
add_currency(form, money, options)
|
|
72
75
|
add_customer_data(form, options)
|
|
73
76
|
add_test_mode(form, options)
|
|
74
77
|
else
|
|
@@ -102,6 +105,7 @@ module ActiveMerchant #:nodoc:
|
|
|
102
105
|
form = {}
|
|
103
106
|
add_invoice(form, options)
|
|
104
107
|
add_creditcard(form, creditcard)
|
|
108
|
+
add_currency(form, money, options)
|
|
105
109
|
add_address(form, options)
|
|
106
110
|
add_customer_data(form, options)
|
|
107
111
|
add_test_mode(form, options)
|
|
@@ -178,6 +182,11 @@ module ActiveMerchant #:nodoc:
|
|
|
178
182
|
form[:last_name] = truncate(creditcard.last_name, 30)
|
|
179
183
|
end
|
|
180
184
|
|
|
185
|
+
def add_currency(form, money, options)
|
|
186
|
+
currency = options[:currency] || currency(money)
|
|
187
|
+
form[:transaction_currency] = currency if currency && (@options[:multi_currency] || options[:multi_currency])
|
|
188
|
+
end
|
|
189
|
+
|
|
181
190
|
def add_token(form, token)
|
|
182
191
|
form[:token] = token
|
|
183
192
|
end
|
|
@@ -155,7 +155,8 @@ module ActiveMerchant #:nodoc:
|
|
|
155
155
|
post[:customer][:name] = payment.name if post[:customer]
|
|
156
156
|
post[:customer_id] = parse_auth(payment)[0] if payment.is_a?(String)
|
|
157
157
|
post[:payment] = {}
|
|
158
|
-
|
|
158
|
+
affiliation = options[:gateway_affiliation_id] || @options[:gateway_id]
|
|
159
|
+
post[:payment][:gateway_affiliation_id] = affiliation if affiliation
|
|
159
160
|
post[:payment][:metadata] = { mundipagg_payment_method_code: '1' } if test?
|
|
160
161
|
if voucher?(payment)
|
|
161
162
|
add_voucher(post, payment, options)
|
|
@@ -150,14 +150,21 @@ module ActiveMerchant #:nodoc:
|
|
|
150
150
|
post[:reason] = options[:reason] if options[:reason]
|
|
151
151
|
post[:expand] = [:charge]
|
|
152
152
|
|
|
153
|
-
|
|
154
|
-
r.process { commit(:post, "charges/#{CGI.escape(identification)}/refunds", post, options) }
|
|
153
|
+
response = commit(:post, "charges/#{CGI.escape(identification)}/refunds", post, options)
|
|
155
154
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
155
|
+
if response.success? && options[:refund_fee_amount] && options[:refund_fee_amount].to_s != '0'
|
|
156
|
+
charge = api_request(:get, "charges/#{CGI.escape(identification)}", nil, options)
|
|
157
|
+
|
|
158
|
+
if application_fee = charge['application_fee']
|
|
159
|
+
fee_refund_options = {
|
|
160
|
+
currency: options[:currency], # currency isn't used by Stripe here, but we need it for #add_amount
|
|
161
|
+
key: @fee_refund_api_key
|
|
162
|
+
}
|
|
163
|
+
refund_application_fee(options[:refund_fee_amount].to_i, application_fee, fee_refund_options)
|
|
159
164
|
end
|
|
160
165
|
end
|
|
166
|
+
|
|
167
|
+
response
|
|
161
168
|
end
|
|
162
169
|
|
|
163
170
|
def verify(payment, options = {})
|
|
@@ -168,21 +175,10 @@ module ActiveMerchant #:nodoc:
|
|
|
168
175
|
end
|
|
169
176
|
end
|
|
170
177
|
|
|
171
|
-
def application_fee_from_response(response)
|
|
172
|
-
return unless response.success?
|
|
173
|
-
response.params['application_fee'] unless response.params['application_fee'].empty?
|
|
174
|
-
end
|
|
175
|
-
|
|
176
178
|
def refund_application_fee(money, identification, options = {})
|
|
177
|
-
return Response.new(false, 'Application fee id could not be found') unless identification
|
|
178
|
-
|
|
179
179
|
post = {}
|
|
180
180
|
add_amount(post, money, options)
|
|
181
|
-
|
|
182
|
-
options.delete(:stripe_account)
|
|
183
|
-
|
|
184
|
-
refund_fee = commit(:post, "application_fees/#{CGI.escape(identification)}/refunds", post, options)
|
|
185
|
-
application_fee_response!(refund_fee, "Application fee could not be refunded: #{refund_fee.message}")
|
|
181
|
+
commit(:post, "application_fees/#{CGI.escape(identification)}/refunds", post, options)
|
|
186
182
|
end
|
|
187
183
|
|
|
188
184
|
# Note: creating a new credit card will not change the customer's existing default credit card (use :set_default => true)
|
|
@@ -313,10 +309,16 @@ module ActiveMerchant #:nodoc:
|
|
|
313
309
|
commit(:post, 'sources', post, options)
|
|
314
310
|
end
|
|
315
311
|
|
|
312
|
+
def show_source(source_id, options)
|
|
313
|
+
commit(:get, "sources/#{source_id}", nil, options)
|
|
314
|
+
end
|
|
315
|
+
|
|
316
316
|
def create_webhook_endpoint(options, events)
|
|
317
317
|
post = {}
|
|
318
318
|
post[:url] = options[:callback_url]
|
|
319
319
|
post[:enabled_events] = events
|
|
320
|
+
post[:connect] = true if options[:stripe_account]
|
|
321
|
+
options.delete(:stripe_account)
|
|
320
322
|
commit(:post, 'webhook_endpoints', post, options)
|
|
321
323
|
end
|
|
322
324
|
|
|
@@ -324,6 +326,18 @@ module ActiveMerchant #:nodoc:
|
|
|
324
326
|
commit(:delete, "webhook_endpoints/#{options[:webhook_id]}", {}, options)
|
|
325
327
|
end
|
|
326
328
|
|
|
329
|
+
def show_webhook_endpoint(options)
|
|
330
|
+
options.delete(:stripe_account)
|
|
331
|
+
commit(:get, "webhook_endpoints/#{options[:webhook_id]}", nil, options)
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def list_webhook_endpoints(options)
|
|
335
|
+
params = {}
|
|
336
|
+
params[:limit] = options[:limit] if options[:limit]
|
|
337
|
+
options.delete(:stripe_account)
|
|
338
|
+
commit(:get, "webhook_endpoints?#{post_data(params)}", nil, options)
|
|
339
|
+
end
|
|
340
|
+
|
|
327
341
|
def create_post_for_auth_or_purchase(money, payment, options)
|
|
328
342
|
post = {}
|
|
329
343
|
|
|
@@ -516,17 +530,6 @@ module ActiveMerchant #:nodoc:
|
|
|
516
530
|
post[:metadata][:card_read_method] = creditcard.read_method if creditcard.respond_to?(:read_method)
|
|
517
531
|
end
|
|
518
532
|
|
|
519
|
-
def fetch_application_fee(identification, options = {})
|
|
520
|
-
options[:key] = @fee_refund_api_key
|
|
521
|
-
|
|
522
|
-
fetch_charge = commit(:get, "charges/#{CGI.escape(identification)}", nil, options)
|
|
523
|
-
application_fee_response!(fetch_charge, "Application fee id could not be retrieved: #{fetch_charge.message}")
|
|
524
|
-
end
|
|
525
|
-
|
|
526
|
-
def application_fee_response!(response, message)
|
|
527
|
-
response.success? ? response : Response.new(false, message)
|
|
528
|
-
end
|
|
529
|
-
|
|
530
533
|
def parse(body)
|
|
531
534
|
JSON.parse(body)
|
|
532
535
|
end
|
|
@@ -21,7 +21,8 @@ module ActiveMerchant #:nodoc:
|
|
|
21
21
|
'jcb' => 'JCB-SSL',
|
|
22
22
|
'maestro' => 'MAESTRO-SSL',
|
|
23
23
|
'diners_club' => 'DINERS-SSL',
|
|
24
|
-
'elo' => 'ELO-SSL'
|
|
24
|
+
'elo' => 'ELO-SSL',
|
|
25
|
+
'unknown' => 'CARD-SSL'
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
AVS_CODE_MAP = {
|
|
@@ -252,7 +253,7 @@ module ActiveMerchant #:nodoc:
|
|
|
252
253
|
end
|
|
253
254
|
else
|
|
254
255
|
xml.tag! 'paymentDetails', credit_fund_transfer_attribute(options) do
|
|
255
|
-
xml.tag!
|
|
256
|
+
xml.tag! card_code_for(payment_method) do
|
|
256
257
|
xml.tag! 'cardNumber', payment_method.number
|
|
257
258
|
xml.tag! 'expiryDate' do
|
|
258
259
|
xml.tag! 'date', 'month' => format(payment_method.month, :two_digits), 'year' => format(payment_method.year, :four_digits)
|
|
@@ -502,6 +503,10 @@ module ActiveMerchant #:nodoc:
|
|
|
502
503
|
return 3 if three_decimal_currency?(currency)
|
|
503
504
|
return 2
|
|
504
505
|
end
|
|
506
|
+
|
|
507
|
+
def card_code_for(payment_method)
|
|
508
|
+
CARD_CODES[card_brand(payment_method)] || CARD_CODES['unknown']
|
|
509
|
+
end
|
|
505
510
|
end
|
|
506
511
|
end
|
|
507
512
|
end
|
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.94.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: 2019-
|
|
11
|
+
date: 2019-05-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|