adyen 0.1.5 → 0.2.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.
@@ -15,10 +15,14 @@ automated test suite to assert the integration is working correctly.
15
15
 
16
16
  == Installation
17
17
 
18
- This plugin can either be installed as gem or Rails plugin:
18
+ Add the following line to your <tt>environment.rb</tt> and run <tt>rake gems:install</tt>
19
+ to make the Adyen functionality available in your Rails project:
19
20
 
20
- gem install wvanbergen-adyen --source http://gems.github.com # as gem
21
- script/plugin install git://github.com/wvanbergen/adyen.git # as plugin
21
+ config.gem 'adyen', :source => 'http://gemcutter.org
22
+
23
+ You can also install it as a Rails plugin (*deprecated*):
24
+
25
+ script/plugin install git://github.com/wvanbergen/adyen.git
22
26
 
23
27
  == Usage
24
28
 
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'adyen'
3
- s.version = "0.1.5"
4
- s.date = "2009-10-07"
3
+ s.version = "0.2.0"
4
+ s.date = "2009-10-21"
5
5
 
6
6
  s.summary = "Integrate Adyen payment services in you Ruby on Rails application."
7
7
  s.description = <<-EOS
@@ -5,6 +5,22 @@ module Adyen
5
5
 
6
6
  extend ActionView::Helpers::TagHelper
7
7
 
8
+ def self.skins
9
+ @skins ||= {}
10
+ end
11
+
12
+ def self.add_skin(name, skin_code, shared_secret)
13
+ self.skins[name] = {:name => name, :skin_code => skin_code, :shared_secret => shared_secret }
14
+ end
15
+
16
+ def self.skin_by_name(skin_name)
17
+ self.skins[skin_name]
18
+ end
19
+
20
+ def self.skin_by_code(skin_code)
21
+ self.skins.detect { |(name, skin)| skin[:skin_code] == skin_code }.last rescue nil
22
+ end
23
+
8
24
  ACTION_URL = "https://%s.adyen.com/hpp/select.shtml"
9
25
 
10
26
  def self.url(environment = nil)
@@ -34,6 +50,12 @@ module Adyen
34
50
  attributes[:order_data] = Adyen::Encoding.gzip_base64(attributes.delete(:order_data_raw)) if attributes[:order_data_raw]
35
51
  attributes[:ship_before_date] = Adyen::Formatter::DateTime.fmt_date(attributes[:ship_before_date])
36
52
  attributes[:session_validity] = Adyen::Formatter::DateTime.fmt_time(attributes[:session_validity])
53
+
54
+ if attributes[:skin]
55
+ skin = Adyen::Form.skin_by_name(attributes.delete(:skin))
56
+ attributes[:skin_code] ||= skin[:skin_code]
57
+ attributes[:shared_secret] ||= skin[:shared_secret]
58
+ end
37
59
  end
38
60
 
39
61
  def self.payment_fields(attributes = {})
@@ -60,16 +82,21 @@ module Adyen
60
82
  self.tag(:input, :type => 'hidden', :name => key.to_s.camelize(:lower), :value => value)
61
83
  }.join("\n")
62
84
  end
85
+
86
+ def self.lookup_shared_secret(skin_code)
87
+ skin = skin_by_code(skin_code)[:shared_secret] rescue nil
88
+ end
63
89
 
64
90
  def self.redirect_signature_string(params)
65
91
  params[:authResult].to_s + params[:pspReference].to_s + params[:merchantReference].to_s + params[:skinCode].to_s
66
92
  end
67
93
 
68
- def self.redirect_signature(params, shared_secret)
94
+ def self.redirect_signature(params, shared_secret = nil)
95
+ shared_secret ||= lookup_shared_secret(params[:skinCode])
69
96
  Adyen::Encoding.hmac_base64(shared_secret, redirect_signature_string(params))
70
97
  end
71
98
 
72
- def self.redirect_signature_check(params, shared_secret)
99
+ def self.redirect_signature_check(params, shared_secret = nil)
73
100
  params[:merchantSig] == redirect_signature(params, shared_secret)
74
101
  end
75
102
 
@@ -2,6 +2,10 @@ require "#{File.dirname(__FILE__)}/spec_helper.rb"
2
2
 
3
3
  describe Adyen::Form do
4
4
 
5
+ before(:all) do
6
+ Adyen::Form.add_skin(:testing, '4aD37dJA', 'Kah942*$7sdp0)')
7
+ end
8
+
5
9
  describe 'Action URLs' do
6
10
 
7
11
  before(:each) do
@@ -32,9 +36,6 @@ describe Adyen::Form do
32
36
  before(:each) do
33
37
  # Example taken from integration manual
34
38
 
35
- # Shared secret between you and Adyen, only valid for this skinCode!
36
- @shared_secret = 'Kah942*$7sdp0)'
37
-
38
39
  # Example get params sent back with redirect
