Class: Solon::SagepayResponse

Inherits:
Object
  • Object
show all
Defined in:
lib/solon/sagepay_response.rb

Direct Known Subclasses

SagepayCallback

Instance Method Summary collapse

Constructor Details

#initialize(response) ⇒ SagepayResponse

Returns a new instance of SagepayResponse.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/solon/sagepay_response.rb', line 4

def initialize(response)
  ::Rails.logger.debug "Sagepay response: #{response}"
  @response = response
  if @response.is_a?(String)
    response.split("\r\n").each do |line|
      key, *value = line.split("=")
      value = value.join("=")
      self[key] = value
    end
  elsif @response.is_a?(Hash)
    response.each do |key, value|
      self[key] = value
    end
  else
    raise Solon::Error, "Cannot parse response of type #{@response.class}"
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(id, *args) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/solon/sagepay_response.rb', line 22

def method_missing(id, *args)
  id = id.to_s
  @values ||= {}      
  
  # This is incompatible with ruby 1.9
  
  if RUBY_VERSION =~ /1.8/
    case id[-1]
      when 61 # :blah=
        @values[id[0..-2].to_sym] = args[0]
      when 63 # :blah?
        @values.has_key?(id[0..-2].to_sym)
      else # :blah
        @values[id.to_sym]
    end
  else
    case id.last
      when '=' # :blah=
        @values[id[0..-2].to_sym] = args[0]
      when '?' # :blah?
        @values.has_key?(id[0..-2].to_sym)
      else # :blah
        @values[id.to_sym]
    end
  end

end

Instance Method Details

#[](key) ⇒ Object



54
55
56
# File 'lib/solon/sagepay_response.rb', line 54

def [](key)
  self.send("#{mapping[key] || key}")
end

#[]=(key, value) ⇒ Object



50
51
52
# File 'lib/solon/sagepay_response.rb', line 50

def []=(key, value)
  self.send("#{mapping[key] || key}=", CGI.unescape(value))
end

#approved?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/solon/sagepay_response.rb', line 72

def approved?
  self.status == SolonGateway::APPROVED
end

#verify!Object

TODO: Make this work, currently fails all

Raises:



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/solon/sagepay_response.rb', line 60

def verify!
  return self
  md5 = Digest::MD5.new
  md5 << "#{self.vps_transaction_id}#{self.transaction_reference}#{self.status}#{self.transaction_authorisation_number}" +
  "#{Solon::Config.vendor}#{self.avs_cv2_result}#{self.security_key}#{self.address_result}#{self.post_code_result}" +
  "#{self.cv2_result}#{self.gift_aid}#{self.status_3d_secure}#{self.code_3d_secure}"
  
  raise Solon::Error, "MD5 appears to have been tampered with! (#{md5.hexdigest} != #{self.vps_signature})" unless md5.hexdigest == self.vps_signature

  self
end