buckaruby 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9964baf09c9cec43bb7f60c48391d92a6a86bd444fc8203a7bf48aab2af40fa
4
- data.tar.gz: 78cfb8676c812e6aa3eece2c6e8d61236640b4dcbc57e957f522420cb3e423d5
3
+ metadata.gz: 3ab1013d3e02cc89d5b23dd6ae7add4b03b35a4a78074ff7f7e73933eef6ac08
4
+ data.tar.gz: 5091ec7ec11e9239e883438802f09771fbc1bcc0041408b03bf522462ea96882
5
5
  SHA512:
6
- metadata.gz: 0b4790df338a409eec26bf7d8b7149f655a40a43bfe6f425ffc69e861efc5b05f91b1a61582109c279fe2db4f9ebcdb32926582b28046bfb43149ef6cdc94bf9
7
- data.tar.gz: 253733f74de7c6abeecfdbb255bfc951a224466fe36d33fc9cd71329e681e7202ef8a7e172768c9d1688f49491f8040dfbda1988730d1f060084007a3d4555ef
6
+ metadata.gz: ed0d306e8879e68be60de01d0bac9c3f9644ebd64fa80a2d774db697c166b035b31c59edc91b8674fcc8a5fa5d4ca31725331ae03b63e52b2c5615ac6c147a55
7
+ data.tar.gz: 87274e74e76ab2772420acbf89919d74b1adc5f621ff0f40e077dcc2283f2863d2be53f63da91419e54dd52e863756e6be5e7120819e95b12e230c9b91972b21
@@ -15,6 +15,17 @@ Gemspec/RequiredRubyVersion:
15
15
  Enabled: false
16
16
 
17
17
 
18
+ Layout/LineLength:
19
+ Enabled: false
20
+
21
+
22
+ Lint/RaiseException:
23
+ Enabled: true
24
+
25
+ Lint/StructNewOverride:
26
+ Enabled: true
27
+
28
+
18
29
  Metrics/AbcSize:
19
30
  Max: 30
20
31
 
@@ -28,9 +39,6 @@ Metrics/ClassLength:
28
39
  Metrics/CyclomaticComplexity:
29
40
  Max: 9
30
41
 
31
- Metrics/LineLength:
32
- Enabled: false
33
-
34
42
  Metrics/MethodLength:
35
43
  Enabled: false
36
44
 
@@ -52,7 +60,7 @@ RSpec/DescribedClass:
52
60
  EnforcedStyle: explicit
53
61
 
54
62
  RSpec/ExampleLength:
55
- Max: 15
63
+ Max: 17
56
64
 
57
65
  RSpec/MultipleExpectations:
58
66
  Max: 12
@@ -77,6 +85,15 @@ Style/ExpandPathArguments:
77
85
  Style/GuardClause:
78
86
  Enabled: false
79
87
 
88
+ Style/HashEachMethods:
89
+ Enabled: true
90
+
91
+ Style/HashTransformKeys:
92
+ Enabled: true
93
+
94
+ Style/HashTransformValues:
95
+ Enabled: true
96
+
80
97
  Style/IfUnlessModifier:
81
98
  Enabled: false
82
99
 
@@ -7,5 +7,6 @@ before_install:
7
7
  rvm:
8
8
  - 2.3.8
9
9
  - 2.4.9
10
- - 2.5.7
11
- - 2.6.5
10
+ - 2.5.8
11
+ - 2.6.6
12
+ - 2.7.1
@@ -1,27 +1,33 @@
1
1
  # Buckaruby changelog
2
2
 
3
+ ## 1.4.0 (2020-04-06)
4
+
5
+ - Add `payment_methods` to retrieve all payment methods enabled by Buckaroo and supported by this library.
6
+ - Add `specify_transaction` to get a specification for setting up a transaction.
7
+ - Fix calcuating the signature for long responses and indexed fields.
8
+
3
9
  ## 1.3.1 (2019-12-04)
4
10
 
5
11
  - Update list of credit card transaction types.
6
12
 
7
13
  ## 1.3.0 (2019-10-08)
8
14
 
9
- - Added payment method American Express.
15
+ - Add payment method American Express.
10
16
 
11
17
  ## 1.2.0 (2019-08-06)
12
18
 
13
- - Added support for sending custom & additional variables with the request.
19
+ - Add support for sending custom & additional variables with the request.
14
20
 
15
21
  ## 1.1.1 (2018-11-30)
16
22
 
17
- - Added Handelsbanken to the list of iDEAL issuers.
23
+ - Add Handelsbanken to the list of iDEAL issuers.
18
24
 
19
25
  ## 1.1.0 (2018-06-01)
20
26
 
21
- - Added payment method iDEAL processing.
22
- - Added Moneyou to the list of iDEAL issuers.
23
- - Implemented refund transaction.
24
- - Implemented cancel transaction.
27
+ - Add payment method iDEAL processing.
28
+ - Add Moneyou to the list of iDEAL issuers.
29
+ - Implement refund transaction.
30
+ - Implement cancel transaction.
25
31
 
26
32
  ## 1.0.2 (2017-08-25)
27
33
 
