adyen 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +12 -5
- data/CHANGELOG.md +5 -2
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +4 -0
- data/README.md +0 -2
- data/Rakefile +2 -8
- data/adyen.gemspec +4 -5
- data/lib/adyen/api.rb +14 -10
- data/lib/adyen/api/payment_service.rb +35 -4
- data/lib/adyen/api/templates/payment_service.rb +5 -0
- data/lib/adyen/form.rb +1 -1
- data/lib/adyen/hpp/request.rb +8 -6
- data/lib/adyen/rest.rb +21 -8
- data/lib/adyen/rest/client.rb +13 -0
- data/lib/adyen/templates/notification_migration.rb +1 -1
- data/lib/adyen/templates/notification_model.rb +2 -2
- data/lib/adyen/version.rb +1 -1
- data/{spec/functional/api_spec.rb → test/functional/api_test.rb} +38 -33
- data/{spec → test}/functional/initializer.rb.ci +0 -0
- data/{spec → test}/functional/initializer.rb.sample +0 -0
- data/test/helpers/views/hpp.erb +15 -15
- data/test/test_helper.rb +1 -0
- data/{spec/api/api_spec.rb → test/unit/api/api_test.rb} +7 -7
- data/{spec/api/payment_service_spec.rb → test/unit/api/payment_service_test.rb} +149 -117
- data/{spec/api/recurring_service_spec.rb → test/unit/api/recurring_service_test.rb} +49 -46
- data/{spec/api/response_spec.rb → test/unit/api/response_test.rb} +12 -12
- data/{spec/api/simple_soap_client_spec.rb → test/unit/api/simple_soap_client_test.rb} +27 -30
- data/{spec/api/spec_helper.rb → test/unit/api/test_helper.rb} +44 -35
- data/{spec/api/test_helpers_spec.rb → test/unit/api/test_helpers_test.rb} +11 -11
- data/test/{form_test.rb → unit/form_test.rb} +0 -0
- data/test/unit/hpp/request_test.rb +68 -0
- data/test/{hpp → unit/hpp}/signature_test.rb +0 -0
- data/test/{hpp_test.rb → unit/hpp_test.rb} +0 -0
- data/test/{rest → unit/rest}/signature_test.rb +0 -0
- data/test/{rest_list_recurring_details_response_test.rb → unit/rest_list_recurring_details_response_test.rb} +0 -0
- data/test/{rest_request_test.rb → unit/rest_request_test.rb} +0 -0
- data/test/{rest_response_test.rb → unit/rest_response_test.rb} +0 -0
- data/test/{signature_test.rb → unit/signature_test.rb} +0 -0
- data/test/{util_test.rb → unit/util_test.rb} +0 -0
- metadata +53 -61
- data/spec/spec_helper.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8ef547799ff5fa479e0adb223c8e325b394e064
|
4
|
+
data.tar.gz: 964b4e93c00f7448a073aa9423497713ee480dfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c0d7a296dd0697404034dbc655a7b53fb1e3cba9443fe6a821203db33fe307ec4b21b58b1196c853d486eec05b8bf6d15c5f9152078a939d5fca0779664b010
|
7
|
+
data.tar.gz: 62422891b4307c4b6e1a872cfe17223bb323c1163df1ce47920f77bd0990ce4432fd5189ad9e55463dcd10a99d769956c1f4a3f0114134b6c2b80d6322ff1210
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,30 +1,37 @@
|
|
1
|
+
sudo: false
|
2
|
+
dist: trusty
|
1
3
|
language: ruby
|
2
4
|
cache: bundler
|
3
|
-
script: bundle exec rake
|
4
5
|
rvm:
|
5
6
|
- "2.0"
|
6
7
|
- "2.1"
|
7
8
|
- "2.2"
|
8
9
|
- "2.3.1"
|
10
|
+
- "2.4.1"
|
9
11
|
- "jruby-9.0"
|
12
|
+
- "jruby-9.1"
|
10
13
|
- "ruby-head"
|
11
|
-
- "
|
14
|
+
- "rubinius-3"
|
12
15
|
- "jruby-head"
|
13
16
|
matrix:
|
14
17
|
allow_failures:
|
15
18
|
- rvm: jruby-head
|
16
19
|
- rvm: ruby-head
|
17
|
-
- rvm:
|
20
|
+
- rvm: rubinius-3
|
21
|
+
|
18
22
|
before_install:
|
19
23
|
- bundle --version || gem install bundler
|
24
|
+
- gem update bundler
|
20
25
|
before_script:
|
21
|
-
- cp
|
26
|
+
- cp test/functional/initializer.rb.ci test/functional/initializer.rb
|
27
|
+
script: bundle exec rake
|
28
|
+
|
22
29
|
env:
|
23
30
|
global:
|
24
31
|
- ADYEN_MERCHANT_ACCOUNT: "VanBergenORG"
|
25
32
|
- ADYEN_API_USERNAME: "ws@Company.VanBergen"
|
26
33
|
- ADYEN_API_PASSWORD: "7phtHzbfnzsp"
|
27
|
-
|
34
|
+
|
28
35
|
branches:
|
29
36
|
only:
|
30
37
|
- master
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,12 @@
|
|
2
2
|
|
3
3
|
The following changes have been made to the library over the years. Pleae add an entry to this file as part of your pull requests.
|
4
4
|
|
5
|
-
####
|
5
|
+
#### Version 2.3.0
|
6
6
|
|
7
|
-
|
7
|
+
- Add `shopper_statement` option to `Adyen::APP`, allowing to generate Billets with custom payment instructions.
|
8
|
+
- Make sure the unique index created by the notification model generator includes `merchant_account_code`
|
9
|
+
- Make refusal_reson availble as a response field for failed requests.
|
10
|
+
- Updates to the testing in frastructure
|
8
11
|
|
9
12
|
#### Version 2.2.0
|
10
13
|
|
data/CONTRIBUTING.md
CHANGED
@@ -6,7 +6,7 @@ This projects welcomes outside contributions from anyone.
|
|
6
6
|
|
7
7
|
Please report bugs as a [Github issue](https://github.com/wvanbergen/adyen/issues/new).
|
8
8
|
|
9
|
-
- We are not associated with Adyen. Please contact Adyen
|
9
|
+
- We are not associated with Adyen. Please contact Adyen yourself if you are having
|
10
10
|
trouble with your integration.
|
11
11
|
- This library supports several features that are not supported by default on a new
|
12
12
|
Adyen account. You may have to contact Adyen if you are receiving a
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
Package to simplify including Adyen payments services into a Ruby on Rails application.
|
4
4
|
|
5
|
-
> Note: this library is corrently undergoing a major rewrite. Information in this README is about the still unreleased version of this library. If you want information about the last released version, check out version [1.6.0](https://github.com/wvanbergen/adyen/tree/v1.6.0).
|
6
|
-
|
7
5
|
Adyen integration relies on three modes of communication between Adyen, your server and your client/customer:
|
8
6
|
|
9
7
|
- Client-to-Adyen communication using Hosted Payment Pages (HPP).
|
data/Rakefile
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require "rspec/core/rake_task"
|
3
2
|
require "rake/testtask"
|
4
3
|
|
5
4
|
namespace(:test) do
|
@@ -12,7 +11,7 @@ namespace(:test) do
|
|
12
11
|
Rake::TestTask.new(:unit) do |t|
|
13
12
|
t.description = "Run unit tests"
|
14
13
|
t.libs << "test"
|
15
|
-
t.test_files = FileList['test
|
14
|
+
t.test_files = FileList['test/unit/**/*_test.rb']
|
16
15
|
end
|
17
16
|
|
18
17
|
Rake::TestTask.new(:functional) do |t|
|
@@ -31,11 +30,6 @@ end
|
|
31
30
|
desc "Run unit and functional tests"
|
32
31
|
task :test => %w{test:unit test:functional}
|
33
32
|
|
34
|
-
RSpec::Core::RakeTask.new(:spec) do |task|
|
35
|
-
task.pattern = "./spec/**/*_spec.rb"
|
36
|
-
task.rspec_opts = ['--color']
|
37
|
-
end
|
38
|
-
|
39
33
|
CACERT_PATH = 'lib/adyen/api/cacert.pem'
|
40
34
|
|
41
35
|
desc 'Update CA root certificates for the simple SOAP client'
|
@@ -51,4 +45,4 @@ end
|
|
51
45
|
# sh "git diff-index --quiet HEAD #{CACERT_PATH} || (git add #{CACERT_PATH} && git commit -m '[API] Update CA root certificates file.')"
|
52
46
|
# end
|
53
47
|
|
54
|
-
task :default => %w{test
|
48
|
+
task :default => %w{test}
|
data/adyen.gemspec
CHANGED
@@ -24,14 +24,13 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.license = 'MIT'
|
25
25
|
|
26
26
|
s.add_development_dependency('rake')
|
27
|
-
s.add_development_dependency('
|
28
|
-
s.add_development_dependency('minitest', '~> 5')
|
27
|
+
s.add_development_dependency('minitest', '~> 5.0')
|
29
28
|
s.add_development_dependency('mocha')
|
30
29
|
s.add_development_dependency('sinatra')
|
31
30
|
s.add_development_dependency('poltergeist')
|
32
31
|
|
33
|
-
s.add_development_dependency('
|
34
|
-
s.add_development_dependency('nokogiri', '>= 1.6.
|
32
|
+
s.add_development_dependency('railties', '>= 3.2', '< 5.2')
|
33
|
+
s.add_development_dependency('nokogiri', '>= 1.6.8')
|
35
34
|
|
36
35
|
s.requirements << 'Having Nokogiri installed will speed up XML handling when using the SOAP API.'
|
37
36
|
|
@@ -39,5 +38,5 @@ Gem::Specification.new do |s|
|
|
39
38
|
s.extra_rdoc_files = ['README.md', 'CHANGELOG.md', 'CONTRIBUTING.md']
|
40
39
|
|
41
40
|
s.files = `git ls-files`.split($/)
|
42
|
-
s.test_files = s.files.grep(%r{^
|
41
|
+
s.test_files = s.files.grep(%r{^test/})
|
43
42
|
end
|
data/lib/adyen/api.rb
CHANGED
@@ -49,7 +49,7 @@ module Adyen
|
|
49
49
|
module API
|
50
50
|
extend self
|
51
51
|
|
52
|
-
# Generate a Billet - *
|
52
|
+
# Generate a Billet - *Brazillian users only*
|
53
53
|
#
|
54
54
|
# Billet (Boleto Bancário), often simply referred to as Boleto, is an
|
55
55
|
# offline payment method used in Brazil . The consumer will take the Boleto form to
|
@@ -66,17 +66,20 @@ module Adyen
|
|
66
66
|
# { currency: "BRL", value: (invoice.amount).to_i },
|
67
67
|
# { first_name: "Simon", last_name: "Hopper" },
|
68
68
|
# document_number,
|
69
|
-
# selected_brand
|
69
|
+
# selected_brand,
|
70
|
+
# "2016-10-29T23:00:00.000Z",
|
71
|
+
# "Please send payment email to payment@example.com after payment."
|
70
72
|
# )
|
71
73
|
# response.success? # => true
|
72
74
|
#
|
73
75
|
#
|
74
|
-
# @param [Numeric,String] reference
|
75
|
-
# @param [Hash] amount
|
76
|
-
# @param [Hash]
|
77
|
-
# @param [String] document_number
|
78
|
-
#
|
79
|
-
# @param [String]
|
76
|
+
# @param [Numeric,String] reference Your reference (ID) for this payment.
|
77
|
+
# @param [Hash] amount A hash describing the money to charge.
|
78
|
+
# @param [Hash] shopper_name A hash describing the shopper.
|
79
|
+
# @param [String] document_number Social Security number (CPF in Brazil)
|
80
|
+
# @param [String] selected_brand Billet brand
|
81
|
+
# @param [String] delivery_date Payment date limit in ISO8601 format
|
82
|
+
# @param optional [String] shopper_statement Payment instructions to Shopper
|
80
83
|
#
|
81
84
|
# @option amount [String] :currency The ISO currency code (EUR, GBP, USD, etc).
|
82
85
|
# @option amount [Integer] :value The value of the payment in discrete cents,
|
@@ -88,13 +91,14 @@ module Adyen
|
|
88
91
|
#
|
89
92
|
# @return [PaymentService::BilletResponse] The response object which holds the billet url.
|
90
93
|
#
|
91
|
-
def generate_billet(reference, amount, shopper_name, social_security_number, selected_brand, delivery_date)
|
94
|
+
def generate_billet(reference, amount, shopper_name, social_security_number, selected_brand, delivery_date, shopper_statement = nil)
|
92
95
|
params = { :reference => reference,
|
93
96
|
:amount => amount,
|
94
97
|
:shopper_name => shopper_name,
|
95
98
|
:social_security_number => social_security_number,
|
96
99
|
:selected_brand => selected_brand,
|
97
|
-
:delivery_date => delivery_date
|
100
|
+
:delivery_date => delivery_date,
|
101
|
+
:shopper_statement => shopper_statement }
|
98
102
|
PaymentService.new(params).generate_billet
|
99
103
|
end
|
100
104
|
|
@@ -126,6 +126,7 @@ module Adyen
|
|
126
126
|
content << shopper_name_partial if @params[:shopper_name]
|
127
127
|
content << delivery_date_partial if @params[:delivery_date]
|
128
128
|
content << selected_brand_partial if @params[:selected_brand]
|
129
|
+
content << shopper_statement_partial if @params[:shopper_statement]
|
129
130
|
LAYOUT % [@params[:merchant_account], @params[:reference], content]
|
130
131
|
end
|
131
132
|
|
@@ -210,6 +211,12 @@ module Adyen
|
|
210
211
|
@params[:shopper].map { |k, v| SHOPPER_PARTIALS[k] % v }.join("\n")
|
211
212
|
end
|
212
213
|
|
214
|
+
def shopper_statement_partial
|
215
|
+
if @params[:shopper_statement]
|
216
|
+
SHOPPER_STATEMENT % @params[:shopper_statement]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
213
220
|
def fraud_offset_partial
|
214
221
|
validate_parameters!(:fraud_offset)
|
215
222
|
FRAUD_OFFSET_PARTIAL % @params[:fraud_offset]
|
@@ -222,7 +229,9 @@ module Adyen
|
|
222
229
|
class BilletResponse < Response
|
223
230
|
RECEIVED = "Received"
|
224
231
|
|
225
|
-
response_attrs :result_code, :billet_url, :psp_reference
|
232
|
+
response_attrs :result_code, :billet_url, :psp_reference,
|
233
|
+
:barcode, :due_date, :expiration_date,
|
234
|
+
:refusal_reason
|
226
235
|
|
227
236
|
def success?
|
228
237
|
super && params[:result_code] == RECEIVED
|
@@ -230,10 +239,24 @@ module Adyen
|
|
230
239
|
|
231
240
|
def params
|
232
241
|
@params ||= xml_querier.xpath('//payment:authoriseResponse/payment:paymentResult') do |result|
|
242
|
+
result_code = result.text('./payment:resultCode')
|
243
|
+
attributes = Hash.new('')
|
244
|
+
|
245
|
+
if result_code == RECEIVED
|
246
|
+
attributes = result.children[0].children.map do |child|
|
247
|
+
{ child.children[0].text => child.children[1].text }
|
248
|
+
end
|
249
|
+
attributes = attributes.reduce({}, :merge)
|
250
|
+
end
|
251
|
+
|
233
252
|
{
|
234
|
-
:psp_reference
|
235
|
-
:result_code
|
236
|
-
:billet_url
|
253
|
+
:psp_reference => result.text('./payment:pspReference'),
|
254
|
+
:result_code => result_code,
|
255
|
+
:billet_url => attributes['boletobancario.url'],
|
256
|
+
:barcode => attributes['boletobancario.barCodeReference'],
|
257
|
+
:due_date => convert_to_date(attributes['boletobancario.dueDate']),
|
258
|
+
:expiration_date => convert_to_date(attributes['boletobancario.expirationDate']),
|
259
|
+
:refusal_reason => (invalid_request? ? fault_message : result.text('./payment:refusalReason'))
|
237
260
|
}
|
238
261
|
end
|
239
262
|
end
|
@@ -241,6 +264,14 @@ module Adyen
|
|
241
264
|
def invalid_request?
|
242
265
|
!fault_message.nil?
|
243
266
|
end
|
267
|
+
|
268
|
+
private
|
269
|
+
|
270
|
+
def convert_to_date(value)
|
271
|
+
Date.parse(value)
|
272
|
+
rescue ArgumentError
|
273
|
+
nil
|
274
|
+
end
|
244
275
|
end
|
245
276
|
|
246
277
|
class AuthorisationResponse < Response
|
@@ -106,6 +106,11 @@ module Adyen
|
|
106
106
|
</payment:shopperName>
|
107
107
|
EOXML
|
108
108
|
|
109
|
+
# @private
|
110
|
+
SHOPPER_STATEMENT = <<-EOXML
|
111
|
+
<payment:shopperStatement>%s</payment:shopperStatement>
|
112
|
+
EOXML
|
113
|
+
|
109
114
|
# @private
|
110
115
|
ENCRYPTED_CARD_PARTIAL = <<-EOXML
|
111
116
|
<additionalAmount xmlns="http://payment.services.adyen.com" xsi:nil="true" />
|
data/lib/adyen/form.rb
CHANGED
@@ -47,7 +47,7 @@ module Adyen
|
|
47
47
|
# @see Adyen::Form.redirect_url
|
48
48
|
def domain(environment = nil)
|
49
49
|
environment ||= Adyen.configuration.environment
|
50
|
-
|
50
|
+
Adyen.configuration.payment_flow_domain || ACTION_DOMAIN % [environment.to_s]
|
51
51
|
end
|
52
52
|
|
53
53
|
# Returns the URL of the Adyen payment system, adjusted for an Adyen environment.
|
data/lib/adyen/hpp/request.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'adyen/hpp/signature'
|
2
|
+
require 'adyen/util'
|
2
3
|
require 'cgi'
|
3
4
|
|
4
5
|
module Adyen
|
@@ -8,6 +9,8 @@ module Adyen
|
|
8
9
|
attr_accessor :parameters
|
9
10
|
attr_writer :skin, :environment, :shared_secret
|
10
11
|
|
12
|
+
MANDATORY_ATTRIBUTES = %i(currency_code payment_amount merchant_account skin_code ship_before_date session_validity).freeze
|
13
|
+
|
11
14
|
# Initialize the HPP request
|
12
15
|
#
|
13
16
|
# @param [Hash] parameters The payment parameters
|
@@ -52,7 +55,7 @@ module Adyen
|
|
52
55
|
# for payment forms or redirects.
|
53
56
|
# @see Adyen::HPP::Request.redirect_url
|
54
57
|
def domain
|
55
|
-
|
58
|
+
Adyen.configuration.payment_flow_domain || HPP_DOMAIN % [environment.to_s]
|
56
59
|
end
|
57
60
|
|
58
61
|
# Returns the URL of the Adyen payment system, adjusted for an Adyen environment.
|
@@ -87,10 +90,9 @@ module Adyen
|
|
87
90
|
end
|
88
91
|
formatted_parameters = default_form_parameters.merge(formatted_parameters)
|
89
92
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
raise ArgumentError, "Cannot generate request: :skin_code attribute not found!" unless formatted_parameters[:skin_code]
|
93
|
+
MANDATORY_ATTRIBUTES.each do |attribute|
|
94
|
+
raise ArgumentError, "Cannot generate request: :#{attribute} attribute not found!" unless formatted_parameters[attribute]
|
95
|
+
end
|
94
96
|
|
95
97
|
formatted_parameters[:recurring_contract] = 'RECURRING' if formatted_parameters.delete(:recurring) == true
|
96
98
|
formatted_parameters[:order_data] = Adyen::Util.gzip_base64(formatted_parameters.delete(:order_data_raw)) if formatted_parameters[:order_data_raw]
|
@@ -189,4 +191,4 @@ module Adyen
|
|
189
191
|
end
|
190
192
|
end
|
191
193
|
end
|
192
|
-
end
|
194
|
+
end
|
data/lib/adyen/rest.rb
CHANGED
@@ -9,7 +9,11 @@ module Adyen
|
|
9
9
|
# The primary method here is {Adyen::REST.session}, which will yield a
|
10
10
|
# {Adyen::REST::Client} which you can use to send API requests.
|
11
11
|
#
|
12
|
-
#
|
12
|
+
# If you need more than one client instance, for instance because you
|
13
|
+
# have multiple acounts set up with different permissions, you can instantiate
|
14
|
+
# clients yourself using {Adyen::REST::Client.new}
|
15
|
+
#
|
16
|
+
# @example Using the singleton Client instance
|
13
17
|
#
|
14
18
|
# Adyen::REST.session do |client|
|
15
19
|
# client.http.read_timeout = 5
|
@@ -17,14 +21,26 @@ module Adyen
|
|
17
21
|
# # ...
|
18
22
|
# end
|
19
23
|
#
|
24
|
+
# @example Using a your own Client instance
|
25
|
+
#
|
26
|
+
# Adyen::REST::Client.new('test', 'username', 'password').session do |client|
|
27
|
+
# client.http.read_timeout = 5
|
28
|
+
# response = client.api_request(...)
|
29
|
+
# # ...
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
#
|
20
33
|
# @see Adyen::REST.session Use Adyen::REST.session to run code against the API.
|
21
34
|
# @see Adyen::REST::Client Adyen::REST::Client implements the actual API calls.
|
22
35
|
module REST
|
23
36
|
|
24
|
-
# Provides a REST API client this is configured using the values in
|
37
|
+
# Provides a singelton REST API client this is configured using the values in
|
38
|
+
# <tt>Adyen.configuration</tt>.
|
39
|
+
#
|
25
40
|
# @param options [Hash] (see Adyen::REST::Client#initialize)
|
26
41
|
# @return [Adyen::REST::Client] A configured client instance
|
27
42
|
# @see .session
|
43
|
+
# @see Adyen::REST::Client.new To instantiate Clients yourself, in case you need more than one.
|
28
44
|
def self.client
|
29
45
|
Adyen::REST::Client.new(
|
30
46
|
Adyen.configuration.environment,
|
@@ -43,12 +59,9 @@ module Adyen
|
|
43
59
|
# the provided client. The client will be closed after the block returns.
|
44
60
|
# @yieldparam client [Adyen::REST::Client] The REST client to use for the session.
|
45
61
|
# @return [void]
|
46
|
-
# @see Adyen::REST::Client
|
47
|
-
def self.session(client =
|
48
|
-
client
|
49
|
-
yield(client)
|
50
|
-
ensure
|
51
|
-
client.close
|
62
|
+
# @see Adyen::REST::Client#session
|
63
|
+
def self.session(client = self.client, &block)
|
64
|
+
client.session(&block)
|
52
65
|
end
|
53
66
|
end
|
54
67
|
end
|
data/lib/adyen/rest/client.rb
CHANGED
@@ -42,6 +42,19 @@ module Adyen
|
|
42
42
|
@http = nil
|
43
43
|
end
|
44
44
|
|
45
|
+
# Runs a client session against the Adyen REST service for the duration of the block,
|
46
|
+
# and closes the connection afterwards.
|
47
|
+
#
|
48
|
+
# @yield The provided block will be called in which you can interact with the API using
|
49
|
+
# the provided client. The client will be closed after the block returns.
|
50
|
+
# @return [void]
|
51
|
+
def session
|
52
|
+
yield(self)
|
53
|
+
ensure
|
54
|
+
close
|
55
|
+
end
|
56
|
+
|
57
|
+
|
45
58
|
# The underlying <tt>Net::HTTP</tt> instance that is used to execute HTTP
|
46
59
|
# request against the API.
|
47
60
|
#
|
@@ -20,7 +20,7 @@ class CreateAdyenNotifications < ActiveRecord::Migration
|
|
20
20
|
t.timestamps
|
21
21
|
end
|
22
22
|
|
23
|
-
add_index :adyen_notifications, [:psp_reference, :event_code, :success], :unique => true, :name => 'adyen_notification_uniqueness'
|
23
|
+
add_index :adyen_notifications, [:merchant_account_code, :psp_reference, :event_code, :success], :unique => true, :name => 'adyen_notification_uniqueness'
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.down
|