Module: Adyen::Form

Extended by:
ActionView::Helpers::TagHelper
Defined in:
lib/adyen/form.rb

Constant Summary collapse

ACTION_URL =
"https://%s.adyen.com/hpp/select.shtml"

Class Method Summary collapse

Class Method Details

.calculate_signature(attributes) ⇒ Object



26
27
28
# File 'lib/adyen/form.rb', line 26

def self.calculate_signature(attributes)
   Adyen::Encoding.hmac_base64(attributes.delete(:shared_secret), calculate_signature_string(attributes))
end

.calculate_signature_string(attributes) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/adyen/form.rb', line 15

def self.calculate_signature_string(attributes)
  merchant_sig_string = ""
  merchant_sig_string << attributes[:payment_amount].to_s    << attributes[:currency_code].to_s      << 
                         attributes[:ship_before_date].to_s  << attributes[:merchant_reference].to_s << 
                         attributes[:skin_code].to_s         << attributes[:merchant_account].to_s   <<
                         attributes[:session_validity].to_s  << attributes[:shopper_email].to_s      <<
                         attributes[:shopper_reference].to_s << attributes[:recurring_contract].to_s <<
                         attributes[:allowed_methods].to_s   << attributes[:blocked_methods].to_s    <<
                         attributes[:shopper_statement].to_s << attributes[:billing_address_type].to_s
end

.do_attribute_transformations!(attributes = {}) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/adyen/form.rb', line 30

def self.do_attribute_transformations!(attributes = {})
  raise "YENs are not yet supported!" if attributes[:currency_code] == 'JPY' # TODO: fixme
  
  attributes[:recurring_contract] = 'DEFAULT' if attributes.delete(:recurring) == true
  attributes[:order_data]         = Adyen::Encoding.gzip_base64(attributes.delete(:order_data_raw)) if attributes[:order_data_raw]
  attributes[:ship_before_date]   = Adyen::Formatter::DateTime.fmt_date(attributes[:ship_before_date])
  attributes[:session_validity]   = Adyen::Formatter::DateTime.fmt_time(attributes[:session_validity])
end

.hidden_fields(attributes = {}) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/adyen/form.rb', line 40

def self.hidden_fields(attributes = {})
  do_attribute_transformations!(attributes)

  raise "Cannot generate form: :currency code attribute not found!"         unless attributes[:currency_code]
  raise "Cannot generate form: :payment_amount code attribute not found!"   unless attributes[:payment_amount]      
  raise "Cannot generate form: :merchant_account attribute not found!"      unless attributes[:merchant_account]
  raise "Cannot generate form: :skin_code attribute not found!"             unless attributes[:skin_code]
  raise "Cannot generate form: :shared_secret signing secret not provided!" unless attributes[:shared_secret]
  
  # Merchant signature
  attributes[:merchant_sig] = calculate_signature(attributes)
                         
  # Generate hidden input tags
  attributes.map { |key, value| 
    self.tag(:input, :type => 'hidden', :name => key.to_s.camelize(:lower), :value => value)
  }.join("\n")
end

.redirect_signature(params, shared_secret) ⇒ Object



62
63
64
# File 'lib/adyen/form.rb', line 62

def self.redirect_signature(params, shared_secret)
  Adyen::Encoding.hmac_base64(shared_secret, redirect_signature_string(params))
end

.redirect_signature_check(params, shared_secret) ⇒ Object



66
67
68
# File 'lib/adyen/form.rb', line 66

def self.redirect_signature_check(params, shared_secret)
  params[:merchantSig] == redirect_signature(params, shared_secret)
end

.redirect_signature_string(params) ⇒ Object



58
59
60
# File 'lib/adyen/form.rb', line 58

def self.redirect_signature_string(params)
  params[:authResult].to_s + params[:pspReference].to_s + params[:merchantReference].to_s + params[:skinCode].to_s
end

.url(environment = nil) ⇒ Object



10
11
12
13
# File 'lib/adyen/form.rb', line 10

def self.url(environment = nil)
  environment ||= Adyen.environment(environment)
  Adyen::Form::ACTION_URL % environment.to_s
end