activemerchant 1.64.0 → 1.65.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.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +27 -0
  3. data/README.md +0 -1
  4. data/lib/active_merchant/billing/gateways/adyen.rb +228 -0
  5. data/lib/active_merchant/billing/gateways/authorize_net.rb +9 -1
  6. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +68 -2
  7. data/lib/active_merchant/billing/gateways/braintree_blue.rb +10 -2
  8. data/lib/active_merchant/billing/gateways/checkout_v2.rb +2 -2
  9. data/lib/active_merchant/billing/gateways/cyber_source.rb +2 -0
  10. data/lib/active_merchant/billing/gateways/global_collect.rb +17 -5
  11. data/lib/active_merchant/billing/gateways/jetpay.rb +12 -9
  12. data/lib/active_merchant/billing/gateways/openpay.rb +1 -0
  13. data/lib/active_merchant/billing/gateways/orbital.rb +5 -3
  14. data/lib/active_merchant/billing/gateways/payeezy.rb +7 -0
  15. data/lib/active_merchant/billing/gateways/payu_latam.rb +1 -1
  16. data/lib/active_merchant/billing/gateways/pin.rb +5 -0
  17. data/lib/active_merchant/billing/gateways/quickpay.rb +3 -3
  18. data/lib/active_merchant/billing/gateways/qvalent.rb +44 -1
  19. data/lib/active_merchant/billing/gateways/safe_charge.rb +211 -0
  20. data/lib/active_merchant/billing/gateways/sage_pay.rb +8 -5
  21. data/lib/active_merchant/billing/gateways/stripe.rb +6 -1
  22. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +45 -11
  23. data/lib/active_merchant/billing/gateways/wepay.rb +1 -0
  24. data/lib/active_merchant/billing/gateways/worldpay.rb +8 -3
  25. data/lib/active_merchant/posts_data.rb +1 -1
  26. data/lib/active_merchant/version.rb +1 -1
  27. metadata +4 -3
  28. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1974da9f685774b95695ff91430141a164281f64
4
- data.tar.gz: 5a547f1ff49dcf3d3ef6089d92636f0c92ac47f3
3
+ metadata.gz: 6a6b4a889b1f046f131622178e728d71cf0e1a41
4
+ data.tar.gz: 5e6eba2ad428363e4024c789e32ce348fef7b4b6
5
5
  SHA512:
6
- metadata.gz: 2beea9543a20c61f6549a94d71a6c6d73962cdc0ca21548d378a4ffbf26ade9df8b0cb0d7cb14b7f1355d4999625e9cae82fe3a87572070a18fcbcb81168f83b
7
- data.tar.gz: 1624eb5f2942edcff808a3ac70fb693c0c7f617c229e384d279f2e8b517558243bd2943a808198b59f378d7f8752cb2807d84717a3b72fa9119caf2e809656a0
6
+ metadata.gz: e5221e56fe77524519e0cfe91ddf61603f97a2826b1773f3b65dd1c7048ca531311cb8b6f3fc3c918e2d54cdbe4d3ff1c8a662595c1bc24adc958acf9b6a12e3
7
+ data.tar.gz: 6bd1d7b0d877748404c56f3fe62b0e806997e3c17161f72e79f11a769564e7028c1356b969a960912d290fbf7f6faabb5a686efcd07bfd707ab0a196eb78f939
data/CHANGELOG CHANGED
@@ -2,6 +2,33 @@
2
2
 
3
3
  == HEAD
4
4
 