39
40
  @params = { :authResult => 'AUTHORISED', :pspReference => '1211992213193029',
40
41
  :merchantReference => 'Internet Order 12345', :skinCode => '4aD37dJA',
@@ -46,19 +47,24 @@ describe Adyen::Form do
46
47
  end
47
48
 
48
49
  it "should calculate the signature correctly" do
49
- Adyen::Form.redirect_signature(@params, @shared_secret).should eql(@params[:merchantSig])
50
+ Adyen::Form.redirect_signature(@params).should eql(@params[:merchantSig])
50
51
  end
51
52
 
52
- it "should check the signature correctly" do
53
- Adyen::Form.redirect_signature_check(@params, @shared_secret).should be_true
53
+ it "should check the signature correctly with explicit shared signature" do
54
+ Adyen::Form.redirect_signature_check(@params, 'Kah942*$7sdp0)').should be_true
54
55
  end
55
56
 
57
+ it "should check the signature correctly using the stored shared secret" do
58
+ Adyen::Form.redirect_signature_check(@params).should be_true
59
+ end
60
+
61
+
56
62
  it "should detect a tampered field" do
57
- Adyen::Form.redirect_signature_check(@params.merge(:pspReference => 'tampered'), @shared_secret).should be_false
63
+ Adyen::Form.redirect_signature_check(@params.merge(:pspReference => 'tampered')).should be_false
58
64
  end
59
65
 
60
66
  it "should detect a tampered signature" do
61
- Adyen::Form.redirect_signature_check(@params.merge(:merchantSig => 'tampered'), @shared_secret).should be_false
67
+ Adyen::Form.redirect_signature_check(@params.merge(:merchantSig => 'tampered')).should be_false
62
68
  end
63
69
 
64
70
  end
@@ -66,10 +72,10 @@ describe Adyen::Form do
66
72
  describe 'redirect URL generation' do
67
73
  before(:each) do
68
74
  @attributes = { :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
69
- :merchant_reference => 'Internet Order 12345', :skin_code => '4aD37dJA',
75
+ :merchant_reference => 'Internet Order 12345', :skin => :testing,
70
76
  :merchant_account => 'TestMerchant', :session_validity => 1.hour.from_now }
71
77
 
72
- @redirect_url = Adyen::Form.redirect_url(@attributes.merge(:shared_secret => 'secret'))
78
+ @redirect_url = Adyen::Form.redirect_url(@attributes)
73
79
  end
74
80
 
75
81
  it "should return an URL pointing to the adyen server" do
@@ -93,12 +99,12 @@ describe Adyen::Form do
93
99
 
94
100
  before(:each) do
95
101
  @attributes = { :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
96
- :merchant_reference => 'Internet Order 12345', :skin_code => '4aD37dJA',
102
+ :merchant_reference => 'Internet Order 12345', :skin => :testing,
97
103
  :merchant_account => 'TestMerchant', :session_validity => 1.hour.from_now }
98
104
  end
99
105
 
100
106
  it "should generate a valid payment form" do
101
- content_tag(:form, Adyen::Form.hidden_fields(@attributes.merge(:shared_secret => 'secret')),
107
+ content_tag(:form, Adyen::Form.hidden_fields(@attributes),
102
108
  :action => Adyen::Form.url, :method => :post).should have_adyen_payment_form
103
109
  end
104
110
  end
@@ -108,9 +114,10 @@ describe Adyen::Form do
108
114
  # This example is taken from the Adyen integration manual
109
115
 
110
116
  before(:each) do
117
+
111
118
  @attributes = { :currency_code => 'GBP', :payment_amount => 10000,
112
119
  :ship_before_date => '2007-10-20', :merchant_reference => 'Internet Order 12345',
113
- :skin_code => '4aD37dJA', :merchant_account => 'TestMerchant',
120
+ :skin => :testing, :merchant_account => 'TestMerchant',
114
121
  :session_validity => '2007-10-11T11:00:00Z' }
115
122
 
116
123
  Adyen::Form.do_attribute_transformations!(@attributes)
@@ -120,9 +127,9 @@ describe Adyen::Form do
120
127
  signature_string = Adyen::Form.calculate_signature_string(@attributes)
121
128
  signature_string.should eql("10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Z")
122
129
  end
123
-
130
+
124
131
  it "should calculate the signature correctly" do
125
- signature = Adyen::Form.calculate_signature(@attributes.merge(:shared_secret => 'Kah942*$7sdp0)'))
132
+ signature = Adyen::Form.calculate_signature(@attributes)
126
133
  signature.should eql('x58ZcRVL1H6y+XSeBGrySJ9ACVo=')
127
134
  end
128
135
 
@@ -138,10 +145,8 @@ describe Adyen::Form do
138
145
  # Add the required recurrent payment attributes
139
146
  @attributes.merge!(:recurring_contract => 'DEFAULT', :shopper_reference => 'grasshopper52', :shopper_email => 'gras.shopper@somewhere.org')
140
147
 
141
- signature = Adyen::Form.calculate_signature(@attributes.merge(:shared_secret => 'Kah942*$7sdp0)'))
148
+ signature = Adyen::Form.calculate_signature(@attributes)
142
149
  signature.should eql('F2BQEYbE+EUhiRGuPtcD16Gm7JY=')
143
150
  end
144
-
145
151
  end
146
-
147
152
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adyen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-10-07 00:00:00 +02:00
13
+ date: 2009-10-21 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency