activemerchant 1.48.0 → 1.49.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
- checksums.yaml.gz.sig +2 -3
- data.tar.gz.sig +0 -0
- data/CHANGELOG +23 -0
- data/README.md +1 -0
- data/lib/active_merchant/billing/credit_card.rb +15 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +3 -3
- data/lib/active_merchant/billing/gateway.rb +5 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +3 -7
- data/lib/active_merchant/billing/gateways/borgun.rb +2 -1
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +3 -1
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +5 -10
- data/lib/active_merchant/billing/gateways/ezic.rb +206 -0
- data/lib/active_merchant/billing/gateways/global_transport.rb +0 -4
- data/lib/active_merchant/billing/gateways/iats_payments.rb +1 -1
- data/lib/active_merchant/billing/gateways/litle.rb +3 -18
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +1 -1
- data/lib/active_merchant/billing/gateways/moneris_us.rb +7 -0
- data/lib/active_merchant/billing/gateways/sage_pay.rb +0 -5
- data/lib/active_merchant/billing/gateways/secure_net.rb +17 -6
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +2 -2
- data/lib/active_merchant/billing/gateways/stripe.rb +49 -19
- data/lib/active_merchant/billing/gateways/wepay.rb +10 -1
- data/lib/active_merchant/billing/response.rb +3 -2
- data/lib/active_merchant/network_connection_retries.rb +1 -0
- data/lib/active_merchant/version.rb +1 -1
- metadata +3 -2
- metadata.gz.sig +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5057426f88d783e8a04528d24fb75c31011eca30
|
4
|
+
data.tar.gz: de26a0e5fff0c27aad8a96bd8b832e7cd1c53c1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d4df9ee441a742077ebc2109758b58ad76e76668d3e4a4169bf778e365fe300d9b8a1f977abc95df6e606fcd1d09491344453c79055771d7ba2ef4f44a1a52b
|
7
|
+
data.tar.gz: fdc30b7c943d11a2f7e505f2f978615b27cb4816360a7e5cde48598f8d3ff72ef58df2feb39a93d77984c0a6e44def9f11fd80ae590487e35dcd19482e99e406
|
checksums.yaml.gz.sig
CHANGED
@@ -1,3 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|���+�$������
|
1
|
+
8
|
2
|
+
����|��XRa|�� Y�sE���qͻ�h�~� �O�َ!y��5�=��%51�tB�M�Pl��h?{�?���h�l8�$�s��ݮ�.@�v�adX��U�(x��ރ/�7Q��bO8��)�9Oa5�?]�f�~|&��h�13��.�o��[�5hX�h���7T%�: ,w������z��2e=-�V�Yi��rJ
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
2
2
|
|
3
|
+
== Version 1.49.0 (May 1, 2015)
|
4
|
+
|
5
|
+
* Braintree: Add support for AVS error codes [ivanvfer]
|
6
|
+
* MerchantWarrior: Truncate description field [duff]
|
7
|
+
* Braintree: Add service_fee_amount option [duff]
|
8
|
+
* SecureNet: Allow shipping_address[:name] [duff]
|
9
|
+
* MonerisUS: Add verify [mrezentes]
|
10
|
+
* Ezic: Add gateway [duff]
|
11
|
+
* Stripe: Add destination field [cwise]
|
12
|
+
* SecureNet: Fix ordering of shipping field names [duff]
|
13
|
+
* SecurePayAu: Update API URL [girasquid]
|
14
|
+
* Stripe: Add EMV "chip & sign", "chip & offline PIN" and Maestro support [bizla]
|
15
|
+
* Add Errno::EHOSTUNREACH to NetworkConnectionRetries::DEFAULT_CONNECTION_ERRORS [randito78]
|
16
|
+
* Stripe: Add support for idempotency keys [michaelherold]
|
17
|
+
* WePay: Handle JSON::ParserError exceptions [duff]
|
18
|
+
* Borgun: Update country list and homepage url [mrezentes]
|
19
|
+
* AuthorizeNet: Add cvv to request only if it's valid [tjstankus]
|
20
|
+
* Stripe: Bug fix: add amounts only on non-EMV transactions, temporarily omit EMV testcases [bizla]
|
21
|
+
* Ezic: Add support for void [duff]
|
22
|
+
* iATS: Update supported countries [mrezentes]
|
23
|
+
* Ezic: Update supported countries [duff]
|
24
|
+
* AuthorizeNet: Truncate card number [tjstankus]
|
25
|
+
|
3
26
|
== Version 1.48.0 (April 8, 2015)
|
4
27
|
|
5
28
|
* Clean up `rake gateways:hosts` output [ntalbott]
|
data/README.md
CHANGED
@@ -115,6 +115,7 @@ The [ActiveMerchant Wiki](http://github.com/Shopify/active_merchant/wikis) conta
|
|
115
115
|
* [eWAY](http://www.eway.com.au/) - AU, NZ, GB
|
116
116
|
* [eWAY Rapid](http://www.eway.com.au/) - AU, NZ, GB, SG
|
117
117
|
* [E-xact](http://www.e-xact.com) - CA, US
|
118
|
+
* [Ezic](http://www.ezic.com/) - AU, CA, CN, FR, DE, GI, IL, MT, MU, MX, NL, NZ, PA, PH, RU, SG, KR, ES, KN, GB
|
118
119
|
* [Fat Zebra](https://www.fatzebra.com.au/) - AU
|
119
120
|
* [Federated Canada](http://www.federatedcanada.com/) - CA
|
120
121
|
* [Finansbank WebPOS](https://www.fbwebpos.com/) - US, TR
|
@@ -138,6 +138,17 @@ module ActiveMerchant #:nodoc:
|
|
138
138
|
# @return [String]
|
139
139
|
attr_accessor :track_data
|
140
140
|
|
141
|
+
# Returns or sets the ICC/ASN1 credit card data for a EMV transaction, typically this is a BER-encoded TLV string.
|
142
|
+
#
|
143
|
+
# @return [String]
|
144
|
+
attr_accessor :icc_data
|
145
|
+
|
146
|
+
# Returns or sets a fallback reason for a EMV transaction whereby the customer's card entered a fallback scenario.
|
147
|
+
# This can be an arbitrary string.
|
148
|
+
#
|
149
|
+
# @return [String]
|
150
|
+
attr_accessor :fallback_reason
|
151
|
+
|
141
152
|
def type
|
142
153
|
ActiveMerchant.deprecated "CreditCard#type is deprecated and will be removed from a future release of ActiveMerchant. Please use CreditCard#brand instead."
|
143
154
|
brand
|
@@ -253,6 +264,10 @@ module ActiveMerchant #:nodoc:
|
|
253
264
|
require_name
|
254
265
|
end
|
255
266
|
|
267
|
+
def emv?
|
268
|
+
icc_data.present?
|
269
|
+
end
|
270
|
+
|
256
271
|
private
|
257
272
|
|
258
273
|
def validate_essential_attributes #:nodoc:
|
@@ -3,7 +3,7 @@ module ActiveMerchant #:nodoc:
|
|
3
3
|
# Convenience methods that can be included into a custom Credit Card object, such as an ActiveRecord based Credit Card object.
|
4
4
|
module CreditCardMethods
|
5
5
|
CARD_COMPANIES = {
|
6
|
-
'visa' => /^4\d{12}(\d{3})?$/,
|
6
|
+
'visa' => /^4\d{12}(\d{3})?(\d{3})?$/,
|
7
7
|
'master' => /^(5[1-5]\d{4}|677189)\d{10}$/,
|
8
8
|
'discover' => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
|
9
9
|
'american_express' => /^3[47]\d{13}$/,
|
@@ -49,11 +49,11 @@ module ActiveMerchant #:nodoc:
|
|
49
49
|
def valid_card_verification_value?(cvv, brand)
|
50
50
|
cvv.to_s =~ /^\d{#{card_verification_value_length(brand)}}$/
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def card_verification_value_length(brand)
|
54
54
|
brand == 'american_express' ? 4 : 3
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def valid_issue_number?(number)
|
58
58
|
(number.to_s =~ /^\d{1,2}$/)
|
59
59
|
end
|
@@ -254,6 +254,11 @@ module ActiveMerchant #:nodoc:
|
|
254
254
|
money.respond_to?(:currency) ? money.currency : self.default_currency
|
255
255
|
end
|
256
256
|
|
257
|
+
def truncate(value, max_size)
|
258
|
+
return nil unless value
|
259
|
+
value.to_s[0, max_size]
|
260
|
+
end
|
261
|
+
|
257
262
|
def requires_start_date_or_issue_number?(credit_card)
|
258
263
|
return false if card_brand(credit_card).blank?
|
259
264
|
DEBIT_CARDS.include?(card_brand(credit_card).to_sym)
|
@@ -22,7 +22,7 @@ module ActiveMerchant #:nodoc:
|
|
22
22
|
'2315' => STANDARD_ERROR_CODE[:invalid_number],
|
23
23
|
'37' => STANDARD_ERROR_CODE[:invalid_expiry_date],
|
24
24
|
'2316' => STANDARD_ERROR_CODE[:invalid_expiry_date],
|
25
|
-
'378' => STANDARD_ERROR_CODE[:invalid_cvc],
|
25
|
+
'378' => STANDARD_ERROR_CODE[:invalid_cvc],
|
26
26
|
'38' => STANDARD_ERROR_CODE[:expired_card],
|
27
27
|
'2317' => STANDARD_ERROR_CODE[:expired_card],
|
28
28
|
'244' => STANDARD_ERROR_CODE[:incorrect_cvc],
|
@@ -232,9 +232,9 @@ module ActiveMerchant #:nodoc:
|
|
232
232
|
else
|
233
233
|
xml.payment do
|
234
234
|
xml.creditCard do
|
235
|
-
xml.cardNumber(credit_card.number)
|
235
|
+
xml.cardNumber(truncate(credit_card.number, 16))
|
236
236
|
xml.expirationDate(format(credit_card.month, :two_digits) + '/' + format(credit_card.year, :four_digits))
|
237
|
-
|
237
|
+
if credit_card.valid_card_verification_value?(credit_card.verification_value, credit_card.brand)
|
238
238
|
xml.cardCode(credit_card.verification_value)
|
239
239
|
end
|
240
240
|
if credit_card.is_a?(NetworkTokenizationCreditCard)
|
@@ -486,10 +486,6 @@ module ActiveMerchant #:nodoc:
|
|
486
486
|
(response[:response_code] == FRAUD_REVIEW)
|
487
487
|
end
|
488
488
|
|
489
|
-
def truncate(value, max_size)
|
490
|
-
return nil unless value
|
491
|
-
value.to_s[0, max_size]
|
492
|
-
end
|
493
489
|
|
494
490
|
def using_live_gateway_in_test_mode?(response)
|
495
491
|
!test? && response[:test_request] == "1"
|
@@ -4,11 +4,12 @@ module ActiveMerchant #:nodoc:
|
|
4
4
|
module Billing #:nodoc:
|
5
5
|
class BorgunGateway < Gateway
|
6
6
|
self.display_name = "Borgun"
|
7
|
+
self.homepage_url = 'http://www.borgun.com'
|
7
8
|
|
8
9
|
self.test_url = 'https://gatewaytest.borgun.is/ws/Heimir.pub.ws:Authorization'
|
9
10
|
self.live_url = 'https://gateway01.borgun.is/ws/Heimir.pub.ws:Authorization'
|
10
11
|
|
11
|
-
self.supported_countries = ['IS']
|
12
|
+
self.supported_countries = ['IS', 'GB', 'HU', 'CZ', 'DE', 'DK', 'SE' ]
|
12
13
|
self.default_currency = 'ISK'
|
13
14
|
self.money_format = :cents
|
14
15
|
self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :discover, :jcb]
|
@@ -335,7 +335,8 @@ module ActiveMerchant #:nodoc:
|
|
335
335
|
end
|
336
336
|
|
337
337
|
def avs_code_from(transaction)
|
338
|
-
|
338
|
+
transaction.avs_error_response_code ||
|
339
|
+
avs_mapping["street: #{transaction.avs_street_address_response_code}, zip: #{transaction.avs_postal_code_response_code}"]
|
339
340
|
end
|
340
341
|
|
341
342
|
def avs_mapping
|
@@ -518,6 +519,7 @@ module ActiveMerchant #:nodoc:
|
|
518
519
|
|
519
520
|
parameters[:custom_fields] = options[:custom_fields]
|
520
521
|
parameters[:device_data] = options[:device_data] if options[:device_data]
|
522
|
+
parameters[:service_fee_amount] = options[:service_fee_amount] if options[:service_fee_amount]
|
521
523
|
if merchant_account_id = (options[:merchant_account_id] || @merchant_account_id)
|
522
524
|
parameters[:merchant_account_id] = merchant_account_id
|
523
525
|
end
|
@@ -186,7 +186,7 @@ module ActiveMerchant #:nodoc:
|
|
186
186
|
currency_code = options[:currency] || currency(money)
|
187
187
|
params[key] = {
|
188
188
|
'TotalAmount' => localized_amount(money, currency_code),
|
189
|
-
'InvoiceReference' => truncate(options[:order_id]),
|
189
|
+
'InvoiceReference' => truncate(options[:order_id], 50),
|
190
190
|
'InvoiceNumber' => truncate(options[:order_id], 12),
|
191
191
|
'InvoiceDescription' => truncate(options[:description], 64),
|
192
192
|
'CurrencyCode' => currency_code,
|
@@ -214,9 +214,9 @@ module ActiveMerchant #:nodoc:
|
|
214
214
|
end
|
215
215
|
params['Title'] = address[:title]
|
216
216
|
params['CompanyName'] = address[:company] unless options[:skip_company]
|
217
|
-
params['Street1'] = truncate(address[:address1])
|
218
|
-
params['Street2'] = truncate(address[:address2])
|
219
|
-
params['City'] = truncate(address[:city])
|
217
|
+
params['Street1'] = truncate(address[:address1], 50)
|
218
|
+
params['Street2'] = truncate(address[:address2], 50)
|
219
|
+
params['City'] = truncate(address[:city], 50)
|
220
220
|
params['State'] = address[:state]
|
221
221
|
params['PostalCode'] = address[:zip]
|
222
222
|
params['Country'] = address[:country].to_s.downcase
|
@@ -230,7 +230,7 @@ module ActiveMerchant #:nodoc:
|
|
230
230
|
params['Customer'] ||= {}
|
231
231
|
if credit_card.respond_to? :number
|
232
232
|
card_details = params['Customer']['CardDetails'] = {}
|
233
|
-
card_details['Name'] = truncate(credit_card.name)
|
233
|
+
card_details['Name'] = truncate(credit_card.name, 50)
|
234
234
|
card_details['Number'] = credit_card.number
|
235
235
|
card_details['ExpiryMonth'] = "%02d" % (credit_card.month || 0)
|
236
236
|
card_details['ExpiryYear'] = "%02d" % (credit_card.year || 0)
|
@@ -337,11 +337,6 @@ module ActiveMerchant #:nodoc:
|
|
337
337
|
end
|
338
338
|
end
|
339
339
|
|
340
|
-
def truncate(value, max_size = 50)
|
341
|
-
return nil unless value
|
342
|
-
value.to_s[0, max_size]
|
343
|
-
end
|
344
|
-
|
345
340
|
MESSAGES = {
|
346
341
|
'A2000' => 'Transaction Approved Successful',
|
347
342
|
'A2008' => 'Honour With Identification Successful',
|
@@ -0,0 +1,206 @@
|
|
1
|
+
module ActiveMerchant
|
2
|
+
module Billing
|
3
|
+
class EzicGateway < Gateway
|
4
|
+
self.live_url = 'https://secure-dm3.ezic.com/gw/sas/direct3.2'
|
5
|
+
|
6
|
+
self.supported_countries = %w(AU CA CN FR DE GI IL MT MU MX NL NZ PA PH RU SG KR ES KN GB US)
|
7
|
+
self.default_currency = 'USD'
|
8
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
|
9
|
+
|
10
|
+
self.homepage_url = 'http://www.ezic.com/'
|
11
|
+
self.display_name = 'Ezic'
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
requires!(options, :account_id)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def purchase(money, payment, options={})
|
19
|
+
post = {}
|
20
|
+
|
21
|
+
add_account_id(post)
|
22
|
+
add_invoice(post, money, options)
|
23
|
+
add_payment(post, payment)
|
24
|
+
add_customer_data(post, options)
|
25
|
+
|
26
|
+
commit("S", post)
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorize(money, payment, options={})
|
30
|
+
post = {}
|
31
|
+
|
32
|
+
add_account_id(post)
|
33
|
+
add_invoice(post, money, options)
|
34
|
+
add_payment(post, payment)
|
35
|
+
add_customer_data(post, options)
|
36
|
+
|
37
|
+
commit("A", post)
|
38
|
+
end
|
39
|
+
|
40
|
+
def capture(money, authorization, options={})
|
41
|
+
post = {}
|
42
|
+
|
43
|
+
add_account_id(post)
|
44
|
+
add_invoice(post, money, options)
|
45
|
+
add_authorization(post, authorization)
|
46
|
+
add_pay_type(post)
|
47
|
+
|
48
|
+
commit("D", post)
|
49
|
+
end
|
50
|
+
|
51
|
+
def refund(money, authorization, options={})
|
52
|
+
post = {}
|
53
|
+
|
54
|
+
add_account_id(post)
|
55
|
+
add_invoice(post, money, options)
|
56
|
+
add_authorization(post, authorization)
|
57
|
+
add_pay_type(post)
|
58
|
+
|
59
|
+
commit("R", post)
|
60
|
+
end
|
61
|
+
|
62
|
+
def void(authorization, options={})
|
63
|
+
post = {}
|
64
|
+
|
65
|
+
add_account_id(post)
|
66
|
+
add_authorization(post, authorization)
|
67
|
+
add_pay_type(post)
|
68
|
+
|
69
|
+
commit("U", post)
|
70
|
+
end
|
71
|
+
|
72
|
+
def verify(credit_card, options={})
|
73
|
+
MultiResponse.run(:use_first_response) do |r|
|
74
|
+
r.process { authorize(100, credit_card, options) }
|
75
|
+
r.process(:ignore_result) { void(r.authorization, options) }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def supports_scrubbing?
|
80
|
+
true
|
81
|
+
end
|
82
|
+
|
83
|
+
def scrub(transcript)
|
84
|
+
transcript.
|
85
|
+
gsub(%r((card_number=)\w+), '\1[FILTERED]').
|
86
|
+
gsub(%r((card_cvv2=)\w+), '\1[FILTERED]')
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def add_account_id(post)
|
92
|
+
post[:account_id] = @options[:account_id]
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_addresses(post, options)
|
96
|
+
add_billing_address(post, options)
|
97
|
+
add_shipping_address(post, options)
|
98
|
+
end
|
99
|
+
|
100
|
+
def add_billing_address(post, options)
|
101
|
+
address = options[:billing_address] || {}
|
102
|
+
|
103
|
+
if address[:name]
|
104
|
+
names = address[:name].split
|
105
|
+
post[:bill_name2] = names.pop
|
106
|
+
post[:bill_name1] = names.join(" ")
|
107
|
+
end
|
108
|
+
|
109
|
+
post[:bill_street] = address[:address1] if address[:address1]
|
110
|
+
post[:bill_city] = address[:city] if address[:city]
|
111
|
+
post[:bill_state] = address[:state] if address[:state]
|
112
|
+
post[:bill_zip] = address[:zip] if address[:zip]
|
113
|
+
post[:bill_country] = address[:country] if address[:country]
|
114
|
+
post[:cust_phone] = address[:phone] if address[:phone]
|
115
|
+
end
|
116
|
+
|
117
|
+
def add_shipping_address(post, options)
|
118
|
+
address = options[:shipping_address] || {}
|
119
|
+
|
120
|
+
if address[:name]
|
121
|
+
names = address[:name].split
|
122
|
+
post[:ship_name2] = names.pop
|
123
|
+
post[:ship_name1] = names.join(" ")
|
124
|
+
end
|
125
|
+
|
126
|
+
post[:ship_street] = address[:address1] if address[:address1]
|
127
|
+
post[:ship_city] = address[:city] if address[:city]
|
128
|
+
post[:ship_state] = address[:state] if address[:state]
|
129
|
+
post[:ship_zip] = address[:zip] if address[:zip]
|
130
|
+
post[:ship_country] = address[:country] if address[:country]
|
131
|
+
end
|
132
|
+
|
133
|
+
def add_customer_data(post, options)
|
134
|
+
post[:cust_ip] = options[:ip] if options[:ip]
|
135
|
+
post[:cust_email] = options[:email] if options[:email]
|
136
|
+
add_addresses(post, options)
|
137
|
+
end
|
138
|
+
|
139
|
+
def add_invoice(post, money, options)
|
140
|
+
post[:amount] = amount(money)
|
141
|
+
post[:description] = options[:description] if options[:description]
|
142
|
+
end
|
143
|
+
|
144
|
+
def add_payment(post, payment)
|
145
|
+
add_pay_type(post)
|
146
|
+
post[:card_number] = payment.number
|
147
|
+
post[:card_cvv2] = payment.verification_value
|
148
|
+
post[:card_expire] = expdate(payment)
|
149
|
+
end
|
150
|
+
|
151
|
+
def add_authorization(post, authorization)
|
152
|
+
post[:orig_id] = authorization
|
153
|
+
end
|
154
|
+
|
155
|
+
def add_pay_type(post)
|
156
|
+
post[:pay_type] = "C"
|
157
|
+
end
|
158
|
+
|
159
|
+
def parse(body)
|
160
|
+
CGI::parse(body).inject({}) { |hash, (key, value)| hash[key] = value.first; hash }
|
161
|
+
end
|
162
|
+
|
163
|
+
def commit(transaction_type, parameters)
|
164
|
+
parameters[:tran_type] = transaction_type
|
165
|
+
|
166
|
+
begin
|
167
|
+
response = parse(ssl_post(live_url, post_data(parameters), headers))
|
168
|
+
Response.new(
|
169
|
+
success_from(response),
|
170
|
+
message_from(response),
|
171
|
+
response,
|
172
|
+
authorization: authorization_from(response),
|
173
|
+
avs_result: AVSResult.new(code: response["avs_code"]),
|
174
|
+
cvv_result: CVVResult.new(response["cvv2_code"]),
|
175
|
+
test: test?
|
176
|
+
)
|
177
|
+
rescue ResponseError => e
|
178
|
+
Response.new(false, e.response.message)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def success_from(response)
|
183
|
+
response["status_code"] == "1" || response["status_code"] == "T"
|
184
|
+
end
|
185
|
+
|
186
|
+
def message_from(response)
|
187
|
+
response["auth_msg"]
|
188
|
+
end
|
189
|
+
|
190
|
+
def authorization_from(response)
|
191
|
+
response["trans_id"]
|
192
|
+
end
|
193
|
+
|
194
|
+
def post_data(parameters = {})
|
195
|
+
parameters.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
|
196
|
+
end
|
197
|
+
|
198
|
+
def headers
|
199
|
+
{
|
200
|
+
"User-Agent" => "ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
|
201
|
+
}
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
@@ -6,7 +6,7 @@ module ActiveMerchant #:nodoc:
|
|
6
6
|
self.live_na_url = 'https://www.iatspayments.com/NetGate'
|
7
7
|
self.live_uk_url = 'https://www.uk.iatspayments.com/NetGate'
|
8
8
|
|
9
|
-
self.supported_countries = %w(AU BR CA CH DE DK ES FI FR GR HK IE IT NL NO PT SE SG TR GB US)
|
9
|
+
self.supported_countries = %w(AU BR CA CH DE DK ES FI FR GR HK IE IT NL NO PT SE SG TR GB US TH ID PH BE)
|
10
10
|
self.default_currency = 'USD'
|
11
11
|
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
12
12
|
|
@@ -107,7 +107,7 @@ module ActiveMerchant #:nodoc:
|
|
107
107
|
request = build_xml_request do |doc|
|
108
108
|
add_authentication(doc)
|
109
109
|
doc.registerTokenRequest(transaction_attributes(options)) do
|
110
|
-
doc.orderId(
|
110
|
+
doc.orderId(truncate(options[:order_id], 24))
|
111
111
|
doc.accountNumber(creditcard.number)
|
112
112
|
end
|
113
113
|
end
|
@@ -155,7 +155,7 @@ module ActiveMerchant #:nodoc:
|
|
155
155
|
end
|
156
156
|
|
157
157
|
def add_auth_purchase_params(doc, money, payment_method, options)
|
158
|
-
doc.orderId(
|
158
|
+
doc.orderId(truncate(options[:order_id], 24))
|
159
159
|
doc.amount(money)
|
160
160
|
add_order_source(doc, payment_method, options)
|
161
161
|
add_billing_address(doc, payment_method, options)
|
@@ -296,7 +296,7 @@ module ActiveMerchant #:nodoc:
|
|
296
296
|
|
297
297
|
def transaction_attributes(options)
|
298
298
|
attributes = {}
|
299
|
-
attributes[:id] =
|
299
|
+
attributes[:id] = truncate(options[:id] || options[:order_id], 24)
|
300
300
|
attributes[:reportGroup] = options[:merchant] || 'Default Report Group'
|
301
301
|
attributes[:customerId] = options[:customer]
|
302
302
|
attributes.delete_if { |key, value| value == nil }
|
@@ -323,21 +323,6 @@ module ActiveMerchant #:nodoc:
|
|
323
323
|
test? ? test_url : live_url
|
324
324
|
end
|
325
325
|
|
326
|
-
def truncated(value)
|
327
|
-
return unless value
|
328
|
-
value[0..24]
|
329
|
-
end
|
330
|
-
|
331
|
-
def truncated_order_id(options)
|
332
|
-
return unless options[:order_id]
|
333
|
-
options[:order_id][0..24]
|
334
|
-
end
|
335
|
-
|
336
|
-
def truncated_id(options)
|
337
|
-
return unless options[:id]
|
338
|
-
options[:id][0..24]
|
339
|
-
end
|
340
|
-
|
341
326
|
def headers
|
342
327
|
{
|
343
328
|
'Content-Type' => 'text/xml'
|
@@ -38,6 +38,13 @@ module ActiveMerchant #:nodoc:
|
|
38
38
|
super
|
39
39
|
end
|
40
40
|
|
41
|
+
def verify(creditcard_or_datakey, options = {})
|
42
|
+
MultiResponse.run(:use_first_response) do |r|
|
43
|
+
r.process { authorize(100, creditcard_or_datakey, options) }
|
44
|
+
r.process(:ignore_result) { capture(0, r.authorization) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
# Referred to as "PreAuth" in the Moneris integration guide, this action
|
42
49
|
# verifies and locks funds on a customer's card, which then must be
|
43
50
|
# captured at a later date.
|
@@ -93,8 +93,7 @@ module ActiveMerchant #:nodoc:
|
|
93
93
|
|
94
94
|
xml.tag! 'AMOUNT', amount(money)
|
95
95
|
add_credit_card(xml, creditcard)
|
96
|
-
add_params_in_required_order(xml, action, options)
|
97
|
-
add_address(xml, creditcard, options)
|
96
|
+
add_params_in_required_order(xml, action, creditcard, options)
|
98
97
|
add_more_required_params(xml, options)
|
99
98
|
|
100
99
|
xml.target!
|
@@ -110,7 +109,7 @@ module ActiveMerchant #:nodoc:
|
|
110
109
|
xml.tag! 'CARDNUMBER', last_four
|
111
110
|
end
|
112
111
|
|
113
|
-
add_params_in_required_order(xml, action, options)
|
112
|
+
add_params_in_required_order(xml, action, nil, options)
|
114
113
|
xml.tag! 'REF_TRANSID', transaction_id
|
115
114
|
add_more_required_params(xml, options)
|
116
115
|
|
@@ -136,6 +135,7 @@ module ActiveMerchant #:nodoc:
|
|
136
135
|
end
|
137
136
|
|
138
137
|
def add_address(xml, creditcard, options)
|
138
|
+
return unless creditcard
|
139
139
|
|
140
140
|
if address = options[:billing_address] || options[:address]
|
141
141
|
xml.tag!("CUSTOMER_BILL") do
|
@@ -161,8 +161,18 @@ module ActiveMerchant #:nodoc:
|
|
161
161
|
xml.tag! 'CITY', address[:city].to_s
|
162
162
|
xml.tag! 'COMPANY', address[:company].to_s
|
163
163
|
xml.tag! 'COUNTRY', address[:country].to_s
|
164
|
-
|
165
|
-
|
164
|
+
|
165
|
+
if address[:name]
|
166
|
+
names = address[:name].split
|
167
|
+
last_name = names.pop
|
168
|
+
first_name = names.join(" ")
|
169
|
+
xml.tag! 'FIRSTNAME', first_name
|
170
|
+
xml.tag! 'LASTNAME', last_name
|
171
|
+
else
|
172
|
+
xml.tag! 'FIRSTNAME', address[:first_name].to_s
|
173
|
+
xml.tag! 'LASTNAME', address[:last_name].to_s
|
174
|
+
end
|
175
|
+
|
166
176
|
xml.tag! 'STATE', address[:state].blank? ? 'n/a' : address[:state]
|
167
177
|
xml.tag! 'ZIP', address[:zip].to_s
|
168
178
|
end
|
@@ -182,9 +192,10 @@ module ActiveMerchant #:nodoc:
|
|
182
192
|
end
|
183
193
|
|
184
194
|
# SecureNet requires some of the xml params to be in a certain order. http://cl.ly/image/3K260E0p0a0n/content.png
|
185
|
-
def add_params_in_required_order(xml, action, options)
|
195
|
+
def add_params_in_required_order(xml, action, creditcard, options)
|
186
196
|
xml.tag! 'CODE', TRANSACTIONS[action]
|
187
197
|
add_customer_data(xml, options)
|
198
|
+
add_address(xml, creditcard, options)
|
188
199
|
xml.tag! 'DCI', 0 # No duplicate checking will be done, except for ORDERID
|
189
200
|
xml.tag! 'INSTALLMENT_SEQUENCENUM', 1
|
190
201
|
xml.tag! 'INVOICEDESC', options[:invoice_description] if options[:invoice_description]
|
@@ -8,8 +8,8 @@ module ActiveMerchant #:nodoc:
|
|
8
8
|
|
9
9
|
class_attribute :test_periodic_url, :live_periodic_url
|
10
10
|
|
11
|
-
self.test_url = 'https://
|
12
|
-
self.live_url = 'https://
|
11
|
+
self.test_url = 'https://api.securepay.com.au/test/payment'
|
12
|
+
self.live_url = 'https://api.securepay.com.au/xmlapi/payment'
|
13
13
|
|
14
14
|
self.test_periodic_url = 'https://test.securepay.com.au/xmlapi/periodic'
|
15
15
|
self.live_periodic_url = 'https://api.securepay.com.au/xmlapi/periodic'
|
@@ -27,7 +27,7 @@ module ActiveMerchant #:nodoc:
|
|
27
27
|
self.supported_countries = %w(AT AU BE CA CH DE DK ES FI FR GB IE IT LU NL NO SE US)
|
28
28
|
self.default_currency = 'USD'
|
29
29
|
self.money_format = :cents
|
30
|
-
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
|
30
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club, :maestro]
|
31
31
|
|
32
32
|
self.homepage_url = 'https://stripe.com/'
|
33
33
|
self.display_name = 'Stripe'
|
@@ -62,7 +62,7 @@ module ActiveMerchant #:nodoc:
|
|
62
62
|
end
|
63
63
|
r.process do
|
64
64
|
post = create_post_for_auth_or_purchase(money, payment, options)
|
65
|
-
post[:capture] = "false"
|
65
|
+
post[:capture] = "false" unless emv_payment?(payment)
|
66
66
|
commit(:post, 'charges', post, options)
|
67
67
|
end
|
68
68
|
end.responses.last
|
@@ -90,10 +90,16 @@ module ActiveMerchant #:nodoc:
|
|
90
90
|
|
91
91
|
def capture(money, authorization, options = {})
|
92
92
|
post = {}
|
93
|
-
|
93
|
+
|
94
94
|
add_application_fee(post, options)
|
95
95
|
|
96
|
-
|
96
|
+
if emv_tc_response = options.delete(:icc_data)
|
97
|
+
post[:card] = { emv_approval_data: emv_tc_response }
|
98
|
+
commit(:post, "charges/#{CGI.escape(authorization)}", post, options)
|
99
|
+
else
|
100
|
+
add_amount(post, money, options)
|
101
|
+
commit(:post, "charges/#{CGI.escape(authorization)}/capture", post, options)
|
102
|
+
end
|
97
103
|
end
|
98
104
|
|
99
105
|
def void(identification, options = {})
|
@@ -226,24 +232,24 @@ module ActiveMerchant #:nodoc:
|
|
226
232
|
|
227
233
|
def create_post_for_auth_or_purchase(money, payment, options)
|
228
234
|
post = {}
|
229
|
-
|
235
|
+
|
230
236
|
if payment.is_a?(StripePaymentToken)
|
231
237
|
add_payment_token(post, payment, options)
|
232
238
|
else
|
233
239
|
add_creditcard(post, payment, options)
|
234
240
|
end
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
241
|
+
unless emv_payment?(payment)
|
242
|
+
add_amount(post, money, options, true)
|
243
|
+
add_customer_data(post, options)
|
244
|
+
add_metadata(post, options)
|
245
|
+
post[:description] = options[:description]
|
246
|
+
post[:statement_description] = options[:statement_description]
|
247
|
+
add_customer(post, payment, options)
|
248
|
+
add_flags(post, options)
|
249
|
+
end
|
244
250
|
|
245
|
-
add_flags(post, options)
|
246
251
|
add_application_fee(post, options)
|
252
|
+
add_destination(post, options)
|
247
253
|
post
|
248
254
|
end
|
249
255
|
|
@@ -257,6 +263,10 @@ module ActiveMerchant #:nodoc:
|
|
257
263
|
post[:application_fee] = options[:application_fee] if options[:application_fee]
|
258
264
|
end
|
259
265
|
|
266
|
+
def add_destination(post, options)
|
267
|
+
post[:destination] = options[:destination] if options[:destination]
|
268
|
+
end
|
269
|
+
|
260
270
|
def add_expand_parameters(post, options)
|
261
271
|
post[:expand] = Array.wrap(options[:expand])
|
262
272
|
end
|
@@ -283,9 +293,12 @@ module ActiveMerchant #:nodoc:
|
|
283
293
|
|
284
294
|
def add_creditcard(post, creditcard, options)
|
285
295
|
card = {}
|
286
|
-
if
|
296
|
+
if emv_payment?(creditcard)
|
297
|
+
add_emv_creditcard(post, creditcard.icc_data)
|
298
|
+
elsif creditcard.respond_to?(:number)
|
287
299
|
if creditcard.respond_to?(:track_data) && creditcard.track_data.present?
|
288
300
|
card[:swipe_data] = creditcard.track_data
|
301
|
+
card[:fallback_reason] = creditcard.fallback_reason if creditcard.fallback_reason
|
289
302
|
else
|
290
303
|
card[:number] = creditcard.number
|
291
304
|
card[:exp_month] = creditcard.month
|
@@ -293,7 +306,6 @@ module ActiveMerchant #:nodoc:
|
|
293
306
|
card[:cvc] = creditcard.verification_value if creditcard.verification_value?
|
294
307
|
card[:name] = creditcard.name if creditcard.name
|
295
308
|
end
|
296
|
-
|
297
309
|
post[:card] = card
|
298
310
|
|
299
311
|
if creditcard.is_a?(NetworkTokenizationCreditCard)
|
@@ -314,6 +326,10 @@ module ActiveMerchant #:nodoc:
|
|
314
326
|
end
|
315
327
|
end
|
316
328
|
|
329
|
+
def add_emv_creditcard(post, icc_data, options = {})
|
330
|
+
post[:card] = { emv_auth_data: icc_data }
|
331
|
+
end
|
332
|
+
|
317
333
|
def add_payment_token(post, token, options = {})
|
318
334
|
post[:card] = token.payment_data["id"]
|
319
335
|
end
|
@@ -327,6 +343,13 @@ module ActiveMerchant #:nodoc:
|
|
327
343
|
post[:recurring] = true if (options[:eci] == 'recurring' || options[:recurring])
|
328
344
|
end
|
329
345
|
|
346
|
+
def add_metadata(post, options = {})
|
347
|
+
post[:metadata] = options[:metadata] || {}
|
348
|
+
post[:metadata][:email] = options[:email] if options[:email]
|
349
|
+
post[:metadata][:order_id] = options[:order_id] if options[:order_id]
|
350
|
+
post.delete(:metadata) if post[:metadata].empty?
|
351
|
+
end
|
352
|
+
|
330
353
|
def fetch_application_fees(identification, options = {})
|
331
354
|
options.merge!(:key => @fee_refund_api_key)
|
332
355
|
|
@@ -359,6 +382,7 @@ module ActiveMerchant #:nodoc:
|
|
359
382
|
def headers(options = {})
|
360
383
|
key = options[:key] || @api_key
|
361
384
|
version = options[:version] || @version
|
385
|
+
idempotency_key = options[:idempotency_key]
|
362
386
|
|
363
387
|
headers = {
|
364
388
|
"Authorization" => "Basic " + Base64.encode64(key.to_s + ":").strip,
|
@@ -367,6 +391,7 @@ module ActiveMerchant #:nodoc:
|
|
367
391
|
"X-Stripe-Client-User-Metadata" => {:ip => options[:ip]}.to_json
|
368
392
|
}
|
369
393
|
headers.merge!("Stripe-Version" => version) if version
|
394
|
+
headers.merge!("Idempotency-Key" => idempotency_key) if idempotency_key
|
370
395
|
headers
|
371
396
|
end
|
372
397
|
|
@@ -386,11 +411,11 @@ module ActiveMerchant #:nodoc:
|
|
386
411
|
|
387
412
|
def commit(method, url, parameters = nil, options = {})
|
388
413
|
add_expand_parameters(parameters, options) if parameters
|
389
|
-
|
390
414
|
response = api_request(method, url, parameters, options)
|
415
|
+
|
391
416
|
success = !response.key?("error")
|
392
417
|
|
393
|
-
card = response["card"] || response["active_card"] || {}
|
418
|
+
card = response["card"] || response["active_card"] || response["source"] || {}
|
394
419
|
avs_code = AVS_CODE_TRANSLATOR["line1: #{card["address_line1_check"]}, zip: #{card["address_zip_check"]}"]
|
395
420
|
cvc_code = CVC_CODE_TRANSLATOR[card["cvc_check"]]
|
396
421
|
|
@@ -401,6 +426,7 @@ module ActiveMerchant #:nodoc:
|
|
401
426
|
:authorization => success ? response["id"] : response["error"]["charge"],
|
402
427
|
:avs_result => { :code => avs_code },
|
403
428
|
:cvv_result => cvc_code,
|
429
|
+
:emv_authorization => card["emv_auth_data"],
|
404
430
|
:error_code => success ? nil : STANDARD_ERROR_CODE_MAPPING[response["error"]["code"]]
|
405
431
|
)
|
406
432
|
end
|
@@ -426,6 +452,10 @@ module ActiveMerchant #:nodoc:
|
|
426
452
|
def non_fractional_currency?(currency)
|
427
453
|
CURRENCIES_WITHOUT_FRACTIONS.include?(currency.to_s)
|
428
454
|
end
|
455
|
+
|
456
|
+
def emv_payment?(payment)
|
457
|
+
payment.respond_to?(:emv?) && payment.emv?
|
458
|
+
end
|
429
459
|
end
|
430
460
|
end
|
431
461
|
end
|
@@ -148,13 +148,16 @@ module ActiveMerchant #:nodoc:
|
|
148
148
|
response = parse(e.response.body)
|
149
149
|
end
|
150
150
|
|
151
|
-
Response.new(
|
151
|
+
return Response.new(
|
152
152
|
success_from(response),
|
153
153
|
message_from(response),
|
154
154
|
response,
|
155
155
|
authorization: authorization_from(response, params),
|
156
156
|
test: test?
|
157
157
|
)
|
158
|
+
|
159
|
+
rescue JSON::ParserError
|
160
|
+
return unparsable_response(response)
|
158
161
|
end
|
159
162
|
|
160
163
|
def success_from(response)
|
@@ -176,6 +179,12 @@ module ActiveMerchant #:nodoc:
|
|
176
179
|
[auth, original_amount]
|
177
180
|
end
|
178
181
|
|
182
|
+
def unparsable_response(raw_response)
|
183
|
+
message = "Invalid JSON response received from WePay. Please contact WePay support if you continue to receive this message."
|
184
|
+
message += " (The raw response returned by the API was #{raw_response.inspect})"
|
185
|
+
return Response.new(false, message)
|
186
|
+
end
|
187
|
+
|
179
188
|
def headers
|
180
189
|
{
|
181
190
|
"Content-Type" => "application/json",
|
@@ -4,7 +4,7 @@ module ActiveMerchant #:nodoc:
|
|
4
4
|
end
|
5
5
|
|
6
6
|
class Response
|
7
|
-
attr_reader :params, :message, :test, :authorization, :avs_result, :cvv_result, :error_code
|
7
|
+
attr_reader :params, :message, :test, :authorization, :avs_result, :cvv_result, :error_code, :emv_authorization
|
8
8
|
|
9
9
|
def success?
|
10
10
|
@success
|
@@ -24,6 +24,7 @@ module ActiveMerchant #:nodoc:
|
|
24
24
|
@authorization = options[:authorization]
|
25
25
|
@fraud_review = options[:fraud_review]
|
26
26
|
@error_code = options[:error_code]
|
27
|
+
@emv_authorization = options[:emv_authorization]
|
27
28
|
|
28
29
|
@avs_result = if options[:avs_result].kind_of?(AVSResult)
|
29
30
|
options[:avs_result].to_hash
|
@@ -79,7 +80,7 @@ module ActiveMerchant #:nodoc:
|
|
79
80
|
(primary_response ? primary_response.success? : true)
|
80
81
|
end
|
81
82
|
|
82
|
-
%w(params message test authorization avs_result cvv_result error_code test? fraud_review?).each do |m|
|
83
|
+
%w(params message test authorization avs_result cvv_result error_code emv_authorization test? fraud_review?).each do |m|
|
83
84
|
class_eval %(
|
84
85
|
def #{m}
|
85
86
|
(@responses.empty? ? nil : primary_response.#{m})
|
@@ -7,6 +7,7 @@ module ActiveMerchant
|
|
7
7
|
Timeout::Error => "The connection to the remote server timed out",
|
8
8
|
Errno::ETIMEDOUT => "The connection to the remote server timed out",
|
9
9
|
SocketError => "The connection to the remote server could not be established",
|
10
|
+
Errno::EHOSTUNREACH => "The connection to the remote server could not be established",
|
10
11
|
OpenSSL::SSL::SSLError => "The SSL connection to the remote server could not be established"
|
11
12
|
}
|
12
13
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activemerchant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.49.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
fl3hbtVFTqbOlwL9vy1fudXcolIE/ZTcxQ+er07ZFZdKCXayR9PPs64heamfn0fp
|
31
31
|
TConQSX2BnZdhIEYW+cKzEC/bLc=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2015-
|
33
|
+
date: 2015-05-01 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: activesupport
|
@@ -226,6 +226,7 @@ files:
|
|
226
226
|
- lib/active_merchant/billing/gateways/eway_managed.rb
|
227
227
|
- lib/active_merchant/billing/gateways/eway_rapid.rb
|
228
228
|
- lib/active_merchant/billing/gateways/exact.rb
|
229
|
+
- lib/active_merchant/billing/gateways/ezic.rb
|
229
230
|
- lib/active_merchant/billing/gateways/fat_zebra.rb
|
230
231
|
- lib/active_merchant/billing/gateways/federated_canada.rb
|
231
232
|
- lib/active_merchant/billing/gateways/finansbank.rb
|
metadata.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
r���!��ꗐ��u试e0�8�)���qDLe���\�})X�I֒�>\�<�Ce?r����÷z>g��EYL�2g�s&!��bE
|