5
+ == Version 1.65.0 (April 26, 2017)
6
+ * Adyen: Add Adyen v18 gateway [adyenpayments] #2272
7
+ * Authorize.Net: Force refund of unsettled payments via void [bizla] #2399
8
+ * Barclays ePDQ: removed because it has been replaced by a new API [bdewater] #2331
9
+ * Beanstream: Map ISO province codes for US and CA [shasum] #2396
10
+ * Braintree Blue: Change :full_refund option to :force_full_refund_if_unsettled [bizla] #2403
11
+ * Braintree Blue: Force refund of unsettled payments via void [bizla] #2398
12
+ * Checkout V2: Fix sandbox URL [nicolas-maalouf-cko] #2391
13
+ * Checkout V2: Fix success_from not properly checking two possible success codes [davidsantoso]
14
+ * Cybersource: Rescue XML parse exception [shasum] #2380
15
+ * GlobalCollect: Make message and error reporting more robust [curiousepic] #2370
16
+ * GlobalCollect: Set REJECTED refunds as unsuccessful transactions [davidsantoso] #2365
17
+ * GlobalCollect: Truncate firstName field to 15 characters [davidsantoso]
18
+ * JetPay: Pass down authorization payment method token to refund a capture [davidsantoso]
19
+ * Openpay: Support card points [shasum] #2401
20
+ * Orbital: Don't send CVV indicator if CVV is not present [curiousepic] #2368
21
+ * PayU LATAM: Fix incorrect capture method definition [davidsantoso]
22
+ * Payeezy: Support dynamic soft descriptors [shasum] #2384
23
+ * Pin: Add metadata optional field [shasum] #2363
24
+ * Qvalent: Add soft descriptor fields. Add authorize, capture, and void [davidsantoso]
25
+ * SafeCharge: Add gateway [davidsantoso]
26
+ * SagePay: Support Repeat transactions [curiousepic] #2395
27
+ * Stripe: Support custom application in X-Stripe-Client-User-Agent header [davidsantoso]
28
+ * TransFirst Transaction Express: Support ACH [curiousepic] #2389
29
+ * WePay: Support unique_id for idempotent transactions [shasum] #2367
30
+ * Worldpay: Force refund of unsettled payments via void [bizla] #2402
31
+
5
32
  == Version 1.64.0 (March 6, 2017)
6
33
  * Authorize.net: Allow settings to be passed for CIM purchases [fwilkins] #2300
7
34
  * Authorize.net: Use new `unsupported_feature` standard error code [jasonwebster] #2322
