ideal 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/.travis.yml +10 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +24 -0
- data/LICENSE +22 -0
- data/README.textile +204 -0
- data/Rakefile +19 -0
- data/ideal.gemspec +28 -0
- data/init.rb +1 -0
- data/lib/ideal/acquirers.rb +23 -0
- data/lib/ideal/gateway.rb +425 -0
- data/lib/ideal/response.rb +250 -0
- data/lib/ideal/version.rb +5 -0
- data/lib/ideal.rb +12 -0
- data/test/fixtures.yml +12 -0
- data/test/gateway_test.rb +766 -0
- data/test/helper.rb +36 -0
- data/test/remote_test.rb +203 -0
- metadata +132 -0
@@ -0,0 +1,766 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path('../helper', __FILE__)
|
4
|
+
|
5
|
+
module IdealTestCases
|
6
|
+
# This method is called at the end of the file when all fixture data has been loaded.
|
7
|
+
def self.setup_ideal_gateway!
|
8
|
+
Ideal::Gateway.class_eval do
|
9
|
+
self.acquirer = :ing
|
10
|
+
|
11
|
+
self.merchant_id = '123456789'
|
12
|
+
|
13
|
+
self.passphrase = 'passphrase'
|
14
|
+
self.private_key = PRIVATE_KEY
|
15
|
+
self.private_certificate = PRIVATE_CERTIFICATE
|
16
|
+
self.ideal_certificate = IDEAL_CERTIFICATE
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
VALID_PURCHASE_OPTIONS = {
|
21
|
+
:issuer_id => '0001',
|
22
|
+
:expiration_period => 'PT10M',
|
23
|
+
:return_url => 'http://return_to.example.com',
|
24
|
+
:order_id => '12345678901',
|
25
|
+
:description => 'A classic Dutch windmill',
|
26
|
+
:entrance_code => '1234'
|
27
|
+
}
|
28
|
+
|
29
|
+
class ClassMethodsTest < Test::Unit::TestCase
|
30
|
+
def test_merchant_id
|
31
|
+
assert_equal Ideal::Gateway.merchant_id, '123456789'
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_verify_live_url_for_ing
|
35
|
+
Ideal::Gateway.acquirer = :ing
|
36
|
+
assert_equal 'https://ideal.secure-ing.com/ideal/iDeal', Ideal::Gateway.live_url
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_verify_live_url_for_rabobank
|
40
|
+
Ideal::Gateway.acquirer = :rabobank
|
41
|
+
assert_equal 'https://ideal.rabobank.nl/ideal/iDeal', Ideal::Gateway.live_url
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_verify_live_urls_for_abnamro
|
45
|
+
Ideal::Gateway.acquirer = :abnamro
|
46
|
+
assert_equal 'https://idealm.abnamro.nl/nl/issuerInformation/getIssuerInformation.xml', Ideal::Gateway.live_directory_url
|
47
|
+
assert_equal 'https://idealm.abnamro.nl/nl/acquirerTrxRegistration/getAcquirerTrxRegistration.xml', Ideal::Gateway.live_transaction_url
|
48
|
+
assert_equal 'https://idealm.abnamro.nl/nl/acquirerStatusInquiry/getAcquirerStatusInquiry.xml', Ideal::Gateway.live_status_url
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_does_not_allow_configuration_of_unknown_acquirers
|
52
|
+
assert_raise(ArgumentError) do
|
53
|
+
Ideal::Gateway.acquirer = :unknown
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_acquirers
|
58
|
+
assert_equal 'https://ideal.rabobank.nl/ideal/iDeal', Ideal::Gateway.acquirers['rabobank']['live_url']
|
59
|
+
assert_equal 'https://ideal.secure-ing.com/ideal/iDeal', Ideal::Gateway.acquirers['ing']['live_url']
|
60
|
+
assert_equal 'https://idealm.abnamro.nl/nl/acquirerTrxRegistration/getAcquirerTrxRegistration.xml', Ideal::Gateway.acquirers['abnamro']['live_transaction_url']
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_private_certificate_returns_a_loaded_Certificate_instance
|
64
|
+
assert_equal Ideal::Gateway.private_certificate.to_text,
|
65
|
+
OpenSSL::X509::Certificate.new(PRIVATE_CERTIFICATE).to_text
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_private_key_returns_a_loaded_PKey_RSA_instance
|
69
|
+
assert_equal Ideal::Gateway.private_key.to_text,
|
70
|
+
OpenSSL::PKey::RSA.new(PRIVATE_KEY, Ideal::Gateway.passphrase).to_text
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_ideal_certificate_returns_a_loaded_Certificate_instance
|
74
|
+
assert_equal Ideal::Gateway.ideal_certificate.to_text,
|
75
|
+
OpenSSL::X509::Certificate.new(IDEAL_CERTIFICATE).to_text
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class GeneralTest < Test::Unit::TestCase
|
80
|
+
def setup
|
81
|
+
@gateway = Ideal::Gateway.new
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_optional_initialization_options
|
85
|
+
assert_equal 0, Ideal::Gateway.new.sub_id
|
86
|
+
assert_equal 1, Ideal::Gateway.new(:sub_id => 1).sub_id
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_returns_the_test_url_when_in_the_test_env
|
90
|
+
Ideal::Gateway.acquirer = :ing
|
91
|
+
Ideal::Gateway.environment = :test
|
92
|
+
assert_equal Ideal::Gateway.test_url, @gateway.send(:request_url, :directory)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_returns_the_live_url_when_not_in_the_test_env
|
96
|
+
Ideal::Gateway.acquirer = :ing
|
97
|
+
Ideal::Gateway.environment = :live
|
98
|
+
assert_equal Ideal::Gateway.live_url, @gateway.send(:request_url, :directory)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_returns_the_special_urls_for_abnamro_when_in_the_test_env
|
102
|
+
Ideal::Gateway.acquirer = :abnamro
|
103
|
+
Ideal::Gateway.environment = :test
|
104
|
+
assert_equal Ideal::Gateway.test_directory_url, @gateway.send(:request_url, :directory)
|
105
|
+
assert_equal Ideal::Gateway.test_transaction_url, @gateway.send(:request_url, :transaction)
|
106
|
+
assert_equal Ideal::Gateway.test_status_url, @gateway.send(:request_url, :status)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_returns_created_at_timestamp
|
110
|
+
timestamp = '2001-12-17T09:30:47.000Z'
|
111
|
+
Time.any_instance.stubs(:gmtime).returns(DateTime.parse(timestamp))
|
112
|
+
|
113
|
+
assert_equal timestamp, @gateway.send(:created_at_timestamp)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_ruby_to_java_keys_conversion
|
117
|
+
keys = [
|
118
|
+
[:acquirer_transaction_request, 'AcquirerTrxReq'],
|
119
|
+
[:acquirer_status_request, 'AcquirerStatusReq'],
|
120
|
+
[:directory_request, 'DirectoryReq'],
|
121
|
+
[:created_at, 'createDateTimeStamp'],
|
122
|
+
[:issuer, 'Issuer'],
|
123
|
+
[:merchant, 'Merchant'],
|
124
|
+
[:transaction, 'Transaction'],
|
125
|
+
[:issuer_id, 'issuerID'],
|
126
|
+
[:merchant_id, 'merchantID'],
|
127
|
+
[:sub_id, 'subID'],
|
128
|
+
[:token_code, 'tokenCode'],
|
129
|
+
[:merchant_return_url, 'merchantReturnURL'],
|
130
|
+
[:purchase_id, 'purchaseID'],
|
131
|
+
[:expiration_period, 'expirationPeriod'],
|
132
|
+
[:entrance_code, 'entranceCode']
|
133
|
+
]
|
134
|
+
|
135
|
+
keys.each do |key, expected_key|
|
136
|
+
assert_equal expected_key, @gateway.send(:javaize_key, key)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_does_not_convert_unknown_key_to_java_key
|
141
|
+
assert_equal 'not_a_registered_key', @gateway.send(:javaize_key, :not_a_registered_key)
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_token_generation
|
145
|
+
expected_token = Digest::SHA1.hexdigest(OpenSSL::X509::Certificate.new(PRIVATE_CERTIFICATE).to_der).upcase
|
146
|
+
assert_equal expected_token, @gateway.send(:token)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_token_code_generation
|
150
|
+
Ideal::Gateway.acquirer = :ing
|
151
|
+
message = "Top\tsecret\tman.\nI could tell you, but then I'd have to kill you…"
|
152
|
+
stripped_message = message.gsub(/\s/m, '')
|
153
|
+
|
154
|
+
sha1 = OpenSSL::Digest::SHA1.new
|
155
|
+
OpenSSL::Digest::SHA1.stubs(:new).returns(sha1)
|
156
|
+
|
157
|
+
signature = Ideal::Gateway.private_key.sign(sha1, stripped_message)
|
158
|
+
encoded_signature = Base64.encode64(signature).strip.gsub(/\n/, '')
|
159
|
+
|
160
|
+
assert_equal encoded_signature, @gateway.send(:token_code, message)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_token_code_generation_on_abn_amro
|
164
|
+
Ideal::Gateway.acquirer = :abnamro
|
165
|
+
message = "Top\tsecret\tman.\nI could tell you, but\r then I'd have to kill you…"
|
166
|
+
stripped_message = message.gsub(/(\f|\n|\r|\t|\v)/m, '')
|
167
|
+
|
168
|
+
sha1 = OpenSSL::Digest::SHA1.new
|
169
|
+
OpenSSL::Digest::SHA1.stubs(:new).returns(sha1)
|
170
|
+
|
171
|
+
signature = Ideal::Gateway.private_key.sign(sha1, stripped_message)
|
172
|
+
encoded_signature = Base64.encode64(signature).strip.gsub(/\n/, '')
|
173
|
+
|
174
|
+
assert_equal encoded_signature, @gateway.send(:token_code, message)
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_posts_data_with_ssl_to_request_url_and_return_the_correct_response_for_test
|
178
|
+
Ideal::Gateway.environment = :test
|
179
|
+
Ideal::Response.expects(:new).with('response', :test => true)
|
180
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:directory), 'data').returns('response')
|
181
|
+
@gateway.send(:post_data, @gateway.request_url(:directory), 'data', Ideal::Response)
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_posts_data_with_ssl_to_request_url_and_return_the_correct_response_for_live
|
185
|
+
Ideal::Gateway.environment = :live
|
186
|
+
Ideal::Response.expects(:new).with('response', :test => false)
|
187
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:directory), 'data').returns('response')
|
188
|
+
@gateway.send(:post_data, @gateway.request_url(:directory), 'data', Ideal::Response)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
class XMLBuildingTest < Test::Unit::TestCase
|
193
|
+
def setup
|
194
|
+
@gateway = Ideal::Gateway.new
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_contains_correct_info_in_root_node
|
198
|
+
expected_xml = Builder::XmlMarkup.new
|
199
|
+
expected_xml.instruct!
|
200
|
+
expected_xml.tag!('AcquirerTrxReq', 'xmlns' => Ideal::Gateway::XML_NAMESPACE, 'version' => Ideal::Gateway::API_VERSION) {}
|
201
|
+
|
202
|
+
assert_equal expected_xml.target!, @gateway.send(:xml_for, :acquirer_transaction_request, [])
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_creates_correct_xml_with_java_keys_from_array_with_ruby_keys
|
206
|
+
expected_xml = Builder::XmlMarkup.new
|
207
|
+
expected_xml.instruct!
|
208
|
+
expected_xml.tag!('AcquirerTrxReq', 'xmlns' => Ideal::Gateway::XML_NAMESPACE, 'version' => Ideal::Gateway::API_VERSION) do
|
209
|
+
expected_xml.tag!('a_parent') do
|
210
|
+
expected_xml.tag!('createDateTimeStamp', '2009-01-26')
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
assert_equal expected_xml.target!, @gateway.send(:xml_for, :acquirer_transaction_request, [[:a_parent, [[:created_at, '2009-01-26']]]])
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
class RequestBodyBuildingTest < Test::Unit::TestCase
|
219
|
+
def setup
|
220
|
+
@gateway = Ideal::Gateway.new
|
221
|
+
|
222
|
+
@gateway.stubs(:created_at_timestamp).returns('created_at_timestamp')
|
223
|
+
@gateway.stubs(:token).returns('the_token')
|
224
|
+
@gateway.stubs(:token_code)
|
225
|
+
|
226
|
+
@transaction_id = '0001023456789112'
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_build_transaction_request_body_raises_ArgumentError_with_missing_required_options
|
230
|
+
options = VALID_PURCHASE_OPTIONS.dup
|
231
|
+
options.keys.each do |key|
|
232
|
+
options.delete(key)
|
233
|
+
|
234
|
+
assert_raise(ArgumentError) do
|
235
|
+
@gateway.send(:build_transaction_request_body, 100, options)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
def test_valid_with_valid_options
|
241
|
+
assert_not_nil @gateway.send(:build_transaction_request_body, 4321, VALID_PURCHASE_OPTIONS)
|
242
|
+
end
|
243
|
+
|
244
|
+
def test_checks_that_fields_are_not_too_long
|
245
|
+
assert_raise ArgumentError do
|
246
|
+
@gateway.send(:build_transaction_request_body, 1234567890123, VALID_PURCHASE_OPTIONS) # 13 chars
|
247
|
+
end
|
248
|
+
|
249
|
+
[
|
250
|
+
[:order_id, '12345678901234567'], # 17 chars,
|
251
|
+
[:description, '123456789012345678901234567890123'], # 33 chars
|
252
|
+
[:entrance_code, '12345678901234567890123456789012345678901'] # 41
|
253
|
+
].each do |key, value|
|
254
|
+
options = VALID_PURCHASE_OPTIONS.dup
|
255
|
+
options[key] = value
|
256
|
+
|
257
|
+
assert_raise ArgumentError do
|
258
|
+
@gateway.send(:build_transaction_request_body, 4321, options)
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def test_checks_that_fields_do_not_contain_diacritical_characters
|
264
|
+
assert_raise ArgumentError do
|
265
|
+
@gateway.send(:build_transaction_request_body, 'graphème', VALID_PURCHASE_OPTIONS)
|
266
|
+
end
|
267
|
+
|
268
|
+
[:order_id, :description, :entrance_code].each do |key, value|
|
269
|
+
options = VALID_PURCHASE_OPTIONS.dup
|
270
|
+
options[key] = 'graphème'
|
271
|
+
|
272
|
+
assert_raise ArgumentError do
|
273
|
+
@gateway.send(:build_transaction_request_body, 4321, options)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
def test_builds_a_transaction_request_body
|
279
|
+
money = 4321
|
280
|
+
|
281
|
+
message = 'created_at_timestamp' +
|
282
|
+
VALID_PURCHASE_OPTIONS[:issuer_id] +
|
283
|
+
Ideal::Gateway.merchant_id +
|
284
|
+
@gateway.sub_id.to_s +
|
285
|
+
VALID_PURCHASE_OPTIONS[:return_url] +
|
286
|
+
VALID_PURCHASE_OPTIONS[:order_id] +
|
287
|
+
money.to_s +
|
288
|
+
Ideal::Gateway::CURRENCY +
|
289
|
+
Ideal::Gateway::LANGUAGE +
|
290
|
+
VALID_PURCHASE_OPTIONS[:description] +
|
291
|
+
VALID_PURCHASE_OPTIONS[:entrance_code]
|
292
|
+
|
293
|
+
@gateway.expects(:token_code).with(message).returns('the_token_code')
|
294
|
+
|
295
|
+
@gateway.expects(:xml_for).with(:acquirer_transaction_request, [
|
296
|
+
[:created_at, 'created_at_timestamp'],
|
297
|
+
[:issuer, [[:issuer_id, VALID_PURCHASE_OPTIONS[:issuer_id]]]],
|
298
|
+
|
299
|
+
[:merchant, [
|
300
|
+
[:merchant_id, Ideal::Gateway.merchant_id],
|
301
|
+
[:sub_id, @gateway.sub_id],
|
302
|
+
[:authentication, Ideal::Gateway::AUTHENTICATION_TYPE],
|
303
|
+
[:token, 'the_token'],
|
304
|
+
[:token_code, 'the_token_code'],
|
305
|
+
[:merchant_return_url, VALID_PURCHASE_OPTIONS[:return_url]]
|
306
|
+
]],
|
307
|
+
|
308
|
+
[:transaction, [
|
309
|
+
[:purchase_id, VALID_PURCHASE_OPTIONS[:order_id]],
|
310
|
+
[:amount, money],
|
311
|
+
[:currency, Ideal::Gateway::CURRENCY],
|
312
|
+
[:expiration_period, VALID_PURCHASE_OPTIONS[:expiration_period]],
|
313
|
+
[:language, Ideal::Gateway::LANGUAGE],
|
314
|
+
[:description, VALID_PURCHASE_OPTIONS[:description]],
|
315
|
+
[:entrance_code, VALID_PURCHASE_OPTIONS[:entrance_code]]
|
316
|
+
]]
|
317
|
+
])
|
318
|
+
|
319
|
+
@gateway.send(:build_transaction_request_body, money, VALID_PURCHASE_OPTIONS)
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_builds_a_directory_request_body
|
323
|
+
message = 'created_at_timestamp' + Ideal::Gateway.merchant_id + @gateway.sub_id.to_s
|
324
|
+
@gateway.expects(:token_code).with(message).returns('the_token_code')
|
325
|
+
|
326
|
+
@gateway.expects(:xml_for).with(:directory_request, [
|
327
|
+
[:created_at, 'created_at_timestamp'],
|
328
|
+
[:merchant, [
|
329
|
+
[:merchant_id, Ideal::Gateway.merchant_id],
|
330
|
+
[:sub_id, @gateway.sub_id],
|
331
|
+
[:authentication, Ideal::Gateway::AUTHENTICATION_TYPE],
|
332
|
+
[:token, 'the_token'],
|
333
|
+
[:token_code, 'the_token_code']
|
334
|
+
]]
|
335
|
+
])
|
336
|
+
|
337
|
+
@gateway.send(:build_directory_request_body)
|
338
|
+
end
|
339
|
+
|
340
|
+
def test_builds_a_status_request_body_raises_ArgumentError_with_missing_required_options
|
341
|
+
assert_raise(ArgumentError) do
|
342
|
+
@gateway.send(:build_status_request_body, {})
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_builds_a_status_request_body
|
347
|
+
options = { :transaction_id => @transaction_id }
|
348
|
+
|
349
|
+
message = 'created_at_timestamp' + Ideal::Gateway.merchant_id + @gateway.sub_id.to_s + options[:transaction_id]
|
350
|
+
@gateway.expects(:token_code).with(message).returns('the_token_code')
|
351
|
+
|
352
|
+
@gateway.expects(:xml_for).with(:acquirer_status_request, [
|
353
|
+
[:created_at, 'created_at_timestamp'],
|
354
|
+
[:merchant, [
|
355
|
+
[:merchant_id, Ideal::Gateway.merchant_id],
|
356
|
+
[:sub_id, @gateway.sub_id],
|
357
|
+
[:authentication, Ideal::Gateway::AUTHENTICATION_TYPE],
|
358
|
+
[:token, 'the_token'],
|
359
|
+
[:token_code, 'the_token_code']
|
360
|
+
]],
|
361
|
+
|
362
|
+
[:transaction, [
|
363
|
+
[:transaction_id, options[:transaction_id]]
|
364
|
+
]],
|
365
|
+
])
|
366
|
+
|
367
|
+
@gateway.send(:build_status_request_body, options)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
class GeneralResponseTest < Test::Unit::TestCase
|
372
|
+
def test_resturns_if_it_is_a_test_request
|
373
|
+
assert Ideal::Response.new(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS, :test => true).test?
|
374
|
+
|
375
|
+
assert !Ideal::Response.new(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS, :test => false).test?
|
376
|
+
assert !Ideal::Response.new(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS).test?
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
class SuccessfulResponseTest < Test::Unit::TestCase
|
381
|
+
def setup
|
382
|
+
@response = Ideal::Response.new(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS)
|
383
|
+
end
|
384
|
+
|
385
|
+
def test_initializes_with_only_response_body
|
386
|
+
assert_equal REXML::Document.new(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS).root.to_s,
|
387
|
+
@response.instance_variable_get(:@response).to_s
|
388
|
+
end
|
389
|
+
|
390
|
+
def test_successful
|
391
|
+
assert @response.success?
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_returns_no_error_messages
|
395
|
+
assert_nil @response.error_message
|
396
|
+
end
|
397
|
+
|
398
|
+
def test_returns_no_error_code
|
399
|
+
assert_nil @response.error_code
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
class ErrorResponseTest < Test::Unit::TestCase
|
404
|
+
def setup
|
405
|
+
@response = Ideal::Response.new(ERROR_RESPONSE)
|
406
|
+
end
|
407
|
+
|
408
|
+
def test_unsuccessful
|
409
|
+
assert !@response.success?
|
410
|
+
end
|
411
|
+
|
412
|
+
def test_returns_error_messages
|
413
|
+
assert_equal 'Failure in system', @response.error_message
|
414
|
+
assert_equal 'System generating error: issuer', @response.error_details
|
415
|
+
assert_equal 'Betalen met iDEAL is nu niet mogelijk.', @response.consumer_error_message
|
416
|
+
end
|
417
|
+
|
418
|
+
def test_returns_error_code
|
419
|
+
assert_equal 'SO1000', @response.error_code
|
420
|
+
end
|
421
|
+
|
422
|
+
def test_returns_error_type
|
423
|
+
[
|
424
|
+
['IX1000', :xml],
|
425
|
+
['SO1000', :system],
|
426
|
+
['SE2000', :security],
|
427
|
+
['BR1200', :value],
|
428
|
+
['AP1000', :application]
|
429
|
+
].each do |code, type|
|
430
|
+
@response.stubs(:error_code).returns(code)
|
431
|
+
assert_equal type, @response.error_type
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
class DirectoryTest < Test::Unit::TestCase
|
437
|
+
def setup
|
438
|
+
@gateway = Ideal::Gateway.new
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_returns_a_list_with_only_one_issuer
|
442
|
+
@gateway.stubs(:build_directory_request_body).returns('the request body')
|
443
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:directory), 'the request body').returns(DIRECTORY_RESPONSE_WITH_ONE_ISSUER)
|
444
|
+
|
445
|
+
expected_issuers = [{ :id => '1006', :name => 'ABN AMRO Bank' }]
|
446
|
+
|
447
|
+
directory_response = @gateway.issuers
|
448
|
+
assert_instance_of Ideal::DirectoryResponse, directory_response
|
449
|
+
assert_equal expected_issuers, directory_response.list
|
450
|
+
end
|
451
|
+
|
452
|
+
def test_returns_list_of_issuers_from_response
|
453
|
+
@gateway.stubs(:build_directory_request_body).returns('the request body')
|
454
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:directory), 'the request body').returns(DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS)
|
455
|
+
|
456
|
+
expected_issuers = [
|
457
|
+
{ :id => '1006', :name => 'ABN AMRO Bank' },
|
458
|
+
{ :id => '1003', :name => 'Postbank' },
|
459
|
+
{ :id => '1005', :name => 'Rabobank' },
|
460
|
+
{ :id => '1017', :name => 'Asr bank' },
|
461
|
+
{ :id => '1023', :name => 'Van Lanschot' }
|
462
|
+
]
|
463
|
+
|
464
|
+
directory_response = @gateway.issuers
|
465
|
+
assert_instance_of Ideal::DirectoryResponse, directory_response
|
466
|
+
assert_equal expected_issuers, directory_response.list
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
class SetupPurchaseTest < Test::Unit::TestCase
|
471
|
+
def setup
|
472
|
+
@gateway = Ideal::Gateway.new
|
473
|
+
|
474
|
+
@gateway.stubs(:build_transaction_request_body).with(4321, VALID_PURCHASE_OPTIONS).returns('the request body')
|
475
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:transaction), 'the request body').returns(ACQUIRER_TRANSACTION_RESPONSE)
|
476
|
+
|
477
|
+
@setup_purchase_response = @gateway.setup_purchase(4321, VALID_PURCHASE_OPTIONS)
|
478
|
+
end
|
479
|
+
|
480
|
+
def test_setup_purchase_returns_IdealTransactionResponse
|
481
|
+
assert_instance_of Ideal::TransactionResponse, @setup_purchase_response
|
482
|
+
end
|
483
|
+
|
484
|
+
def test_setup_purchase_returns_response_with_service_url
|
485
|
+
assert_equal 'https://ideal.example.com/long_service_url?X009=BETAAL&X010=20', @setup_purchase_response.service_url
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_setup_purchase_returns_response_with_transaction_and_order_ids
|
489
|
+
assert_equal '0001023456789112', @setup_purchase_response.transaction_id
|
490
|
+
assert_equal 'iDEAL-aankoop 21', @setup_purchase_response.order_id
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
494
|
+
class CapturePurchaseTest < Test::Unit::TestCase
|
495
|
+
def setup
|
496
|
+
@gateway = Ideal::Gateway.new
|
497
|
+
|
498
|
+
@gateway.stubs(:build_status_request_body).
|
499
|
+
with(:transaction_id => '0001023456789112').returns('the request body')
|
500
|
+
end
|
501
|
+
|
502
|
+
def test_setup_purchase_returns_IdealStatusResponse
|
503
|
+
expects_request_and_returns ACQUIRER_SUCCEEDED_STATUS_RESPONSE
|
504
|
+
assert_instance_of Ideal::StatusResponse, @gateway.capture('0001023456789112')
|
505
|
+
end
|
506
|
+
|
507
|
+
# Because we don't have a real private key and certificate we stub
|
508
|
+
# verified? to return true. However, this is properly tested in the remote
|
509
|
+
# tests.
|
510
|
+
def test_capture_of_successful_payment
|
511
|
+
Ideal::StatusResponse.any_instance.stubs(:verified?).returns(true)
|
512
|
+
|
513
|
+
expects_request_and_returns ACQUIRER_SUCCEEDED_STATUS_RESPONSE
|
514
|
+
capture_response = @gateway.capture('0001023456789112')
|
515
|
+
|
516
|
+
assert capture_response.success?
|
517
|
+
end
|
518
|
+
|
519
|
+
def test_capture_of_failed_payment
|
520
|
+
expects_request_and_returns ACQUIRER_FAILED_STATUS_RESPONSE
|
521
|
+
capture_response = @gateway.capture('0001023456789112')
|
522
|
+
|
523
|
+
assert !capture_response.success?
|
524
|
+
end
|
525
|
+
|
526
|
+
def test_capture_of_successful_payment_but_message_does_not_match_signature
|
527
|
+
expects_request_and_returns ACQUIRER_SUCCEEDED_BUT_WRONG_SIGNATURE_STATUS_RESPONSE
|
528
|
+
capture_response = @gateway.capture('0001023456789112')
|
529
|
+
|
530
|
+
assert !capture_response.success?
|
531
|
+
end
|
532
|
+
|
533
|
+
def test_capture_of_consumer_fields
|
534
|
+
expects_request_and_returns ACQUIRER_SUCCEEDED_STATUS_RESPONSE
|
535
|
+
capture_response = @gateway.capture('0001023456789112')
|
536
|
+
|
537
|
+
assert_equal '0949298989', capture_response.consumer_account_number
|
538
|
+
assert_equal 'Onderheuvel', capture_response.consumer_name
|
539
|
+
assert_equal 'DEN HAAG', capture_response.consumer_city
|
540
|
+
end
|
541
|
+
|
542
|
+
def test_returns_status
|
543
|
+
response = Ideal::StatusResponse.new(ACQUIRER_SUCCEEDED_STATUS_RESPONSE)
|
544
|
+
[
|
545
|
+
['Success', :success],
|
546
|
+
['Cancelled', :cancelled],
|
547
|
+
['Expired', :expired],
|
548
|
+
['Open', :open],
|
549
|
+
['Failure', :failure]
|
550
|
+
].each do |raw_status, expected_status|
|
551
|
+
response.stubs(:text).with("//status").returns(raw_status)
|
552
|
+
assert_equal expected_status, response.status
|
553
|
+
end
|
554
|
+
end
|
555
|
+
|
556
|
+
private
|
557
|
+
|
558
|
+
def expects_request_and_returns(str)
|
559
|
+
@gateway.expects(:ssl_post).with(@gateway.request_url(:status), 'the request body').returns(str)
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
###
|
564
|
+
#
|
565
|
+
# Fixture data
|
566
|
+
#
|
567
|
+
|
568
|
+
PRIVATE_CERTIFICATE = %{-----BEGIN CERTIFICATE-----
|
569
|
+
MIIC+zCCAmSgAwIBAgIJALVAygHjnd8ZMA0GCSqGSIb3DQEBBQUAMF0xCzAJBgNV
|
570
|
+
BAYTAk5MMRYwFAYDVQQIEw1Ob29yZC1Ib2xsYW5kMRIwEAYDVQQHEwlBbXN0ZXJk
|
571
|
+
YW0xIjAgBgNVBAoTGWlERUFMIEFjdGl2ZU1lcmNoYW50IFRlc3QwHhcNMDkwMTMw
|
572
|
+
MTMxNzQ5WhcNMjQxMjExMDM1MjI5WjBdMQswCQYDVQQGEwJOTDEWMBQGA1UECBMN
|
573
|
+
Tm9vcmQtSG9sbGFuZDESMBAGA1UEBxMJQW1zdGVyZGFtMSIwIAYDVQQKExlpREVB
|
574
|
+
TCBBY3RpdmVNZXJjaGFudCBUZXN0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
|
575
|
+
gQDmBpi+RVvZBA01kdP5lV5bDzu6Jp1zy78qhxxwlG8WMdUh0Qtg0kkYmeThFPoh
|
576
|
+
2c3BYuFQ+AA6f1R0Spb+hTNrBxkZaRnHCfMMD9LXquFjJ/lvSGnwkjvBmGzyTPZ1
|
577
|
+
LIunpejm8hH0MJPqpp5AIeXjp1mv7BXA9y0FqObrrLAPaQIDAQABo4HCMIG/MB0G
|
578
|
+
A1UdDgQWBBTLqGWJt5+Ri6vrOpqGZhINbRtXczCBjwYDVR0jBIGHMIGEgBTLqGWJ
|
579
|
+
t5+Ri6vrOpqGZhINbRtXc6FhpF8wXTELMAkGA1UEBhMCTkwxFjAUBgNVBAgTDU5v
|
580
|
+
b3JkLUhvbGxhbmQxEjAQBgNVBAcTCUFtc3RlcmRhbTEiMCAGA1UEChMZaURFQUwg
|
581
|
+
QWN0aXZlTWVyY2hhbnQgVGVzdIIJALVAygHjnd8ZMAwGA1UdEwQFMAMBAf8wDQYJ
|
582
|
+
KoZIhvcNAQEFBQADgYEAGtgkmME9tgaxJIU3T7v1/xbKr6A/iwmt3sCmfJEl4Pty
|
583
|
+
aUGaHFy1KB7xmkna8gomxMWL2zZkdv4t1iGeuVCl9n77SL3MzapotdeNNqahblcN
|
584
|
+
RBshYCpWpsQQPF45/R5Xp7rXWWsjxgip7qTBNpgTx+Z/VKQpuQsFjYCYq4UCf2Y=
|
585
|
+
-----END CERTIFICATE-----}
|
586
|
+
|
587
|
+
PRIVATE_KEY = %{-----BEGIN RSA PRIVATE KEY-----
|
588
|
+
MIICXAIBAAKBgQDmBpi+RVvZBA01kdP5lV5bDzu6Jp1zy78qhxxwlG8WMdUh0Qtg
|
589
|
+
0kkYmeThFPoh2c3BYuFQ+AA6f1R0Spb+hTNrBxkZaRnHCfMMD9LXquFjJ/lvSGnw
|
590
|
+
kjvBmGzyTPZ1LIunpejm8hH0MJPqpp5AIeXjp1mv7BXA9y0FqObrrLAPaQIDAQAB
|
591
|
+
AoGAfkccz0ewVoDc5424+wk/FWpVdaoBQjKWLbiiqkMygNK2mKv0PSD0M+c4OUCU
|
592
|
+
2MSDKikoXJTpOzPvny/bmLpzMMGn9YJiWEQ5WdaTdppffdylfGPBZXZkt5M9nxJA
|
593
|
+
NL3fPT79R79mkCF8cgNUbLtNL4woSoFKwRHDU2CGvtTbxqkCQQD+TY1sGJv1VTQi
|
594
|
+
MYYx3FlEOqw3jp/2q7QluTDDGmvmVOSFnAPfmX0rKEtnBmG4ID7IaG+IQFthDudL
|
595
|
+
3trqGQdTAkEA54+RxyCZiXDfkh23cD0QaApZaBuk6cKkx6qeFxeg1T+/idGgtWJI
|
596
|
+
Qg3i9fHzOIFUXwk51R3xh5IimvMJZ9Ii0wJAb7yrsx9tB3MUoSGZkTb8kholqZOl
|
597
|
+
fcEcOqcQYemuF1qdvoc6vHi4osnlt7L6JOkmLPCWcQu2GwNtZczZ65pruQJBAJ3p
|
598
|
+
vbtzUuF01TKbC18Cda7N5/zkZUl5ENCNXTRYS7lBuQhuqc8okChjufSJpJlTMUuC
|
599
|
+
Sis5OV5/3ROYTEC+ADsCQCwq6VQ1kXRrM+3tkMwi2rZi73dsFVuFx8crlBOmvhkD
|
600
|
+
U7Ar9bW13qhBeH9px8RCRDMWTGQcxY/C/TEQc/qvhkI=
|
601
|
+
-----END RSA PRIVATE KEY-----}
|
602
|
+
|
603
|
+
IDEAL_CERTIFICATE = %{-----BEGIN CERTIFICATE-----
|
604
|
+
MIIEAzCCA3CgAwIBAgIQMIEnzk1UPrPDLOY9dc2cUjANBgkqhkiG9w0BAQUFADBf
|
605
|
+
MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXUlNBIERhdGEgU2VjdXJpdHksIEluYy4x
|
606
|
+
LjAsBgNVBAsTJVNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
|
607
|
+
HhcNMDQwNjA4MDAwMDAwWhcNMDUwNjA4MjM1OTU5WjCBvDELMAkGA1UEBhMCTkwx
|
608
|
+
FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxEjAQBgNVBAcUCUFtc3RlcmRhbTEbMBkG
|
609
|
+
A1UEChQSQUJOIEFNUk8gQmFuayBOLlYuMRYwFAYDVQQLFA1JTi9OUy9FLUlORlJB
|
610
|
+
MTMwMQYDVQQLFCpUZXJtcyBvZiB1c2UgYXQgd3d3LnZlcmlzaWduLmNvbS9ycGEg
|
611
|
+
KGMpMDAxFzAVBgNVBAMUDnd3dy5hYm5hbXJvLm5sMIGfMA0GCSqGSIb3DQEBAQUA
|
612
|
+
A4GNADCBiQKBgQD1hPZlFD01ZdQu0GVLkUQ7tOwtVw/jmZ1Axu8v+3bxrjKX9Qi1
|
613
|
+
0w6EIadCXScDMmhCstExVptaTEQ5hG3DedV2IpMcwe93B1lfyviNYlmc/XIol1B7
|
614
|
+
PM70mI9XUTYAoJpquEv8AaupRO+hgxQlz3FACHINJxEIMgdxa1iyoJfCKwIDAQAB
|
615
|
+
o4IBZDCCAWAwCQYDVR0TBAIwADALBgNVHQ8EBAMCBaAwPAYDVR0fBDUwMzAxoC+g
|
616
|
+
LYYraHR0cDovL2NybC52ZXJpc2lnbi5jb20vUlNBU2VjdXJlU2VydmVyLmNybDBE
|
617
|
+
BgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
|
618
|
+
d3d3LnZlcmlzaWduLmNvbS9ycGEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
|
619
|
+
BwMCMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AudmVy
|
620
|
+
aXNpZ24uY29tMG0GCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAh
|
621
|
+
MB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dv
|
622
|
+
LnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMA0GCSqGSIb3DQEBBQUAA34AY7BYsNvj
|
623
|
+
i5fjnEHPlGOd2yxseCHU54HDPPCZOoP9a9kVWGX8tuj2b1oeiOsIbI1viIo+O4eQ
|
624
|
+
ilZjTJIlLOkXk6uE8vQGjZy0BUnjNPkXOQGkTyj4jDxZ2z+z9Vy8BwfothdcYbZK
|
625
|
+
48ZOp3u74DdEfQejNxBeqLODzrxQTV4=
|
626
|
+
-----END CERTIFICATE-----}
|
627
|
+
|
628
|
+
DIRECTORY_RESPONSE_WITH_ONE_ISSUER = %{<?xml version="1.0" encoding="UTF-8"?>
|
629
|
+
<DirectoryRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
630
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
631
|
+
<Acquirer>
|
632
|
+
<acquirerID>0245</acquirerID>
|
633
|
+
</Acquirer>
|
634
|
+
<Directory>
|
635
|
+
<directoryDateTimeStamp>2004-11-10T10:15:12.145Z</directoryDateTimeStamp>
|
636
|
+
<Issuer>
|
637
|
+
<issuerID>1006</issuerID>
|
638
|
+
<issuerName>ABN AMRO Bank</issuerName>
|
639
|
+
<issuerList>Short</issuerList>
|
640
|
+
</Issuer>
|
641
|
+
</Directory>
|
642
|
+
</DirectoryRes>}
|
643
|
+
|
644
|
+
DIRECTORY_RESPONSE_WITH_MULTIPLE_ISSUERS = %{<?xml version="1.0" encoding="UTF-8"?>
|
645
|
+
<DirectoryRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
646
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
647
|
+
<Acquirer>
|
648
|
+
<acquirerID>0245</acquirerID>
|
649
|
+
</Acquirer>
|
650
|
+
<Directory>
|
651
|
+
<directoryDateTimeStamp>2004-11-10T10:15:12.145Z</directoryDateTimeStamp>
|
652
|
+
<Issuer>
|
653
|
+
<issuerID>1006</issuerID>
|
654
|
+
<issuerName>ABN AMRO Bank</issuerName>
|
655
|
+
<issuerList>Short</issuerList>
|
656
|
+
</Issuer>
|
657
|
+
<Issuer>
|
658
|
+
<issuerID>1003</issuerID>
|
659
|
+
<issuerName>Postbank</issuerName>
|
660
|
+
<issuerList>Short</issuerList>
|
661
|
+
</Issuer>
|
662
|
+
<Issuer>
|
663
|
+
<issuerID>1005</issuerID>
|
664
|
+
<issuerName>Rabobank</issuerName>
|
665
|
+
<issuerList>Short</issuerList>
|
666
|
+
</Issuer>
|
667
|
+
<Issuer>
|
668
|
+
<issuerID>1017</issuerID>
|
669
|
+
<issuerName>Asr bank</issuerName>
|
670
|
+
<issuerList>Long</issuerList>
|
671
|
+
</Issuer>
|
672
|
+
<Issuer>
|
673
|
+
<issuerID>1023</issuerID>
|
674
|
+
<issuerName>Van Lanschot</issuerName>
|
675
|
+
<issuerList>Long</issuerList>
|
676
|
+
</Issuer>
|
677
|
+
</Directory>
|
678
|
+
</DirectoryRes>}
|
679
|
+
|
680
|
+
ACQUIRER_TRANSACTION_RESPONSE = %{<?xml version="1.0" encoding="UTF-8"?>
|
681
|
+
<AcquirerTrxRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
682
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
683
|
+
<Acquirer>
|
684
|
+
<acquirerID>1545</acquirerID>
|
685
|
+
</Acquirer>
|
686
|
+
<Issuer>
|
687
|
+
<issuerAuthenticationURL>https://ideal.example.com/long_service_url?X009=BETAAL&X010=20</issuerAuthenticationURL>
|
688
|
+
</Issuer>
|
689
|
+
<Transaction>
|
690
|
+
<transactionID>0001023456789112</transactionID>
|
691
|
+
<purchaseID>iDEAL-aankoop 21</purchaseID>
|
692
|
+
</Transaction>
|
693
|
+
</AcquirerTrxRes>}
|
694
|
+
|
695
|
+
ACQUIRER_SUCCEEDED_STATUS_RESPONSE = %{<?xml version="1.0" encoding="UTF-8"?>
|
696
|
+
<AcquirerStatusRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
697
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
698
|
+
<Acquirer>
|
699
|
+
<acquirerID>1234</acquirerID>
|
700
|
+
</Acquirer>
|
701
|
+
<Transaction>
|
702
|
+
<transactionID>0001023456789112</transactionID>
|
703
|
+
<status>Success</status>
|
704
|
+
<consumerName>Onderheuvel</consumerName>
|
705
|
+
<consumerAccountNumber>0949298989</consumerAccountNumber>
|
706
|
+
<consumerCity>DEN HAAG</consumerCity>
|
707
|
+
</Transaction>
|
708
|
+
<Signature>
|
709
|
+
<signatureValue>db82/jpJRvKQKoiDvu33X0yoDAQpayJOaW2Y8zbR1qk1i3epvTXi+6g+QVBY93YzGv4w+Va+vL3uNmzyRjYsm2309d1CWFVsn5Mk24NLSvhYfwVHEpznyMqizALEVUNSoiSHRkZUDfXowBAyLT/tQVGbuUuBj+TKblY826nRa7U=</signatureValue>
|
710
|
+
<fingerprint>1E15A00E3D7DF085768749D4ABBA3284794D8AE9</fingerprint>
|
711
|
+
</Signature>
|
712
|
+
</AcquirerStatusRes>}
|
713
|
+
|
714
|
+
ACQUIRER_SUCCEEDED_BUT_WRONG_SIGNATURE_STATUS_RESPONSE = %{<?xml version="1.0" encoding="UTF-8"?>
|
715
|
+
<AcquirerStatusRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
716
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
717
|
+
<Acquirer>
|
718
|
+
<acquirerID>1234</acquirerID>
|
719
|
+
</Acquirer>
|
720
|
+
<Transaction>
|
721
|
+
<transactionID>0001023456789112</transactionID>
|
722
|
+
<status>Success</status>
|
723
|
+
<consumerName>Onderheuvel</consumerName>
|
724
|
+
<consumerAccountNumber>0949298989</consumerAccountNumber>
|
725
|
+
<consumerCity>DEN HAAG</consumerCity>
|
726
|
+
</Transaction>
|
727
|
+
<Signature>
|
728
|
+
<signatureValue>WRONG</signatureValue>
|
729
|
+
<fingerprint>1E15A00E3D7DF085768749D4ABBA3284794D8AE9</fingerprint>
|
730
|
+
</Signature>
|
731
|
+
</AcquirerStatusRes>}
|
732
|
+
|
733
|
+
ACQUIRER_FAILED_STATUS_RESPONSE = %{<?xml version="1.0" encoding="UTF-8"?>
|
734
|
+
<AcquirerStatusRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
735
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
736
|
+
<Acquirer>
|
737
|
+
<acquirerID>1234</acquirerID>
|
738
|
+
</Acquirer>
|
739
|
+
<Transaction>
|
740
|
+
<transactionID>0001023456789112</transactionID>
|
741
|
+
<status>Failed</status>
|
742
|
+
<consumerName>Onderheuvel</consumerName>
|
743
|
+
<consumerAccountNumber>0949298989</consumerAccountNumber>
|
744
|
+
<consumerCity>DEN HAAG</consumerCity>
|
745
|
+
</Transaction>
|
746
|
+
<Signature>
|
747
|
+
<signatureValue>db82/jpJRvKQKoiDvu33X0yoDAQpayJOaW2Y8zbR1qk1i3epvTXi+6g+QVBY93YzGv4w+Va+vL3uNmzyRjYsm2309d1CWFVsn5Mk24NLSvhYfwVHEpznyMqizALEVUNSoiSHRkZUDfXowBAyLT/tQVGbuUuBj+TKblY826nRa7U=</signatureValue>
|
748
|
+
<fingerprint>1E15A00E3D7DF085768749D4ABBA3284794D8AE9</fingerprint>
|
749
|
+
</Signature>
|
750
|
+
</AcquirerStatusRes>}
|
751
|
+
|
752
|
+
ERROR_RESPONSE = %{<?xml version="1.0" encoding="UTF-8"?>
|
753
|
+
<ErrorRes xmlns="http://www.idealdesk.com/Message" version="1.1.0">
|
754
|
+
<createDateTimeStamp>2001-12-17T09:30:47.0Z</createDateTimeStamp>
|
755
|
+
<Error>
|
756
|
+
<errorCode>SO1000</errorCode>
|
757
|
+
<errorMessage>Failure in system</errorMessage>
|
758
|
+
<errorDetail>System generating error: issuer</errorDetail>
|
759
|
+
<suggestedAction></suggestedAction>
|
760
|
+
<suggestedExpirationPeriod></suggestedExpirationPeriod>
|
761
|
+
<consumerMessage>Betalen met iDEAL is nu niet mogelijk.</consumerMessage>
|
762
|
+
</Error>
|
763
|
+
</ErrorRes>}
|
764
|
+
|
765
|
+
setup_ideal_gateway!
|
766
|
+
end
|