adyen 0.3.8 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.kick +35 -0
- data/LICENSE +3 -2
- data/README.rdoc +8 -4
- data/Rakefile +10 -0
- data/TODO +14 -4
- data/adyen.gemspec +9 -15
- data/lib/adyen.rb +10 -59
- data/lib/adyen/api.rb +281 -0
- data/lib/adyen/api/cacert.pem +3509 -0
- data/lib/adyen/api/payment_service.rb +258 -0
- data/lib/adyen/api/recurring_service.rb +126 -0
- data/lib/adyen/api/response.rb +54 -0
- data/lib/adyen/api/simple_soap_client.rb +118 -0
- data/lib/adyen/api/templates/payment_service.rb +103 -0
- data/lib/adyen/api/templates/recurring_service.rb +34 -0
- data/lib/adyen/api/test_helpers.rb +133 -0
- data/lib/adyen/api/xml_querier.rb +94 -0
- data/lib/adyen/configuration.rb +139 -0
- data/lib/adyen/form.rb +37 -109
- data/lib/adyen/formatter.rb +0 -10
- data/lib/adyen/matchers.rb +1 -1
- data/lib/adyen/notification_generator.rb +30 -0
- data/lib/adyen/railtie.rb +13 -0
- data/lib/adyen/templates/notification_migration.rb +29 -0
- data/lib/adyen/templates/notification_model.rb +70 -0
- data/spec/adyen_spec.rb +3 -45
- data/spec/api/api_spec.rb +139 -0
- data/spec/api/payment_service_spec.rb +439 -0
- data/spec/api/recurring_service_spec.rb +105 -0
- data/spec/api/response_spec.rb +35 -0
- data/spec/api/simple_soap_client_spec.rb +91 -0
- data/spec/api/spec_helper.rb +417 -0
- data/spec/api/test_helpers_spec.rb +83 -0
- data/spec/form_spec.rb +27 -23
- data/spec/functional/api_spec.rb +90 -0
- data/spec/functional/initializer.rb.sample +3 -0
- data/spec/spec_helper.rb +5 -5
- data/tasks/github-gem.rake +49 -55
- data/yard_extensions.rb +16 -0
- metadata +63 -82
- data/init.rb +0 -1
- data/lib/adyen/notification.rb +0 -151
- data/lib/adyen/soap.rb +0 -649
- data/spec/notification_spec.rb +0 -97
- data/spec/soap_spec.rb +0 -340
@@ -0,0 +1,103 @@
|
|
1
|
+
module Adyen
|
2
|
+
module API
|
3
|
+
class PaymentService < SimpleSOAPClient
|
4
|
+
class << self
|
5
|
+
private
|
6
|
+
|
7
|
+
def modification_request(method, body = nil)
|
8
|
+
return <<EOS
|
9
|
+
<payment:#{method} xmlns:payment="http://payment.services.adyen.com" xmlns:recurring="http://recurring.services.adyen.com" xmlns:common="http://common.services.adyen.com">
|
10
|
+
<payment:modificationRequest>
|
11
|
+
<payment:merchantAccount>%s</payment:merchantAccount>
|
12
|
+
<payment:originalReference>%s</payment:originalReference>
|
13
|
+
#{body}
|
14
|
+
</payment:modificationRequest>
|
15
|
+
</payment:#{method}>
|
16
|
+
EOS
|
17
|
+
end
|
18
|
+
|
19
|
+
def modification_request_with_amount(method)
|
20
|
+
modification_request(method, <<EOS)
|
21
|
+
<payment:modificationAmount>
|
22
|
+
<common:currency>%s</common:currency>
|
23
|
+
<common:value>%s</common:value>
|
24
|
+
</payment:modificationAmount>
|
25
|
+
EOS
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @private
|
30
|
+
CAPTURE_LAYOUT = modification_request_with_amount(:capture)
|
31
|
+
# @private
|
32
|
+
REFUND_LAYOUT = modification_request_with_amount(:refund)
|
33
|
+
# @private
|
34
|
+
CANCEL_LAYOUT = modification_request(:cancel)
|
35
|
+
# @private
|
36
|
+
CANCEL_OR_REFUND_LAYOUT = modification_request(:cancelOrRefund)
|
37
|
+
|
38
|
+
# @private
|
39
|
+
LAYOUT = <<EOS
|
40
|
+
<payment:authorise xmlns:payment="http://payment.services.adyen.com" xmlns:recurring="http://recurring.services.adyen.com" xmlns:common="http://common.services.adyen.com">
|
41
|
+
<payment:paymentRequest>
|
42
|
+
<payment:merchantAccount>%s</payment:merchantAccount>
|
43
|
+
<payment:reference>%s</payment:reference>
|
44
|
+
%s
|
45
|
+
</payment:paymentRequest>
|
46
|
+
</payment:authorise>
|
47
|
+
EOS
|
48
|
+
|
49
|
+
# @private
|
50
|
+
AMOUNT_PARTIAL = <<EOS
|
51
|
+
<payment:amount>
|
52
|
+
<common:currency>%s</common:currency>
|
53
|
+
<common:value>%s</common:value>
|
54
|
+
</payment:amount>
|
55
|
+
EOS
|
56
|
+
|
57
|
+
# @private
|
58
|
+
CARD_PARTIAL = <<EOS
|
59
|
+
<payment:card>
|
60
|
+
<payment:holderName>%s</payment:holderName>
|
61
|
+
<payment:number>%s</payment:number>
|
62
|
+
<payment:cvc>%s</payment:cvc>
|
63
|
+
<payment:expiryYear>%s</payment:expiryYear>
|
64
|
+
<payment:expiryMonth>%02d</payment:expiryMonth>
|
65
|
+
</payment:card>
|
66
|
+
EOS
|
67
|
+
|
68
|
+
# @private
|
69
|
+
ENABLE_RECURRING_CONTRACTS_PARTIAL = <<EOS
|
70
|
+
<payment:recurring>
|
71
|
+
<payment:contract>RECURRING,ONECLICK</payment:contract>
|
72
|
+
</payment:recurring>
|
73
|
+
EOS
|
74
|
+
|
75
|
+
# @private
|
76
|
+
RECURRING_PAYMENT_BODY_PARTIAL = <<EOS
|
77
|
+
<payment:recurring>
|
78
|
+
<payment:contract>RECURRING</payment:contract>
|
79
|
+
</payment:recurring>
|
80
|
+
<payment:selectedRecurringDetailReference>%s</payment:selectedRecurringDetailReference>
|
81
|
+
<payment:shopperInteraction>ContAuth</payment:shopperInteraction>
|
82
|
+
EOS
|
83
|
+
|
84
|
+
# @private
|
85
|
+
ONE_CLICK_PAYMENT_BODY_PARTIAL = <<EOS
|
86
|
+
<payment:recurring>
|
87
|
+
<payment:contract>ONECLICK</payment:contract>
|
88
|
+
</payment:recurring>
|
89
|
+
<payment:selectedRecurringDetailReference>%s</payment:selectedRecurringDetailReference>
|
90
|
+
<payment:card>
|
91
|
+
<payment:cvc>%s</payment:cvc>
|
92
|
+
</payment:card>
|
93
|
+
EOS
|
94
|
+
|
95
|
+
# @private
|
96
|
+
SHOPPER_PARTIALS = {
|
97
|
+
:reference => ' <payment:shopperReference>%s</payment:shopperReference>',
|
98
|
+
:email => ' <payment:shopperEmail>%s</payment:shopperEmail>',
|
99
|
+
:ip => ' <payment:shopperIP>%s</payment:shopperIP>',
|
100
|
+
}
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Adyen
|
2
|
+
module API
|
3
|
+
class RecurringService < SimpleSOAPClient
|
4
|
+
# @private
|
5
|
+
LIST_LAYOUT = <<EOS
|
6
|
+
<recurring:listRecurringDetails xmlns:recurring="http://recurring.services.adyen.com">
|
7
|
+
<recurring:request>
|
8
|
+
<recurring:recurring>
|
9
|
+
<recurring:contract>RECURRING</recurring:contract>
|
10
|
+
</recurring:recurring>
|
11
|
+
<recurring:merchantAccount>%s</recurring:merchantAccount>
|
12
|
+
<recurring:shopperReference>%s</recurring:shopperReference>
|
13
|
+
</recurring:request>
|
14
|
+
</recurring:listRecurringDetails>
|
15
|
+
EOS
|
16
|
+
|
17
|
+
# @private
|
18
|
+
DISABLE_LAYOUT = <<EOS
|
19
|
+
<recurring:disable xmlns:recurring="http://recurring.services.adyen.com">
|
20
|
+
<recurring:request>
|
21
|
+
<recurring:merchantAccount>%s</recurring:merchantAccount>
|
22
|
+
<recurring:shopperReference>%s</recurring:shopperReference>
|
23
|
+
%s
|
24
|
+
</recurring:request>
|
25
|
+
</recurring:disable>
|
26
|
+
EOS
|
27
|
+
|
28
|
+
# @private
|
29
|
+
RECURRING_DETAIL_PARTIAL = <<EOS
|
30
|
+
<recurring:recurringDetailReference>%s</recurring:recurringDetailReference>
|
31
|
+
EOS
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'adyen/api/payment_service'
|
2
|
+
|
3
|
+
module Adyen
|
4
|
+
module API
|
5
|
+
class PaymentService < SimpleSOAPClient
|
6
|
+
# A collection of test helpers that create and assign stubbed response instances for a
|
7
|
+
# subsequent remote call.
|
8
|
+
#
|
9
|
+
# This module extends the {PaymentService} class and thus these methods are callable on it.
|
10
|
+
module TestHelpers
|
11
|
+
AUTHORISE_RESPONSE = SimpleSOAPClient::ENVELOPE % <<EOS
|
12
|
+
<ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
|
13
|
+
<ns1:paymentResult>
|
14
|
+
<additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
15
|
+
<authCode xmlns="http://payment.services.adyen.com">1234</authCode>
|
16
|
+
<dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
17
|
+
<dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
18
|
+
<fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
19
|
+
<issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
20
|
+
<md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
21
|
+
<paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
22
|
+
<pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
|
23
|
+
<refusalReason xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
24
|
+
<resultCode xmlns="http://payment.services.adyen.com">Authorised</resultCode>
|
25
|
+
</ns1:paymentResult>
|
26
|
+
</ns1:authoriseResponse>
|
27
|
+
EOS
|
28
|
+
|
29
|
+
AUTHORISATION_REFUSED_RESPONSE = SimpleSOAPClient::ENVELOPE % <<EOS
|
30
|
+
<ns1:authoriseResponse xmlns:ns1="http://payment.services.adyen.com">
|
31
|
+
<ns1:paymentResult>
|
32
|
+
<additionalData xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
33
|
+
<authCode xmlns="http://payment.services.adyen.com">1234</authCode>
|
34
|
+
<dccAmount xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
35
|
+
<dccSignature xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
36
|
+
<fraudResult xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
37
|
+
<issuerUrl xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
38
|
+
<md xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
39
|
+
<paRequest xmlns="http://payment.services.adyen.com" xsi:nil="true"/>
|
40
|
+
<pspReference xmlns="http://payment.services.adyen.com">9876543210987654</pspReference>
|
41
|
+
<refusalReason xmlns="http://payment.services.adyen.com">You need to actually own money.</refusalReason>
|
42
|
+
<resultCode xmlns="http://payment.services.adyen.com">Refused</resultCode>
|
43
|
+
</ns1:paymentResult>
|
44
|
+
</ns1:authoriseResponse>
|
45
|
+
EOS
|
46
|
+
|
47
|
+
AUTHORISATION_REQUEST_INVALID_RESPONSE = SimpleSOAPClient::ENVELOPE % <<EOS
|
48
|
+
<soap:Fault>
|
49
|
+
<faultcode>soap:Server</faultcode>
|
50
|
+
<faultstring>validation 101 Invalid card number</faultstring>
|
51
|
+
</soap:Fault>
|
52
|
+
EOS
|
53
|
+
|
54
|
+
# @return [AuthorisationResponse] A authorisation succeeded response instance.
|
55
|
+
def success_stub
|
56
|
+
http_response = Net::HTTPOK.new('1.1', '200', 'OK')
|
57
|
+
def http_response.body; AUTHORISE_RESPONSE; end
|
58
|
+
PaymentService::AuthorisationResponse.new(http_response)
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [AuthorisationResponse] An authorisation refused response instance.
|
62
|
+
def refused_stub
|
63
|
+
http_response = Net::HTTPOK.new('1.1', '200', 'OK')
|
64
|
+
def http_response.body; AUTHORISATION_REFUSED_RESPONSE; end
|
65
|
+
PaymentService::AuthorisationResponse.new(http_response)
|
66
|
+
end
|
67
|
+
|
68
|
+
# @return [AuthorisationResponse] An ‘invalid request’ response instance.
|
69
|
+
def invalid_stub
|
70
|
+
http_response = Net::HTTPOK.new('1.1', '200', 'OK')
|
71
|
+
def http_response.body; AUTHORISATION_REQUEST_INVALID_RESPONSE; end
|
72
|
+
PaymentService::AuthorisationResponse.new(http_response)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Assigns a {#success_stub}, meaning the subsequent authoristaion request will be authorised.
|
76
|
+
#
|
77
|
+
# @return [AuthorisationResponse] A authorisation succeeded response instance.
|
78
|
+
def stub_success!
|
79
|
+
@stubbed_response = success_stub
|
80
|
+
end
|
81
|
+
|
82
|
+
# Assigns a {#refused_stub}, meaning the subsequent authoristaion request will be refused.
|
83
|
+
#
|
84
|
+
# @return [AuthorisationResponse] An authorisation refused response instance.
|
85
|
+
def stub_refused!
|
86
|
+
@stubbed_response = refused_stub
|
87
|
+
end
|
88
|
+
|
89
|
+
# Assigns a {#invalid_stub}, meaning the subsequent authoristaion request will be refused,
|
90
|
+
# because the request was invalid.
|
91
|
+
#
|
92
|
+
# @return [AuthorisationResponse] An ‘invalid request’ response instance.
|
93
|
+
def stub_invalid!
|
94
|
+
@stubbed_response = invalid_stub
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
extend TestHelpers
|
99
|
+
end
|
100
|
+
|
101
|
+
class RecurringService < SimpleSOAPClient
|
102
|
+
# A collection of test helpers that create and assign stubbed response instances for a
|
103
|
+
# subsequent remote call.
|
104
|
+
#
|
105
|
+
# This module extends the {RecurringService} class and thus these methods are callable on it.
|
106
|
+
module TestHelpers
|
107
|
+
DISABLE_RESPONSE = SimpleSOAPClient::ENVELOPE % <<EOS
|
108
|
+
<ns1:disableResponse xmlns:ns1="http://recurring.services.adyen.com">
|
109
|
+
<ns1:result>
|
110
|
+
<response xmlns="http://recurring.services.adyen.com">
|
111
|
+
%s
|
112
|
+
</response>
|
113
|
+
</ns1:result>
|
114
|
+
</ns1:disableResponse>
|
115
|
+
EOS
|
116
|
+
|
117
|
+
# @return [DisableResponse] A ‘disable succeeded’ response instance.
|
118
|
+
def disabled_stub
|
119
|
+
http_response = Net::HTTPOK.new('1.1', '200', 'OK')
|
120
|
+
def http_response.body; DISABLE_RESPONSE % DisableResponse::DISABLED_RESPONSES.first; end
|
121
|
+
RecurringService::DisableResponse.new(http_response)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Assigns a {#disabled_stub}, meaning the subsequent disable request will be successful.
|
125
|
+
def stub_disabled!
|
126
|
+
@stubbed_response = disabled_stub
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
extend TestHelpers
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Adyen
|
2
|
+
module API
|
3
|
+
# A simple wrapper around the raw response body returned by Adyen. It abstracts away the
|
4
|
+
# differences between REXML and Nokogiri, ensuring that this library will always work.
|
5
|
+
#
|
6
|
+
# At load time, it will first check if Nokogiri is available, otherwise REXML is used. This
|
7
|
+
# means that if you want to use Nokogiri and have it installed as a gem, you will have to make
|
8
|
+
# sure rubygems is loaded and the gem has been activated. Or assign the backend to use.
|
9
|
+
class XMLQuerier
|
10
|
+
# The namespaces used by Adyen.
|
11
|
+
NS = {
|
12
|
+
'soap' => 'http://schemas.xmlsoap.org/soap/envelope/',
|
13
|
+
'payment' => 'http://payment.services.adyen.com',
|
14
|
+
'recurring' => 'http://recurring.services.adyen.com',
|
15
|
+
'common' => 'http://common.services.adyen.com'
|
16
|
+
}
|
17
|
+
|
18
|
+
class << self
|
19
|
+
# @return [:rexml, :nokogiri] The XML backend to use.
|
20
|
+
attr_reader :backend
|
21
|
+
def backend=(backend)
|
22
|
+
@backend = backend
|
23
|
+
class_eval do
|
24
|
+
private
|
25
|
+
if backend == :nokogiri
|
26
|
+
def document_for_xml(xml)
|
27
|
+
Nokogiri::XML::Document.parse(xml)
|
28
|
+
end
|
29
|
+
def perform_xpath(query)
|
30
|
+
@node.xpath(query, NS)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
def document_for_xml(xml)
|
34
|
+
REXML::Document.new(xml)
|
35
|
+
end
|
36
|
+
def perform_xpath(query)
|
37
|
+
REXML::XPath.match(@node, query, NS)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
begin
|
45
|
+
require 'nokogiri'
|
46
|
+
self.backend = :nokogiri
|
47
|
+
rescue LoadError
|
48
|
+
require 'rexml/document'
|
49
|
+
self.backend = :rexml
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param [String, Array, Nokogiri::XML::NodeSet] data The XML data to wrap.
|
53
|
+
def initialize(data)
|
54
|
+
@node = data.is_a?(String) ? document_for_xml(data) : data
|
55
|
+
end
|
56
|
+
|
57
|
+
# @param [String] query The xpath query to perform.
|
58
|
+
# @yield [XMLQuerier] A new XMLQuerier scoped to the given +query+.
|
59
|
+
# @return [XMLQuerier] A new XMLQuerier scoped to the given +query+. Or, if a block is given,
|
60
|
+
# the result of calling the block.
|
61
|
+
def xpath(query)
|
62
|
+
result = self.class.new(perform_xpath(query))
|
63
|
+
block_given? ? yield(result) : result
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [String] query The xpath query to perform.
|
67
|
+
# @return [String] The contents of the text node indicated by the given +query+.
|
68
|
+
def text(query)
|
69
|
+
xpath("#{query}/text()").to_s.strip
|
70
|
+
end
|
71
|
+
|
72
|
+
# @return [Array, Nokogiri::XML::NodeSet] The children of this node.
|
73
|
+
def children
|
74
|
+
@node.first.children
|
75
|
+
end
|
76
|
+
|
77
|
+
# @return [Boolean] Returns whether or not this node is empty.
|
78
|
+
def empty?
|
79
|
+
@node.empty?
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [String] A string representation of this node.
|
83
|
+
def to_s
|
84
|
+
Array === @node ? @node.join("") : @node.to_s
|
85
|
+
end
|
86
|
+
|
87
|
+
# @yield [XMLQuerier] A member of this node set, ready to be queried.
|
88
|
+
# @return [Array] The list of nodes wrapped in XMLQuerier instances.
|
89
|
+
def map(&block)
|
90
|
+
@node.map { |n| self.class.new(n) }.map(&block)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
class Adyen::Configuration
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@default_api_params = {}
|
5
|
+
@default_form_params = {}
|
6
|
+
@form_skins = {}
|
7
|
+
end
|
8
|
+
|
9
|
+
# The Rails environment for which to use to Adyen "live" environment.
|
10
|
+
LIVE_RAILS_ENVIRONMENTS = ['production']
|
11
|
+
|
12
|
+
# Setter voor the current Adyen environment.
|
13
|
+
# @param ['test', 'live'] env The Adyen environment to use
|
14
|
+
def environment=(env)
|
15
|
+
@environment = env
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the current Adyen environment, either test or live.
|
19
|
+
#
|
20
|
+
# It will return the +override+ value if set, it will return the value set
|
21
|
+
# using Adyen.configuration.environment= otherwise. If this value also isn't set, the
|
22
|
+
# environment is determined with autodetect_environment.
|
23
|
+
#
|
24
|
+
# @param ['test', 'live'] override An environment to override the default with.
|
25
|
+
# @return ['test', 'live'] The Adyen environment that is currently being used.
|
26
|
+
def environment(override = nil)
|
27
|
+
override || @environment || autodetect_environment
|
28
|
+
end
|
29
|
+
|
30
|
+
# Autodetects the Adyen environment based on the RAILS_ENV constant.
|
31
|
+
# @return ['test', 'live'] The Adyen environment that corresponds to the Rails environment
|
32
|
+
def autodetect_environment
|
33
|
+
rails_env = if defined?(::Rails) && ::Rails.respond_to?(:env)
|
34
|
+
::Rails.env.to_s
|
35
|
+
elsif defined?(::RAILS_ENV)
|
36
|
+
::RAILS_ENV.to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
LIVE_RAILS_ENVIRONMENTS.include?(rails_env) ? 'live' : 'test'
|
40
|
+
end
|
41
|
+
|
42
|
+
# The username that’s used to authenticate for the Adyen SOAP services. It should look
|
43
|
+
# something like ‘+ws@AndyInc.SuperShop+’
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
attr_accessor :api_username
|
47
|
+
|
48
|
+
# The password that’s used to authenticate for the Adyen SOAP services. You can configure it
|
49
|
+
# in the user management tool of the merchant area.
|
50
|
+
#
|
51
|
+
# @return [String]
|
52
|
+
attr_accessor :api_password
|
53
|
+
|
54
|
+
# Default arguments that will be used for every API call. You can override these default
|
55
|
+
# values by passing a diffferent value to the service class’s constructor.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# Adyen.configuration.default_api_params[:merchant_account] = 'SuperShop'
|
59
|
+
#
|
60
|
+
# @return [Hash]
|
61
|
+
attr_accessor :default_api_params
|
62
|
+
|
63
|
+
# Default arguments that will be used for in every HTML form.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# Adyen.configuration.default_form_params[:shared_secret] = 'secret'
|
67
|
+
#
|
68
|
+
# @return [Hash]
|
69
|
+
attr_accessor :default_form_params
|
70
|
+
|
71
|
+
######################################################
|
72
|
+
# SKINS
|
73
|
+
######################################################
|
74
|
+
|
75
|
+
# Returns all registered skins and their accompanying skin code and shared secret.
|
76
|
+
#
|
77
|
+
# @return [Hash] The hash of registered skins.
|
78
|
+
attr_reader :form_skins
|
79
|
+
|
80
|
+
# Sets the registered skins.
|
81
|
+
#
|
82
|
+
# @param [Hash<Symbol, Hash>] hash A hash with the skin name as key and the skin parameter hash
|
83
|
+
# (which should include +:skin_code+ and +:shared_secret+) as value.
|
84
|
+
#
|
85
|
+
# @see Adyen::Configuration.register_form_skin
|
86
|
+
def form_skins=(hash)
|
87
|
+
@form_skins = hash.inject({}) do |skins, (name, skin)|
|
88
|
+
skins[name.to_sym] = skin.merge(:name => name.to_sym)
|
89
|
+
skins
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Registers a skin for later use.
|
94
|
+
#
|
95
|
+
# You can store a skin using a self defined symbol. Once the skin is registered,
|
96
|
+
# you can refer to it using this symbol instead of the hard-to-remember skin code.
|
97
|
+
# Moreover, the skin's shared_secret will be looked up automatically for calculting
|
98
|
+
# signatures.
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# Adyen::Configuration.register_form_skin(:my_skin, 'dsfH67PO', 'Dfs*7uUln9')
|
102
|
+
#
|
103
|
+
# @param [Symbol] name The name of the skin.
|
104
|
+
# @param [String] skin_code The skin code for this skin, as defined by Adyen.
|
105
|
+
# @param [String] shared_secret The shared secret used for signature calculation.
|
106
|
+
def register_form_skin(name, skin_code, shared_secret)
|
107
|
+
@form_skins[name.to_sym] = { :name => name.to_sym, :skin_code => skin_code, :shared_secret => shared_secret }
|
108
|
+
end
|
109
|
+
|
110
|
+
# Returns a skin information by name.
|
111
|
+
#
|
112
|
+
# @param [Symbol] skin_name The name of the skin
|
113
|
+
# @return [Hash, nil] A hash with the skin information, or nil if not found.
|
114
|
+
def form_skin_by_name(skin_name)
|
115
|
+
@form_skins[skin_name.to_sym]
|
116
|
+
end
|
117
|
+
|
118
|
+
# Returns skin information by code code.
|
119
|
+
#
|
120
|
+
# @param [String] skin_code The code of the skin.
|
121
|
+
#
|
122
|
+
# @return [Hash, nil] A hash with the skin information, or nil if not found.
|
123
|
+
def form_skin_by_code(skin_code)
|
124
|
+
if skin = @form_skins.detect { |(name, skin)| skin[:skin_code] == skin_code }
|
125
|
+
skin.last
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns the shared secret belonging to a skin.
|
130
|
+
#
|
131
|
+
# @param [String] skin_code The skin code of the skin
|
132
|
+
#
|
133
|
+
# @return [String, nil] The shared secret for the skin, or nil if not found.
|
134
|
+
def form_skin_shared_secret_by_code(skin_code)
|
135
|
+
if skin = form_skin_by_code(skin_code)
|
136
|
+
skin[:shared_secret]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|