data/README.md CHANGED
@@ -91,7 +91,6 @@ The [ActiveMerchant Wiki](http://github.com/activemerchant/active_merchant/wikis
91
91
  * [Bank Frick](http://www.bankfrickacquiring.com/) - LI, US
92
92
  * [Banwire](http://www.banwire.com/) - MX
93
93
  * [Barclays ePDQ Extra Plus](http://www.barclaycard.co.uk/business/accepting-payments/epdq-ecomm/) - GB
94
- * [Barclays ePDQ MPI](http://www.barclaycard.co.uk/business/accepting-payments/epdq-mpi/) - GB
95
94
  * [Be2Bill](http://www.be2bill.com/) - FR
96
95
  * [Beanstream.com](http://www.beanstream.com/) - CA, US
97
96
  * [BluePay](http://www.bluepay.com/) - US
@@ -0,0 +1,228 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class AdyenGateway < Gateway
4
+
5
+ # we recommend setting up merchant-specific endpoints.
6
+ # https://docs.adyen.com/developers/api-manual#apiendpoints
7
+ self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/v18'
8
+ self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/v18'
9
+
10
+ self.supported_countries = ['AD','AE','AF','AG','AI','AL','AM','AO','AQ','AR','AS','AT','AU','AW','AX','AZ','BA','BB','BD','BE','BF','BG','BH','BI','BJ','BL','BM','BN','BO','BQ','BR','BS','BT','BV','BW','BY','BZ','CA','CC','CD','CF','CG','CH','CI','CK','CL','CM','CN','CO','CR','CU','CV','CW','CX','CY','CZ','DE','DJ','DK','DM','DO','DZ','EC','EE','EG','EH','ER','ES','ET','FI','FJ','FK','FM','FO','FR','GA','GB','GD','GE','GF','GG','GH','GI','GL','GM','GN','GP','GQ','GR','GS','GT','GU','GW','GY','HK','HM','HN','HR','HT','HU','ID','IE','IL','IM','IN','IO','IQ','IR','IS','IT','JE','JM','JO','JP','KE','KG','KH','KI','KM','KN','KP','KR','KW','KY','KZ','LA','LB','LC','LI','LK','LR','LS','LT','LU','LV','LY','MA','MC','MD','ME','MF','MG','MH','MK','ML','MM','MN','MO','MP','MQ','MR','MS','MT','MU','MV','MW','MX','MY','MZ','NA','NC','NE','NF','NG','NI','NL','NO','NP','NR','NU','NZ','OM','PA','PE','PF','PG','PH','PK','PL','PM','PN','PR','PS','PT','PW','PY','QA','RE','RO','RS','RU','RW','SA','SB','SC','SD','SE','SG','SH','SI','SJ','SK','SL','SM','SN','SO','SR','SS','ST','SV','SX','SY','SZ','TC','TD','TF','TG','TH','TJ','TK','TL','TM','TN','TO','TR','TT','TV','TW','TZ','UA','UG','UM','US','UY','UZ','VA','VC','VE','VG','VI','VN','VU','WF','WS','YE','YT','ZA','ZM','ZW']
11
+ self.default_currency = 'USD'
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover]
13
+
14
+ self.money_format = :cents
15
+
16
+ self.homepage_url = 'https://www.adyen.com/'
17
+ self.display_name = 'Adyen'
18
+
19
+ STANDARD_ERROR_CODE_MAPPING = {
20
+ '101' => STANDARD_ERROR_CODE[:incorrect_number],
21
+ '103' => STANDARD_ERROR_CODE[:invalid_cvc],
22
+ '131' => STANDARD_ERROR_CODE[:incorrect_address],
23
+ '132' => STANDARD_ERROR_CODE[:incorrect_address],
24
+ '133' => STANDARD_ERROR_CODE[:incorrect_address],
25
+ '134' => STANDARD_ERROR_CODE[:incorrect_address],
26
+ '135' => STANDARD_ERROR_CODE[:incorrect_address],
27
+ }
28
+
29
+ def initialize(options={})
30
+ requires!(options, :username, :password, :merchant_account)
31
+ @username, @password, @merchant_account = options.values_at(:username, :password, :merchant_account)
32
+ super
33
+ end
34
+
35
+ def purchase(money, payment, options={})
36
+ MultiResponse.run do |r|
37
+ r.process{authorize(money, payment, options)}
38
+ r.process{capture(money, r.authorization, options)}
39
+ end
40
+ end
41
+
42
+ def authorize(money, payment, options={})
43
+ requires!(options, :reference)
44
+ post = init_post(options)
45
+ add_invoice(post, money, options)
46
+ add_payment(post, payment)
47
+ add_extra_data(post, options)
48
+ add_address(post, options)
49
+ commit('authorise', post)
50
+ end
51
+
52
+ def capture(money, authorization, options={})
53
+ post = init_post(options)
54
+ add_invoice_for_modification(post, money, authorization, options)
55
+ add_references(post, authorization, options)
56
+ commit('capture', post)
57
+ end
58
+
59
+ def refund(money, authorization, options={})
60
+ post = init_post(options)
61
+ add_invoice_for_modification(post, money, authorization, options)
62
+ add_references(post, authorization, options)
63
+ commit('refund', post)
64
+ end
65
+
66
+ def void(authorization, options={})
67
+ post = init_post(options)
68
+ add_references(post, authorization, options)
69
+ commit('cancel', 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((Authorization: Basic )\w+), '\1[FILTERED]').
86
+ gsub(%r(("number\\?":\\?")[^"]*)i, '\1[FILTERED]').
87
+ gsub(%r(("cvc\\?":\\?")[^"]*)i, '\1[FILTERED]')
88
+ end
89
+
90
+ private
91
+
92
+ def add_extra_data(post, options)
93
+ post[:shopperEmail] = options[:shopper_email] if options[:shopper_email]
94
+ post[:shopperIP] = options[:shopper_ip] if options[:shopper_ip]
95
+ post[:shopperReference] = options[:shopper_reference] if options[:shopper_reference]
96
+ post[:fraudOffset] = options[:fraud_offset] if options[:fraud_offset]
97
+ post[:selectedBrand] = options[:selected_brand] if options[:selected_brand]
98
+ post[:deliveryDate] = options[:delivery_date] if options[:delivery_date]
99
+ post[:merchantOrderReference] = options[:merchant_order_reference] if options[:merchant_order_reference]
100
+ post[:shopperInteraction] = options[:shopper_interaction] if options[:shopper_interaction]
101
+ end
102
+
103
+ def add_address(post, options)
104
+ return unless post[:card] && post[:card].kind_of?(Hash)
105
+ if address = options[:billing_address] || options[:address]
106
+ post[:card][:billingAddress] = {}
107
+ post[:card][:billingAddress][:street] = address[:address1] if address[:address1]
108
+ post[:card][:billingAddress][:houseNumberOrName] = address[:address2] if address[:address2]
109
+ post[:card][:billingAddress][:postalCode] = address[:zip] if address[:zip]
110
+ post[:card][:billingAddress][:city] = address[:city] if address[:city]
111
+ post[:card][:billingAddress][:stateOrProvince] = address[:state] if address[:state]
112
+ post[:card][:billingAddress][:country] = address[:country] if address[:country]
113
+ end
114
+ end
115
+
116
+ def add_invoice(post, money, options)
117
+ amount = {
118
+ value: amount(money),
119
+ currency: options[:currency] || currency(money)
120
+ }
121
+ post[:reference] = options[:reference]
122
+ post[:amount] = amount
123
+ end
124
+
125
+ def add_invoice_for_modification(post, money, authorization, options)
126
+ amount = {
127
+ value: amount(money),
128
+ currency: options[:currency] || currency(money)
129
+ }
130
+ post[:modificationAmount] = amount
131
+ end
132
+
133
+ def add_payment(post, payment)
134
+ card = {
135
+ expiryMonth: payment.month,
136
+ expiryYear: payment.year,
137
+ holderName: payment.name,
138
+ number: payment.number,
139
+ cvc: payment.verification_value
140
+ }
141
+ card.delete_if{|k,v| v.blank? }
142
+ requires!(card, :expiryMonth, :expiryYear, :holderName, :number, :cvc)
143
+ post[:card] = card
144
+ end
145
+
146
+ def add_references(post, authorization, options = {})
147
+ post[:originalReference] = authorization
148
+ post[:reference] = options[:reference]
149
+ end
150
+
151
+ def parse(body)
152
+ return {} if body.blank?
153
+ JSON.parse(body)
154
+ end
155
+
156
+ def commit(action, parameters)
157
+ url = (test? ? test_url : live_url)
158
+
159
+ begin
160
+ raw_response = ssl_post("#{url}/#{action.to_s}", post_data(action, parameters), request_headers)
161
+ response = parse(raw_response)
162
+ rescue ResponseError => e
163
+ raw_response = e.response.body
164
+ response = parse(raw_response)
165
+ end
166
+
167
+ success = success_from(action, response)
168
+ Response.new(
169
+ success,
170
+ message_from(action, response),
171
+ response,
172
+ authorization: authorization_from(response),
173
+ test: test?,
174
+ error_code: success ? nil : error_code_from(response)
175
+ )
176
+
177
+ end
178
+
179
+ def basic_auth
180
+ Base64.strict_encode64("#{@username}:#{@password}")
181
+ end
182
+
183
+ def request_headers
184
+ {
185
+ "Content-Type" => "application/json",
186
+ "Authorization" => "Basic #{basic_auth}"
187
+ }
188
+ end
189
+
190
+ def success_from(action, response)
191
+ case action.to_s
192
+ when 'authorise'
193
+ ['Authorised', 'Received', 'RedirectShopper'].include?(response['resultCode'])
194
+ when 'capture', 'refund', 'cancel'
195
+ response['response'] == "[#{action}-received]"
196
+ else
197
+ false
198
+ end
199
+ end
200
+
201
+ def message_from(action, response)
202
+ case action.to_s
203
+ when 'authorise'
204
+ response['refusalReason'] || response['resultCode'] || response['message']
205
+ when 'capture', 'refund', 'cancel'
206
+ response['response'] || response['message']
207
+ end
208
+ end
209
+
210
+ def authorization_from(response)
211
+ response['pspReference']
212
+ end
213
+
214
+ def init_post(options = {})
215
+ {merchantAccount: options[:merchant_account] || @merchant_account}
216
+ end
217
+
218
+ def post_data(action, parameters = {})
219
+ JSON.generate(parameters)
220
+ end
221
+
222
+ def error_code_from(response)
223
+ STANDARD_ERROR_CODE_MAPPING[response['errorCode']]
224
+ end
225
+
226
+ end
227
+ end
228
+ end
@@ -92,6 +92,7 @@ module ActiveMerchant
92
92
  APPLE_PAY_DATA_DESCRIPTOR = "COMMON.APPLE.INAPP.PAYMENT"
93
93
 
94
94
  PAYMENT_METHOD_NOT_SUPPORTED_ERROR = "155"
95
+ INELIGIBLE_FOR_ISSUING_CREDIT_ERROR = "54"
95
96
 
96
97
  def initialize(options={})
97
98
  requires!(options, :login, :password)
@@ -131,11 +132,18 @@ module ActiveMerchant
131
132
  end
132
133
 
133
134
  def refund(amount, authorization, options={})
134
- if auth_was_for_cim?(authorization)
135
+ response = if auth_was_for_cim?(authorization)
135
136
  cim_refund(amount, authorization, options)
136
137
  else
137
138
  normal_refund(amount, authorization, options)
138
139
  end
140
+
141
+ return response if response.success?
142
+ return response unless options[:force_full_refund_if_unsettled]
143
+
144
+ if response.params["response_reason_code"] == INELIGIBLE_FOR_ISSUING_CREDIT_ERROR
145
+ void(authorization, options)
146
+ end
139
147
  end
140
148
 
141
149
  def void(authorization, options={})
@@ -59,6 +59,72 @@ module ActiveMerchant #:nodoc:
59
59
  :cancel => 'C'
60
60
  }
61
61
 
62
+ STATES = {
63
+ "ALBERTA" => "AB",
64
+ "BRITISH COLUMBIA" => "BC",
65
+ "MANITOBA" => "MB",
66
+ "NEW BRUNSWICK" => "NB",
67
+ "NEWFOUNDLAND AND LABRADOR" => "NL",
68
+ "NOVA SCOTIA" => "NS",
69
+ "ONTARIO" => "ON",
70
+ "PRINCE EDWARD ISLAND" => "PE",
71
+ "QUEBEC" => "QC",
72
+ "SASKATCHEWAN" => "SK",
73
+ "NORTHWEST TERRITORIES" => "NT",
74
+ "NUNAVUT" => "NU",
75
+ "YUKON" => "YT",
76
+ "ALABAMA" => "AL",
77
+ "ALASKA" => "AK",
78
+ "ARIZONA" => "AZ",
79
+ "ARKANSAS" => "AR",
80
+ "CALIFORNIA" => "CA",
81
+ "COLORADO" => "CO",
82
+ "CONNECTICUT" => "CT",
83
+ "DELAWARE" => "DE",
84
+ "FLORIDA" => "FL",
85
+ "GEORGIA" => "GA",
86
+ "HAWAII" => "HI",
87
+ "IDAHO" => "ID",
88
+ "ILLINOIS" => "IL",
89
+ "INDIANA" => "IN",
90
+ "IOWA" => "IA",
91
+ "KANSAS" => "KS",
92
+ "KENTUCKY" => "KY",
93
+ "LOUISIANA" => "LA",
94
+ "MAINE" => "ME",
95
+ "MARYLAND" => "MD",
96
+ "MASSACHUSETTS" => "MA",
97
+ "MICHIGAN" => "MI",
98
+ "MINNESOTA" => "MN",
99
+ "MISSISSIPPI" => "MS",
100
+ "MISSOURI" => "MO",
101
+ "MONTANA" => "MT",
102
+ "NEBRASKA" => "NE",
103
+ "NEVADA" => "NV",
104
+ "NEW HAMPSHIRE" => "NH",
105
+ "NEW JERSEY" => "NJ",
106
+ "NEW MEXICO" => "NM",
107
+ "NEW YORK" => "NY",
108
+ "NORTH CAROLINA" => "NC",
109
+ "NORTH DAKOTA" => "ND",
110
+ "OHIO" => "OH",
111
+ "OKLAHOMA" => "OK",
112
+ "OREGON" => "OR",
113
+ "PENNSYLVANIA" => "PA",
114
+ "RHODE ISLAND" => "RI",
115
+ "SOUTH CAROLINA" => "SC",
116
+ "SOUTH DAKOTA" => "SD",
117
+ "TENNESSEE" => "TN",
118
+ "TEXAS" => "TX",
119
+ "UTAH" => "UT",
120
+ "VERMONT" => "VT",
121
+ "VIRGINIA" => "VA",
122
+ "WASHINGTON" => "WA",
123
+ "WEST VIRGINIA" => "WV",
124
+ "WISCONSIN" => "WI",
125
+ "WYOMING" => "WY"
126
+ }
127
+
62
128
  def self.included(base)
63
129
  base.default_currency = 'CAD'
64
130
 
@@ -161,7 +227,7 @@ module ActiveMerchant #:nodoc:
161
227
  post[:ordAddress1] = billing_address[:address1]
162
228
  post[:ordAddress2] = billing_address[:address2]
163
229
  post[:ordCity] = billing_address[:city]
164
- post[:ordProvince] = billing_address[:state]
230
+ post[:ordProvince] = STATES[billing_address[:state].upcase] || billing_address[:state] if billing_address[:state]
165
231
  post[:ordPostalCode] = billing_address[:zip]
166
232
  post[:ordCountry] = billing_address[:country]
167
233
  end
@@ -172,7 +238,7 @@ module ActiveMerchant #:nodoc:
172
238
  post[:shipAddress1] = shipping_address[:address1]
173
239
  post[:shipAddress2] = shipping_address[:address2]
174
240
  post[:shipCity] = shipping_address[:city]
175
- post[:shipProvince] = shipping_address[:state]
241
+ post[:shipProvince] = STATES[shipping_address[:state].upcase] || shipping_address[:state] if shipping_address[:state]
176
242
  post[:shipPostalCode] = shipping_address[:zip]
177
243
  post[:shipCountry] = shipping_address[:country]
178
244
  post[:shippingMethod] = shipping_address[:shipping_method]
@@ -42,6 +42,10 @@ module ActiveMerchant #:nodoc:
42
42
 
43
43
  self.display_name = 'Braintree (Blue Platform)'
44
44
 
45
+ ERROR_CODES = {
46
+ cannot_refund_if_unsettled: 91506
47
+ }
48
+
45
49
  def initialize(options = {})
46
50
  requires!(options, :merchant_id, :public_key, :private_key)
47
51
  @merchant_account_id = options[:merchant_account_id]
@@ -90,11 +94,15 @@ module ActiveMerchant #:nodoc:
90
94
  def refund(*args)
91
95
  # legacy signature: #refund(transaction_id, options = {})
92
96
  # new signature: #refund(money, transaction_id, options = {})
93
- money, transaction_id, _ = extract_refund_args(args)
97
+ money, transaction_id, options = extract_refund_args(args)
94
98
  money = amount(money).to_s if money
95
99
 
96
100
  commit do
97
- response_from_result(@braintree_gateway.transaction.refund(transaction_id, money))
101
+ response = response_from_result(@braintree_gateway.transaction.refund(transaction_id, money))
102
+ return response if response.success?
103
+ return response unless options[:force_full_refund_if_unsettled]
104
+
105
+ void(transaction_id) if response.message =~ /#{ERROR_CODES[:cannot_refund_if_unsettled]}/
98
106
  end
99
107
  end
100
108
 
@@ -4,7 +4,7 @@ module ActiveMerchant #:nodoc:
4
4
  self.display_name = "Checkout.com V2 Gateway"
5
5
  self.homepage_url = "https://www.checkout.com/"
6
6
  self.live_url = "https://api2.checkout.com/v2"
7
- self.test_url = "http://sandbox.checkout.com/api2/v2"
7
+ self.test_url = "https://sandbox.checkout.com/api2/v2"
8
8
 
9
9
  self.supported_countries = ['AD', '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"
@@ -165,7 +165,7 @@ module ActiveMerchant #:nodoc:
165
165
  end
166
166
 
167
167
  def success_from(response)
168
- response["responseCode"] == ("10000" || "10100")
168
+ response["responseCode"] == "10000" || response["responseCode"] == "10100"
169
169
  end
170
170
 
171
171
  def message_from(succeeded, response)