buckaruby 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml 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