activemerchant 1.64.0 → 1.65.0

Sign up to get free protection for your applications and to get access to all the features.
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)