data/Gemfile CHANGED
@@ -6,7 +6,7 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  group :test do
9
- gem 'rubocop', '~> 0.77.0'
10
- gem 'rubocop-performance', '~> 1.5.1'
11
- gem 'rubocop-rspec', '~> 1.37.0'
9
+ gem 'rubocop', '~> 0.81.0'
10
+ gem 'rubocop-performance', '~> 1.5.2'
11
+ gem 'rubocop-rspec', '~> 1.38.1'
12
12
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- buckaruby (1.3.1)
4
+ buckaruby (1.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -15,11 +15,12 @@ GEM
15
15
  hashdiff (1.0.0)
16
16
  jaro_winkler (1.5.4)
17
17
  parallel (1.19.1)
18
- parser (2.6.5.0)
18
+ parser (2.7.0.5)
19
19
  ast (~> 2.4.0)
20
20
  public_suffix (3.1.1)
21
21
  rainbow (3.0.0)
22
- rake (10.5.0)
22
+ rake (12.3.3)
23
+ rexml (3.2.4)
23
24
  rspec (3.8.0)
24
25
  rspec-core (~> 3.8.0)
25
26
  rspec-expectations (~> 3.8.0)
@@ -33,20 +34,21 @@ GEM
33
34
  diff-lcs (>= 1.2.0, < 2.0)
34
35
  rspec-support (~> 3.8.0)
35
36
  rspec-support (3.8.2)
36
- rubocop (0.77.0)
37
+ rubocop (0.81.0)
37
38
  jaro_winkler (~> 1.5.1)
38
39
  parallel (~> 1.10)
39
- parser (>= 2.6)
40
+ parser (>= 2.7.0.1)
40
41
  rainbow (>= 2.2.2, < 4.0)
42
+ rexml
41
43
  ruby-progressbar (~> 1.7)
42
- unicode-display_width (>= 1.4.0, < 1.7)
43
- rubocop-performance (1.5.1)
44
+ unicode-display_width (>= 1.4.0, < 2.0)
45
+ rubocop-performance (1.5.2)
44
46
  rubocop (>= 0.71.0)
45
- rubocop-rspec (1.37.0)
47
+ rubocop-rspec (1.38.1)
46
48
  rubocop (>= 0.68.1)
47
49
  ruby-progressbar (1.10.1)
48
50
  safe_yaml (1.0.5)
49
- unicode-display_width (1.6.0)
51
+ unicode-display_width (1.7.0)
50
52
  webmock (2.3.2)
51
53
  addressable (>= 2.3.6)
52
54
  crack (>= 0.3.2)
@@ -58,11 +60,11 @@ PLATFORMS
58
60
  DEPENDENCIES
59
61
  buckaruby!
60
62
  bundler (~> 1.7)
61
- rake (~> 10.0)
63
+ rake (~> 12.3)
62
64
  rspec (~> 3.0)
63
- rubocop (~> 0.77.0)
64
- rubocop-performance (~> 1.5.1)
65
- rubocop-rspec (~> 1.37.0)
65
+ rubocop (~> 0.81.0)
66
+ rubocop-performance (~> 1.5.2)
67
+ rubocop-rspec (~> 1.38.1)
66
68
  webmock (~> 2.3)
67
69
 
68
70
  BUNDLED WITH
data/README.md CHANGED
@@ -51,6 +51,14 @@ gateway = Buckaruby::Gateway.new(
51
51
 
52
52
  You can override the default mode with the parameter `mode`.
53
53
 
54
+ ### Payment methods
55
+
56
+ To retrieve the payment methods enabled in Buckaroo and supported by this library, you can use the method `payment_methods`. This method will return an array with all payment methods that can be used. See also `Buckaruby::PaymentMethod` for predefined constants.
57
+
58
+ ```ruby
59
+ payment_methods = gateway.payment_methods
60
+ ```
61
+
54
62
  ### Start transaction
55
63
 
56
64
  To start a new transaction, use the method `setup_transaction`:
@@ -203,6 +211,18 @@ puts response.custom[:foo]
203
211
  puts response.additional[:myreference]
204
212
  ````
205
213
 
214
+ ### Transaction request specification
215
+
216
+ To retrieve a specification about what needs to be sent with transaction request, you can use the method `specify_transaction`. The parameter `payment_method` is optional. When supplied it will only send the specification for that payment method.
217
+
218
+ This request is also used by the `payment_methods` method to determine which services (payment methods) are enabled in Buckaroo.
219
+
220
+ ```ruby
221
+ response = gateway.specify_transaction(payment_method: Buckaruby::PaymentMethod::IDEAL)
222
+ ```
223
+
224
+ See `Buckaruby::TransactionSpecificationResponse` for more details.
225
+
206
226
  ### Error handling
207
227
 
208
228
  When missing or invalid parameters are passed to any method, an `ArgumentError` will be raised.
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.required_ruby_version = ">= 2.0.0"
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.7"
25
- spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rake", "~> 12.3"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  spec.add_development_dependency "webmock", "~> 2.3"
28
28
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'buckaruby/support/case_insensitive_hash'
4
-
5
3
  require_relative 'buckaruby/action'
6
4
  require_relative 'buckaruby/currency'
7
5
  require_relative 'buckaruby/ideal'
@@ -13,6 +11,7 @@ require_relative 'buckaruby/transaction_type'
13
11
 
14
12
  require_relative 'buckaruby/configuration'
15
13
  require_relative 'buckaruby/exception'
14
+ require_relative 'buckaruby/field_mapper'
16
15
  require_relative 'buckaruby/gateway'
17
16
  require_relative 'buckaruby/iban'
18
17
  require_relative 'buckaruby/request'
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'support/case_insensitive_hash'
4
+
5
+ module Buckaruby
6
+ # Map NVP fields to hashes and multiple values (with index) to arrays.
7
+ class FieldMapper
8
+ def self.map_fields(params, prefix)
9
+ results = []
10
+ index = 1
11
+
12
+ loop do
13
+ index_key = "#{prefix}_#{index}_" # brq_services_1_
14
+ index_length = index_key.split(/_[0-9]*_/).length # 1
15
+
16
+ # Get all fields starting with prefix and index.
17
+ fields = params.select { |key| key.to_s.start_with?(index_key) }
18
+
19
+ break if fields.empty?
20
+
21
+ result = Support::CaseInsensitiveHash.new
22
+
23
+ fields.each do |key, value|
24
+ splitted_key = key.to_s.split(/_[0-9]*_/) # ["brq_services", "name"]
25
+ key_length = splitted_key.length # 2
26
+ new_key = splitted_key[index_length] # name
27
+
28
+ if key_length == index_length + 1
29
+ # Add normal fields to the result.
30
+ result[new_key] = value
31
+ else
32
+ # Recursively map indexed fields.
33
+ result[new_key] ||= begin
34
+ new_prefix = [index_key, new_key].join
35
+ map_fields(fields, new_prefix)
36
+ end
37
+ end
38
+ end
39
+
40
+ break if result.empty?
41
+
42
+ results << result
43
+
44
+ index += 1
45
+ end
46
+
47
+ results
48
+ end
49
+ end
50
+ end
@@ -17,7 +17,21 @@ module Buckaruby
17
17
  @logger = config.logger
18
18
  end
19
19
 
20
- # Get a list with payment issuers.
20
+ # Returns the payment methods enabled by Buckaroo and supported by this library.
21
+ def payment_methods
22
+ valid_payment_methods = [
23
+ PaymentMethod::IDEAL, PaymentMethod::IDEAL_PROCESSING, PaymentMethod::VISA, PaymentMethod::MASTER_CARD,
24
+ PaymentMethod::MAESTRO, PaymentMethod::AMERICAN_EXPRESS, PaymentMethod::SEPA_DIRECT_DEBIT,
25
+ PaymentMethod::PAYPAL, PaymentMethod::BANCONTACT_MISTER_CASH
26
+ ]
27
+
28
+ response = execute_request(:specify_transaction)
29
+ services = response.services.map { |service| service[:name] }
30
+
31
+ services & valid_payment_methods
32
+ end
33
+
34
+ # Get a list with payment issuers (currently only iDEAL).
21
35
  def issuers(payment_method)
22
36
  if payment_method != PaymentMethod::IDEAL && payment_method != PaymentMethod::IDEAL_PROCESSING
23
37
  raise ArgumentError, "Invalid payment method, only iDEAL is supported."
@@ -46,6 +60,13 @@ module Buckaruby
46
60
  execute_request(:recurrent_transaction, options)
47
61
  end
48
62
 
63
+ # Retrieve the specification for setting up a transaction.
64
+ def specify_transaction(options = {})
65
+ @logger.debug("[specify_transaction] options=#{options.inspect}")
66
+
67
+ execute_request(:specify_transaction, options)
68
+ end
69
+
49
70
  # Checks if a transaction is refundable.
50
71
  def refundable?(options = {})
51
72
  @logger.debug("[refundable?] options=#{options.inspect}")
@@ -150,8 +171,9 @@ module Buckaruby
150
171
  validate_amount!(options)
151
172
 
152
173
  valid_payment_methods = [
153
- PaymentMethod::IDEAL, PaymentMethod::IDEAL_PROCESSING, PaymentMethod::VISA, PaymentMethod::MASTER_CARD, PaymentMethod::MAESTRO,
154
- PaymentMethod::AMERICAN_EXPRESS, PaymentMethod::SEPA_DIRECT_DEBIT, PaymentMethod::PAYPAL, PaymentMethod::BANCONTACT_MISTER_CASH
174
+ PaymentMethod::IDEAL, PaymentMethod::IDEAL_PROCESSING, PaymentMethod::VISA, PaymentMethod::MASTER_CARD,
175
+ PaymentMethod::MAESTRO, PaymentMethod::AMERICAN_EXPRESS, PaymentMethod::SEPA_DIRECT_DEBIT,
176
+ PaymentMethod::PAYPAL, PaymentMethod::BANCONTACT_MISTER_CASH
155
177
  ]
156
178
  validate_payment_method!(options, valid_payment_methods)
157
179
 
@@ -223,7 +245,7 @@ module Buckaruby
223
245
  end
224
246
 
225
247
  # Build and execute a request.
226
- def execute_request(request_type, options)
248
+ def execute_request(request_type, options = {})
227
249
  request = build_request(request_type)
228
250
  response = request.execute(options)
229
251
 
@@ -232,6 +254,8 @@ module Buckaruby
232
254
  SetupTransactionResponse.new(response, config)
233
255
  when :recurrent_transaction
234
256
  RecurrentTransactionResponse.new(response, config)
257
+ when :specify_transaction
258
+ TransactionSpecificationResponse.new(response, config)
235
259
  when :refund_transaction
236
260
  RefundTransactionResponse.new(response, config)
237
261
  when :refund_info
@@ -250,6 +274,8 @@ module Buckaruby
250
274
  SetupTransactionRequest.new(config)
251
275
  when :recurrent_transaction
252
276
  RecurrentTransactionRequest.new(config)
277
+ when :specify_transaction
278
+ TransactionSpecificationRequest.new(config)
253
279
  when :refund_transaction
254
280
  RefundTransactionRequest.new(config)
255
281
  when :refund_info
@@ -4,6 +4,7 @@ module Buckaruby
4
4
  module Operation
5
5
  TRANSACTION_REQUEST = "TransactionRequest"
6
6
  TRANSACTION_STATUS = "TransactionStatus"
7
+ TRANSACTION_REQUEST_SPECIFICATION = "TransactionRequestSpecification"
7
8
  REFUND_INFO = "RefundInfo"
8
9
  CANCEL_TRANSACTION = "CancelTransaction"
9
10
  end
@@ -159,6 +159,30 @@ module Buckaruby
159
159
  end
160
160
  end
161
161
 
162
+ # Request for a creating a transaction specification.
163
+ class TransactionSpecificationRequest < Request
164
+ def execute(options)
165
+ super(options.merge(operation: Operation::TRANSACTION_REQUEST_SPECIFICATION))
166
+ end
167
+
168
+ def build_request_params(options)
169
+ params = {}
170
+
171
+ if options[:payment_method]
172
+ if options[:payment_method].respond_to?(:join)
173
+ params[:brq_services] = options[:payment_method].join(",")
174
+ else
175
+ params[:brq_services] = options[:payment_method]
176
+ end
177
+ end
178
+
179
+ params[:brq_latestversiononly] = "true"
180
+ params[:brq_culture] = options[:culture] || Language::DUTCH
181
+
182
+ params
183
+ end
184
+ end
185
+
162
186
  # Request for a creating a recurrent transaction.
163
187
  class RecurrentTransactionRequest < TransactionRequest
164
188
  def build_transaction_request_params(options)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'support/case_insensitive_hash'
4
+
3
5
  require 'cgi'
4
6
  require 'date'
5
7
 
@@ -83,7 +85,7 @@ module Buckaruby
83
85
  end
84
86
 
85
87
  def verify_signature!(response, config)
86
- if params[:brq_apiresult] != "Fail"
88
+ if params[:brq_apiresult].nil? || !params[:brq_apiresult].casecmp("fail").zero?
87
89
  sent_signature = params[:brq_signature]
88
90
  generated_signature = Signature.generate_signature(response, config)
89
91
 
@@ -348,4 +350,19 @@ module Buckaruby
348
350
  class CallbackResponse < Response
349
351
  include TransactionResponse
350
352
  end
353
+
354
+ # Response when retrieving the specification for a transaction.
355
+ class TransactionSpecificationResponse < ApiResponse
356
+ def services
357
+ @services ||= FieldMapper.map_fields(params, :brq_services)
358
+ end
359
+
360
+ def basic_fields
361
+ @basic_fields ||= FieldMapper.map_fields(params, :brq_basicfields)
362
+ end
363
+
364
+ def custom_parameters
365
+ @custom_parameters ||= FieldMapper.map_fields(params, :brq_customparameters)
366
+ end
367
+ end
351
368
  end
@@ -21,9 +21,25 @@ module Buckaruby
21
21
 
22
22
  def self.generate_signature_string(params, secret)
23
23
  sign_params = params.select { |key, _value| key.to_s.upcase.start_with?("BRQ_", "ADD_", "CUST_") && key.to_s.casecmp("BRQ_SIGNATURE").nonzero? }
24
- string = sign_params.sort_by { |p| p.first.downcase }.map { |param| "#{param[0]}=#{param[1]}" }.join
24
+ sign_params = order_signature_params(sign_params)
25
+
26
+ string = sign_params.map { |param| "#{param[0]}=#{param[1]}" }.join
25
27
  string << secret
26
28
  string
27
29
  end
30
+
31
+ # Excerpt from the Buckaroo documentation, chapter 4 'Digital Signature':
32
+ # In the payment engine, the used lexical sort algorithm uses the following order:
33
+ # symbols first, then numbers, then case insensitive letters. Also, a shorter string
34
+ # that is identical to the beginning of a longer string, comes before the longer string.
35
+ # Take for example the following, comma separated, list which has been sorted:
36
+ # a_a, a0, a0a, a1a, aaA, aab, aba, aCa
37
+ CHAR_ORDER = "_01234567890abcdefghijklmnopqrstuvwxyz"
38
+
39
+ def self.order_signature_params(params)
40
+ params.sort_by do |key, _value|
41
+ key.to_s.downcase.each_char.map { |c| CHAR_ORDER.index(c) }
42
+ end
43
+ end
28
44
  end
29
45
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Buckaruby
4
- VERSION = "1.3.1"
4
+ VERSION = "1.4.0"
5
5
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Buckaruby::FieldMapper do
6
+ describe '.map_fields' do
7
+ let(:fields) do
8
+ {
9
+ brq_services_1_description: "iDEAL",
10
+ brq_services_1_name: "ideal",
11
+ brq_services_1_version: "2",
12
+ brq_services_1_supportedcurrencies_1_code: "EUR",
13
+ brq_services_1_supportedcurrencies_1_isonumber: "978",
14
+ brq_services_1_supportedcurrencies_1_name: "Euro",
15
+ brq_services_2_description: "Visa",
16
+ brq_services_2_name: "visa",
17
+ brq_services_2_version: "1",
18
+ brq_services_2_supportedcurrencies_1_code: "GBP",
19
+ brq_services_2_supportedcurrencies_1_isonumber: "826",
20
+ brq_services_2_supportedcurrencies_1_name: "Pond",
21
+ brq_services_2_supportedcurrencies_2_code: "USD",
22
+ brq_services_2_supportedcurrencies_2_isonumber: "840",
23
+ brq_services_2_supportedcurrencies_2_name: "US Dollar"
24
+ }
25
+ end
26
+
27
+ it 'maps NVP fields to arrays and hashes' do
28
+ services = Buckaruby::FieldMapper.map_fields(fields, :brq_services)
29
+ expect(services).to be_an_instance_of(Array)
30
+ expect(services.count).to eq(2)
31
+
32
+ ideal = services.first
33
+ expect(ideal).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
34
+ expect(ideal[:description]).to eq("iDEAL")
35
+ expect(ideal[:name]).to eq("ideal")
36
+ expect(ideal[:version]).to eq("2")
37
+
38
+ visa = services.last
39
+ expect(visa).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
40
+ expect(visa[:description]).to eq("Visa")
41
+ expect(visa[:name]).to eq("visa")
42
+ expect(visa[:version]).to eq("1")
43
+ end
44
+
45
+ it 'maps NVP subfields to arrays and hashes' do
46
+ services = Buckaruby::FieldMapper.map_fields(fields, :brq_services)
47
+
48
+ currencies = services.first[:supportedcurrencies]
49
+ expect(currencies).to be_an_instance_of(Array)
50
+ expect(currencies.count).to eq(1)
51
+
52
+ currency = currencies.first
53
+ expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
54
+ expect(currency[:code]).to eq("EUR")
55
+ expect(currency[:isonumber]).to eq("978")
56
+ expect(currency[:name]).to eq("Euro")
57
+
58
+ currencies = services.last[:supportedcurrencies]
59
+ expect(currencies).to be_an_instance_of(Array)
60
+ expect(currencies.count).to eq(2)
61
+
62
+ currency = currencies.first
63
+ expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
64
+ expect(currency[:code]).to eq("GBP")
65
+ expect(currency[:isonumber]).to eq("826")
66
+ expect(currency[:name]).to eq("Pond")
67
+ end
68
+ end
69
+ end
@@ -29,6 +29,17 @@ RSpec.describe Buckaruby::Gateway do
29
29
 
30
30
  it { expect(subject).to be_an_instance_of(Buckaruby::Gateway) }
31
31
 
32
+ describe '#payment_methods' do
33
+ before do
34
+ stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequestSpecification").to_return(body: File.read("spec/fixtures/responses/specify_transaction_success.txt"))
35
+ end
36
+
37
+ it 'returns the payment methods enabled by Buckaroo and supported by this library' do
38
+ payment_methods = subject.payment_methods
39
+ expect(payment_methods).to eq([Buckaruby::PaymentMethod::IDEAL, Buckaruby::PaymentMethod::VISA])
40
+ end
41
+ end
42
+
32
43
  describe '#issuers' do
33
44
  context 'when no or false parameters are passed' do
34
45
  it 'raises an ArgumentError' do
@@ -215,7 +226,7 @@ RSpec.describe Buckaruby::Gateway do
215
226
  expect(response.custom[:quux]).to eq("42")
216
227
 
217
228
  expect(WebMock).to have_requested(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest")
218
- .with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&cust_foo=bar&cust_quux=42&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=f17162a56c850680dc99a46e31745c4ca5753711")
229
+ .with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&cust_foo=bar&cust_quux=42&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=8a51fbebb05a3f0ac47d92c509328baa1c7ea265")
219
230
  end
220
231
  end
221
232
 
@@ -227,7 +238,7 @@ RSpec.describe Buckaruby::Gateway do
227
238
  expect(response.additional[:myreference]).to eq("12345")
228
239
 
229
240
  expect(WebMock).to have_requested(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequest")
230
- .with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&add_myreference=12345&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=7ec12615ca594379709e743d4f6feb1a505cf3bb")
241
+ .with(body: "brq_websitekey=12345678&brq_payment_method=ideal&brq_culture=nl-NL&brq_currency=EUR&brq_amount=10.0&brq_invoicenumber=12345&brq_service_ideal_action=Pay&brq_service_ideal_issuer=ABNANL2A&brq_service_ideal_version=2&brq_return=http%3A%2F%2Fwww.return.url%2F&add_myreference=12345&add_buckaruby=Buckaruby+#{Buckaruby::VERSION}&brq_signature=e34adab910c42df19d7b25aff26a749dc90697ad")
231
242
  end
232
243
  end
233
244
  end
@@ -402,6 +413,36 @@ RSpec.describe Buckaruby::Gateway do
402
413
  end
403
414
  end
404
415
 
416
+ describe '#specify_transaction' do
417
+ before do
418
+ stub_request(:post, "https://testcheckout.buckaroo.nl/nvp/?op=TransactionRequestSpecification").to_return(body: File.read("spec/fixtures/responses/specify_transaction_success.txt"))
419
+ end
420
+
421
+ it 'retrieves the specification for setting up a transaction' do
422
+ response = subject.specify_transaction
423
+ expect(response).to be_an_instance_of(Buckaruby::TransactionSpecificationResponse)
424
+
425
+ services = response.services
426
+ expect(services).to be_an_instance_of(Array)
427
+ expect(services.length).to eq(2)
428
+
429
+ service = services.last
430
+ expect(service).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
431
+ expect(service[:name]).to eq(Buckaruby::PaymentMethod::VISA)
432
+ expect(service[:description]).to eq("Visa")
433
+ expect(service[:version]).to eq("1")
434
+
435
+ currencies = service[:supportedcurrencies]
436
+ expect(currencies).to be_an_instance_of(Array)
437
+ expect(currencies.length).to eq(21)
438
+
439
+ currency = currencies.last
440
+ expect(currency).to be_an_instance_of(Buckaruby::Support::CaseInsensitiveHash)
441
+ expect(currency[:name]).to eq("US Dollar")
442
+ expect(currency[:code]).to eq(Buckaruby::Currency::US_DOLLAR)
443
+ end
444
+ end
445
+
405
446
  describe '#callback' do
406
447
  it 'raises an exception when parameters are missing' do
407
448
  expect {
@@ -33,6 +33,12 @@ RSpec.describe Buckaruby::Signature do
33
33
  string = Buckaruby::Signature.generate_signature_string(params, 'secret')
34
34
  expect(string).to eq('brq_testA=FoobarBRQ_TESTB=abcDEFBRQ_TestC=testsecret')
35
35
  end
36
+
37
+ it 'sorts symbols first, then numbers, then case insensitive letters' do
38
+ params = { 'brq_a_a': 'foo', brq_a0: 'foo', brq_a0a: 'foo', brq_a1a: 'foo', brq_aaA: 'foo', brq_aab: 'foo', brq_aba: 'foo', brq_aCa: 'foo' }
39
+ string = Buckaruby::Signature.generate_signature_string(params, 'secret')
40
+ expect(string).to eq('brq_a_a=foobrq_a0=foobrq_a0a=foobrq_a1a=foobrq_aaA=foobrq_aab=foobrq_aba=foobrq_aCa=foosecret')
41
+ end
36
42
  end
37
43
 
38
44
  describe 'generate_signature' do
@@ -0,0 +1 @@
1
+ BRQ_APIRESULT=Success&BRQ_BASICFIELDS_1_DATATYPE=String&BRQ_BASICFIELDS_1_DESCRIPTION=The+currency+for+the+transaction&BRQ_BASICFIELDS_1_MAXLENGTH=3&BRQ_BASICFIELDS_1_NAME=Currency&BRQ_BASICFIELDS_1_REQUIRED=True&BRQ_BASICFIELDS_10_DATATYPE=String&BRQ_BASICFIELDS_10_DESCRIPTION=The+url+in+the+webshop+where+the+customer+should+return+after+the+transaction+results+in+an+error.&BRQ_BASICFIELDS_10_MAXLENGTH=2048&BRQ_BASICFIELDS_10_NAME=ReturnURLError&BRQ_BASICFIELDS_10_REQUIRED=False&BRQ_BASICFIELDS_11_DATATYPE=String&BRQ_BASICFIELDS_11_DESCRIPTION=The+url+in+the+webshop+where+the+customer+should+return+after+the+transaction+is+cancelled.&BRQ_BASICFIELDS_11_MAXLENGTH=2048&BRQ_BASICFIELDS_11_NAME=ReturnURLReject&BRQ_BASICFIELDS_11_REQUIRED=False&BRQ_BASICFIELDS_12_DATATYPE=String&BRQ_BASICFIELDS_12_DESCRIPTION=The+transaction+key+of+the+original+transaction+for+which+this+transaction+request+is+a+follow+up.+For+example+when+requesting+a+Refund+or+doing+a+recurring+charge.&BRQ_BASICFIELDS_12_MAXLENGTH=32&BRQ_BASICFIELDS_12_NAME=OriginalTransactionKey&BRQ_BASICFIELDS_12_REQUIRED=False&BRQ_BASICFIELDS_13_DATATYPE=Boolean&BRQ_BASICFIELDS_13_DESCRIPTION=Specifies+if+the+current+transaction+is+the+start+of+a+recurrent+payment+sequence.+The+default+is+false.&BRQ_BASICFIELDS_13_MAXLENGTH=1&BRQ_BASICFIELDS_13_NAME=StartRecurrent&BRQ_BASICFIELDS_13_REQUIRED=False&BRQ_BASICFIELDS_14_DATATYPE=String&BRQ_BASICFIELDS_14_DESCRIPTION=Specifies+if+a+redirecturl+to+a+payment+form+will+be+returned+to+which+a+customer+should+be+sent+if+no+paymentmethod+is+selected+or+if+any+required+parameter+which+the+customer+may+provide+is+missing+or+incorrect.&BRQ_BASICFIELDS_14_LIST=Single&BRQ_BASICFIELDS_14_LISTITEMDESCRIPTION_1_DESCRIPTION=No+automatic+redirect+(Default)&BRQ_BASICFIELDS_14_LISTITEMDESCRIPTION_1_VALUE=No&BRQ_BASICFIELDS_14_LISTITEMDESCRIPTION_2_DESCRIPTION=Redirect+to+HTML+gateway&BRQ_BASICFIELDS_14_LISTITEMDESCRIPTION_2_VALUE=RedirectToHTML&BRQ_BASICFIELDS_14_NAME=ContinueOnIncomplete&BRQ_BASICFIELDS_14_REQUIRED=False&BRQ_BASICFIELDS_15_DATATYPE=String&BRQ_BASICFIELDS_15_DESCRIPTION=If+no+primary+service+is+provided+and+ContinueOnIncomplete+is+set%2c+this+list+of+comma+separated+servicescodes+can+be+used+to+limit+the+number+of+services+from+which+the+customer+may+choose+once+he+is+redirected+to+the+payment+form.+This+field+is+optional+and+when+empty+or+missing%2c+the+customer+may+choose+any+of+the+available+services.&BRQ_BASICFIELDS_15_NAME=ServicesSelectableByClient&BRQ_BASICFIELDS_15_REQUIRED=False&BRQ_BASICFIELDS_16_DATATYPE=String&BRQ_BASICFIELDS_16_DESCRIPTION=The+url+in+the+webshop+where+the+push+messages+for+this+transaction+should+be+delivered.&BRQ_BASICFIELDS_16_MAXLENGTH=2048&BRQ_BASICFIELDS_16_NAME=PushURL&BRQ_BASICFIELDS_16_REQUIRED=False&BRQ_BASICFIELDS_17_DATATYPE=String&BRQ_BASICFIELDS_17_DESCRIPTION=The+url+in+the+webshop+where+the+push+messages+for+this+transaction+should+be+delivered+for+failure+statuses.&BRQ_BASICFIELDS_17_MAXLENGTH=2048&BRQ_BASICFIELDS_17_NAME=PushURLFailure&BRQ_BASICFIELDS_17_REQUIRED=False&BRQ_BASICFIELDS_18_DATATYPE=String&BRQ_BASICFIELDS_18_DESCRIPTION=The+browser+user+agent+of+the+consumer.&BRQ_BASICFIELDS_18_NAME=ClientUserAgent&BRQ_BASICFIELDS_18_REQUIRED=False&BRQ_BASICFIELDS_2_DATATYPE=Decimal&BRQ_BASICFIELDS_2_DESCRIPTION=The+transaction+debit+amount+(Either+this+or+AmountCredit+is+required)&BRQ_BASICFIELDS_2_NAME=AmountDebit&BRQ_BASICFIELDS_2_REQUIRED=False&BRQ_BASICFIELDS_3_DATATYPE=Decimal&BRQ_BASICFIELDS_3_DESCRIPTION=The+transaction+credit+amount+(Either+this+or+AmountDebit+is+required)&BRQ_BASICFIELDS_3_NAME=AmountCredit&BRQ_BASICFIELDS_3_REQUIRED=False&BRQ_BASICFIELDS_4_DATATYPE=String&BRQ_BASICFIELDS_4_DESCRIPTION=The+invoice+number+for+the+transaction&BRQ_BASICFIELDS_4_MAXLENGTH=100&BRQ_BASICFIELDS_4_NAME=Invoice&BRQ_BASICFIELDS_4_REQUIRED=False&BRQ_BASICFIELDS_5_DATATYPE=String&BRQ_BASICFIELDS_5_DESCRIPTION=The+order+number+for+the+transaction&BRQ_BASICFIELDS_5_MAXLENGTH=256&BRQ_BASICFIELDS_5_NAME=Order&BRQ_BASICFIELDS_5_REQUIRED=False&BRQ_BASICFIELDS_6_DATATYPE=String&BRQ_BASICFIELDS_6_DESCRIPTION=The+description+for+the+transaction&BRQ_BASICFIELDS_6_MAXLENGTH=100&BRQ_BASICFIELDS_6_NAME=Description&BRQ_BASICFIELDS_6_REQUIRED=False&BRQ_BASICFIELDS_7_DATATYPE=String&BRQ_BASICFIELDS_7_DESCRIPTION=The+IP+address+of+the+customer&BRQ_BASICFIELDS_7_MAXLENGTH=39&BRQ_BASICFIELDS_7_NAME=ClientIP&BRQ_BASICFIELDS_7_REQUIRED=False&BRQ_BASICFIELDS_8_DATATYPE=String&BRQ_BASICFIELDS_8_DESCRIPTION=The+url+in+the+webshop+where+the+customer+should+return+if+the+transaction+requires+the+customer+to+be+sent+to+an+external+website.&BRQ_BASICFIELDS_8_MAXLENGTH=2048&BRQ_BASICFIELDS_8_NAME=ReturnURL&BRQ_BASICFIELDS_8_REQUIRED=False&BRQ_BASICFIELDS_9_DATATYPE=String&BRQ_BASICFIELDS_9_DESCRIPTION=The+url+in+the+webshop+where+the+customer+should+return+after+the+transaction+fails.&BRQ_BASICFIELDS_9_MAXLENGTH=2048&BRQ_BASICFIELDS_9_NAME=ReturnURLCancel&BRQ_BASICFIELDS_9_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_DEFAULT=True&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_DESCRIPTION=Pay&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_NAME=Pay&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DESCRIPTION=Kies+hier+uw+bank.+In+de+volgende+stap+van+het+betaalproces+wordt+u+direct+naar+de+website+van+deze+bank+gestuurd.+Houd+uw+inloggegevens+daarom+bij+de+hand.&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DISPLAYNAME=Uw+bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LIST=Single&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_DESCRIPTION=ABN+AMRO&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_VALUE=ABNANL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_DESCRIPTION=SNS&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_VALUE=SNSBNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_DESCRIPTION=Triodos+Bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_VALUE=TRIONL2U&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_DESCRIPTION=Van+Lanschot&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_VALUE=FVLBNL22&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_DESCRIPTION=ASN+Bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_VALUE=ASNBNL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_DESCRIPTION=bunq&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_VALUE=BUNQNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_DESCRIPTION=Handelsbanken&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_VALUE=HANDNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_DESCRIPTION=ING&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_VALUE=INGBNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_DESCRIPTION=Knab&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_VALUE=KNABNL2H&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_DESCRIPTION=Moneyou&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_VALUE=MOYONL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_DESCRIPTION=Rabobank&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_VALUE=RABONL2U&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_DESCRIPTION=RegioBank&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_VALUE=RBRBNL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_NAME=issuer&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_DISPLAYNAME=BIC-code&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_NAME=consumerBIC&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_DISPLAYNAME=Naam+rekeninghouder&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_MAXLENGTH=255&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_NAME=consumerName&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_DISPLAYNAME=Issuer+(bank)&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_MAXLENGTH=255&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_NAME=consumerIssuer&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_4_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_4_DISPLAYNAME=IBAN-nummer&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_4_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_4_NAME=consumerIBAN&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_4_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_1_TYPE=Primary&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_DEFAULT=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_DESCRIPTION=Refund&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_NAME=Refund&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_DISPLAYNAME=Naam+rekeninghouder&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_NAME=customeraccountname&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_DISPLAYNAME=BIC-code&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_GLOBAL=True&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_NAME=customerbic&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_DISPLAYNAME=IBAN-nummer&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_GLOBAL=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_NAME=customeriban&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_REQUESTPARAMETERS_3_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_2_TYPE=Primary&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_DEFAULT=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_DESCRIPTION=PayRemainder&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_NAME=PayRemainder&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DESCRIPTION=Kies+hier+uw+bank.+In+de+volgende+stap+van+het+betaalproces+wordt+u+direct+naar+de+website+van+deze+bank+gestuurd.+Houd+uw+inloggegevens+daarom+bij+de+hand.&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DISPLAYNAME=Uw+bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LIST=Single&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_DESCRIPTION=ABN+AMRO&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_1_VALUE=ABNANL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_DESCRIPTION=SNS&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_10_VALUE=SNSBNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_DESCRIPTION=Triodos+Bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_11_VALUE=TRIONL2U&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_DESCRIPTION=Van+Lanschot&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_12_VALUE=FVLBNL22&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_DESCRIPTION=ASN+Bank&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_2_VALUE=ASNBNL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_DESCRIPTION=bunq&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_3_VALUE=BUNQNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_DESCRIPTION=Handelsbanken&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_4_VALUE=HANDNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_DESCRIPTION=ING&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_5_VALUE=INGBNL2A&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_DESCRIPTION=Knab&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_6_VALUE=KNABNL2H&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_DESCRIPTION=Moneyou&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_7_VALUE=MOYONL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_DESCRIPTION=Rabobank&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_8_VALUE=RABONL2U&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_DESCRIPTION=RegioBank&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_GROUPNAME=Nederland&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_LISTITEMDESCRIPTION_9_VALUE=RBRBNL21&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_NAME=issuer&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_DISPLAYNAME=Issuer+(bank)&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_MAXLENGTH=255&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_NAME=consumerIssuer&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_DISPLAYNAME=IBAN-nummer&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_NAME=consumerIBAN&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_DISPLAYNAME=BIC-code&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_NAME=consumerBIC&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_DATATYPE=String&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_DISPLAYNAME=Naam+rekeninghouder&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_MAXLENGTH=255&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_MAXOCCURS=1&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_NAME=consumerName&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_4_REQUIRED=False&BRQ_SERVICES_1_ACTIONDESCRIPTION_3_TYPE=Primary&BRQ_SERVICES_1_DESCRIPTION=iDEAL&BRQ_SERVICES_1_NAME=ideal&BRQ_SERVICES_1_SUPPORTEDCURRENCIES_1_CODE=EUR&BRQ_SERVICES_1_SUPPORTEDCURRENCIES_1_ISONUMBER=978&BRQ_SERVICES_1_SUPPORTEDCURRENCIES_1_NAME=Euro&BRQ_SERVICES_1_VERSION=2&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_DEFAULT=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_DESCRIPTION=Pay&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_NAME=Pay&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DESCRIPTION=%5bresource+key+not+found+or+empty+value%5d&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_DISPLAYNAME=Klantnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_GLOBAL=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_NAME=CustomerCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_REQUESTPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_DISPLAYNAME=Laatste+vier+cijfers+van+kaartnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_MAXLENGTH=4&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_NAME=CardNumberEnding&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_DATATYPE=ExpiryDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_DISPLAYNAME=Vervaldatum&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_NAME=CardExpirationDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_RESPONSEPARAMETERS_3_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_1_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_DESCRIPTION=PayWithSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_NAME=PayWithSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_DISPLAYNAME=Versleutelde+beveiliginscode&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_NAME=EncryptedSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_RESPONSEPARAMETERS_1_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_RESPONSEPARAMETERS_1_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_10_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_DESCRIPTION=AuthorizeWithSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_NAME=AuthorizeWithSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_DISPLAYNAME=Versleutelde+beveiliginscode&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_NAME=EncryptedSecurityCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_RESPONSEPARAMETERS_1_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_RESPONSEPARAMETERS_1_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_11_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_2_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_2_DESCRIPTION=Refund&BRQ_SERVICES_2_ACTIONDESCRIPTION_2_NAME=Refund&BRQ_SERVICES_2_ACTIONDESCRIPTION_2_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_DESCRIPTION=Authorize&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_NAME=Authorize&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DESCRIPTION=%5bresource+key+not+found+or+empty+value%5d&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_DISPLAYNAME=Klantnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_GLOBAL=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_NAME=CustomerCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_REQUESTPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_DATATYPE=ExpiryDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_DISPLAYNAME=Vervaldatum&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_NAME=CardExpirationDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_DISPLAYNAME=Laatste+vier+cijfers+van+kaartnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_MAXLENGTH=4&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_NAME=CardNumberEnding&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_RESPONSEPARAMETERS_3_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_3_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_DESCRIPTION=Capture&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_NAME=Capture&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_DISPLAYNAME=Laatste+vier+cijfers+van+kaartnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_MAXLENGTH=4&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_NAME=CardNumberEnding&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_2_DATATYPE=ExpiryDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_2_DISPLAYNAME=Vervaldatum&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_2_NAME=CardExpirationDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_4_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_5_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_5_DESCRIPTION=CancelAuthorize&BRQ_SERVICES_2_ACTIONDESCRIPTION_5_NAME=CancelAuthorize&BRQ_SERVICES_2_ACTIONDESCRIPTION_5_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_DESCRIPTION=PayRecurrent&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_NAME=PayRecurrent&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_1_DATATYPE=ExpiryDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_1_DISPLAYNAME=Vervaldatum&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_1_NAME=CardExpirationDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_DISPLAYNAME=Laatste+vier+cijfers+van+kaartnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_MAXLENGTH=4&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_NAME=CardNumberEnding&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_6_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_DESCRIPTION=PayRemainder&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_NAME=PayRemainder&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_DESCRIPTION=%5bresource+key+not+found+or+empty+value%5d&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_DISPLAYNAME=Klantnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_GLOBAL=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_NAME=CustomerCode&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_REQUESTPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_1_DATATYPE=ExpiryDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_1_DISPLAYNAME=Vervaldatum&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_1_NAME=CardExpirationDate&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_DISPLAYNAME=Laatste+vier+cijfers+van+kaartnummer&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_MAXLENGTH=4&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_NAME=CardNumberEnding&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_RESPONSEPARAMETERS_2_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_7_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_DESCRIPTION=PayEncrypted&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_NAME=PayEncrypted&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_DISPLAYNAME=%5bresource+key+not+found+or+empty+value%5d&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_NAME=EncryptedCardData&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_RESPONSEPARAMETERS_1_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_RESPONSEPARAMETERS_1_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_8_TYPE=Primary&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_DEFAULT=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_DESCRIPTION=AuthorizeEncrypted&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_NAME=AuthorizeEncrypted&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_DISPLAYNAME=%5bresource+key+not+found+or+empty+value%5d&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_GLOBAL=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_NAME=EncryptedCardData&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_REQUESTPARAMETERS_1_REQUIRED=True&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_RESPONSEPARAMETERS_1_DATATYPE=String&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_RESPONSEPARAMETERS_1_DISPLAYNAME=3DS-versie&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_RESPONSEPARAMETERS_1_MAXOCCURS=1&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_RESPONSEPARAMETERS_1_NAME=ThreeDsVersion&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_RESPONSEPARAMETERS_1_REQUIRED=False&BRQ_SERVICES_2_ACTIONDESCRIPTION_9_TYPE=Primary&BRQ_SERVICES_2_DESCRIPTION=Visa&BRQ_SERVICES_2_NAME=visa&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_1_CODE=ARS&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_1_ISONUMBER=32&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_1_NAME=Argentijnse+Peso&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_10_CODE=GBP&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_10_ISONUMBER=826&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_10_NAME=Pond&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_11_CODE=HRK&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_11_ISONUMBER=191&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_11_NAME=Kroatische+Kuna&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_12_CODE=LTL&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_12_ISONUMBER=440&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_12_NAME=Litouwse+Litas&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_13_CODE=LVL&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_13_ISONUMBER=428&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_13_NAME=Letse+Lats&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_14_CODE=MXN&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_14_ISONUMBER=484&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_14_NAME=Mexicaanse+Peso&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_15_CODE=NOK&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_15_ISONUMBER=578&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_15_NAME=Noorse+Kronen&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_16_CODE=NZD&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_16_ISONUMBER=554&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_16_NAME=Nieuw-Zeelandse+Dollar&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_17_CODE=PLN&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_17_ISONUMBER=985&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_17_NAME=Zloty&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_18_CODE=RON&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_18_ISONUMBER=946&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_18_NAME=Leu&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_19_CODE=SEK&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_19_ISONUMBER=752&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_19_NAME=Zweedse+Kronen&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_2_CODE=AUD&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_2_ISONUMBER=36&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_2_NAME=Australische+Dollar&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_20_CODE=TRY&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_20_ISONUMBER=949&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_20_NAME=Turkse+Lira&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_21_CODE=USD&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_21_ISONUMBER=840&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_21_NAME=US+Dollar&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_3_CODE=BRL&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_3_ISONUMBER=986&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_3_NAME=Braziliaanse+Real&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_4_CODE=CAD&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_4_ISONUMBER=124&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_4_NAME=Canadese+Dollar&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_5_CODE=CHF&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_5_ISONUMBER=756&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_5_NAME=Zwitserse+Franc&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_6_CODE=CNY&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_6_ISONUMBER=156&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_6_NAME=Yuan+Renminbi&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_7_CODE=CZK&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_7_ISONUMBER=203&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_7_NAME=Tsjechische+kroon&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_8_CODE=DKK&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_8_ISONUMBER=208&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_8_NAME=Deense+Kronen&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_9_CODE=EUR&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_9_ISONUMBER=978&BRQ_SERVICES_2_SUPPORTEDCURRENCIES_9_NAME=Euro&BRQ_SERVICES_2_VERSION=1&BRQ_SIGNATURE=3c26f42e2c661a72909ca7adf4077a467f9f598a
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: buckaruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kentaa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-04 00:00:00.000000000 Z
11
+ date: 2020-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '12.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '12.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +89,7 @@ files:
89
89
  - lib/buckaruby/configuration.rb
90
90
  - lib/buckaruby/currency.rb
91
91
  - lib/buckaruby/exception.rb
92
+ - lib/buckaruby/field_mapper.rb
92
93
  - lib/buckaruby/gateway.rb
93
94
  - lib/buckaruby/iban.rb
94
95
  - lib/buckaruby/ideal.rb
@@ -103,6 +104,7 @@ files:
103
104
  - lib/buckaruby/transaction_type.rb
104
105
  - lib/buckaruby/version.rb
105
106
  - spec/buckaruby/configuration_spec.rb
107
+ - spec/buckaruby/field_mapper_spec.rb
106
108
  - spec/buckaruby/gateway_spec.rb
107
109
  - spec/buckaruby/iban_spec.rb
108
110
  - spec/buckaruby/signature_spec.rb
@@ -131,6 +133,7 @@ files:
131
133
  - spec/fixtures/responses/refund_info_success.txt
132
134
  - spec/fixtures/responses/refund_transaction_success.txt
133
135
  - spec/fixtures/responses/setup_transaction_success.txt
136
+ - spec/fixtures/responses/specify_transaction_success.txt
134
137
  - spec/fixtures/responses/status_cancellable.txt
135
138
  - spec/fixtures/responses/status_noncancellable.txt
136
139
  - spec/fixtures/responses/status_success.txt
@@ -160,6 +163,7 @@ specification_version: 4
160
163
  summary: Ruby library for communicating with the Buckaroo Payment Engine 3.0.
161
164
  test_files:
162
165
  - spec/buckaruby/configuration_spec.rb
166
+ - spec/buckaruby/field_mapper_spec.rb
163
167
  - spec/buckaruby/gateway_spec.rb
164
168
  - spec/buckaruby/iban_spec.rb
165
169
  - spec/buckaruby/signature_spec.rb
@@ -188,6 +192,7 @@ test_files:
188
192
  - spec/fixtures/responses/refund_info_success.txt
189
193
  - spec/fixtures/responses/refund_transaction_success.txt
190
194
  - spec/fixtures/responses/setup_transaction_success.txt
195
+ - spec/fixtures/responses/specify_transaction_success.txt
191
196
  - spec/fixtures/responses/status_cancellable.txt
192
197
  - spec/fixtures/responses/status_noncancellable.txt
193
198
  - spec/fixtures/responses/status_success.txt