activemerchant 1.10.0 → 1.11.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.
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG CHANGED
@@ -1,5 +1,18 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
+ == Version 1.11.0 (Feb 11, 2011)
4
+
5
+ * Bump dependency for activesupport from 2.3.2 to 2.3.8 [Soleone]
6
+ * Garanti: Normalize text in xml fields for non-standard characters [Selem Delul]
7
+ * Garanti: Make sure order number does not contain illegal characters [Soleone]
8
+ * Fix ActionView tests for ActiveSupport 3.0.4 [Soleone]
9
+ * DirecPay: Make address information editable by default [Soleone]
10
+ * Fix ePDQ credit to expect and handle full authorization [Nathaniel Talbott]
11
+ * Add Barclays ePDQ Gateway [Nathaniel Talbott]
12
+ * Add default fixture for Garanti and don't use fixture for Garanti [cody]
13
+ * Add cms param for ePay [ePay]
14
+ * Add Valitor Integration [Nathaniel Talbott]
15
+
3
16
  == Version 1.10.0 (Jan 20, 2011)
4
17
 
5
18
  * PayPal Express: Support returning payer phone number [Soleone]
data/CONTRIBUTORS CHANGED
@@ -187,4 +187,15 @@ Quantum Gateway
187
187
 
188
188
  BluePay Gateway
189
189
 
190
- * Nathaniel Talbott
190
+ * Mel Sleight
191
+ * Refactored by Nathaniel Talbott
192
+
193
+ Valitor Integration (January 2011)
194
+
195
+ * Nathaniel Talbott
196
+ * Sponsored by Sævar Öfjörð Magnússon
197
+
198
+ Barclays ePDQ
199
+
200
+ * Original code by Rob W (rfwatson)
201
+ * Refactored by Nathaniel Talbott
data/README.rdoc CHANGED
@@ -13,6 +13,7 @@ The {ActiveMerchant Wiki}[http://github.com/Shopify/active_merchant/wikis] conta
13
13
 
14
14
  * {Authorize.Net CIM}[http://www.authorize.net/] - US
15
15
  * {Authorize.Net}[http://www.authorize.net/] - US
16
+ * {Barclays ePDQ}[http://www.barclaycard.co.uk/business/accepting-payments/epdq-mpi/] - UK
16
17
  * {Beanstream.com}[http://www.beanstream.com/] - CA
17
18
  * {BluePay}[http://www.bluepay.com/] - US
18
19
  * {Braintree}[http://www.braintreepaymentsolutions.com] - US
@@ -82,6 +83,7 @@ The {ActiveMerchant Wiki}[http://github.com/Shopify/active_merchant/wikis] conta
82
83
  * {Nochex}[http://www.nochex.com]
83
84
  * {PayPal Website Payments Standard}[https://www.paypal.com/cgi-bin/webscr?cmd=_wp-standard-overview-outside]
84
85
  * {SagePay Form}[http://www.sagepay.com/products_services/sage_pay_go/integration/form]
86
+ * {Valitor}[http://www.valitor.is/] - IS
85
87
 
86
88
  == Download
87
89
 
@@ -32,6 +32,7 @@ require 'active_support/core_ext/class/attribute_accessors'
32
32
  require 'active_support/core_ext/class/delegating_attributes'
33
33
  require 'active_support/core_ext/module/attribute_accessors'
34
34
  require 'active_support/core_ext/kernel/requires'
35
+ require 'active_support/core_ext/module/deprecation'
35
36
  require 'active_support/base64'
36
37
  require 'active_support/secure_random'
37
38
 
@@ -0,0 +1,304 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class BarclaysEpdqGateway < Gateway
4
+ TEST_URL = 'https://secure2.mde.epdq.co.uk:11500'
5
+ LIVE_URL = 'https://secure2.epdq.co.uk:11500'
6
+
7
+ self.supported_countries = ['UK']
8
+ self.default_currency = 'GBP'
9
+ self.supported_cardtypes = [:visa, :master, :maestro, :switch ]
10
+ self.money_format = :cents
11
+ self.homepage_url = 'http://www.barclaycard.co.uk/business/accepting-payments/epdq-mpi/'
12
+ self.display_name = 'Barclays ePDQ'
13
+
14
+ def initialize(options = {})
15
+ requires!(options, :login, :password, :client_id)
16
+ @options = options
17
+ super
18
+ end
19
+
20
+ def authorize(money, creditcard, options = {})
21
+ document = Document.new(self, @options) do
22
+ add_order_form(options[:order_id]) do
23
+ add_consumer(options) do
24
+ add_creditcard(creditcard)
25
+ end
26
+ add_transaction(:PreAuth, money)
27
+ end
28
+ end
29
+
30
+ commit(document)
31
+ end
32
+
33
+ def purchase(money, creditcard, options = {})
34
+ # disable fraud checks if this is a repeat order:
35
+ if options[:payment_number] && (options[:payment_number] > 1)
36
+ no_fraud = true
37
+ else
38
+ no_fraud = options[:no_fraud]
39
+ end
40
+ document = Document.new(self, @options, :no_fraud => no_fraud) do
41
+ add_order_form(options[:order_id], options[:group_id]) do
42
+ add_consumer(options) do
43
+ add_creditcard(creditcard)
44
+ end
45
+ add_transaction(:Auth, money, options)
46
+ end
47
+ end
48
+ commit(document)
49
+ end
50
+
51
+ # authorization is your unique order ID, not the authorization
52
+ # code returned by ePDQ
53
+ def capture(money, authorization, options = {})
54
+ document = Document.new(self, @options) do
55
+ add_order_form(authorization) do
56
+ add_transaction(:PostAuth, money)
57
+ end
58
+ end
59
+
60
+ commit(document)
61
+ end
62
+
63
+ # authorization is your unique order ID, not the authorization
64
+ # code returned by ePDQ
65
+ def credit(money, creditcard_or_authorization, options = {})
66
+ if creditcard_or_authorization.is_a?(String)
67
+ credit_existing_order(money, creditcard_or_authorization, options)
68
+ else
69
+ credit_new_order(money, creditcard_or_authorization, options)
70
+ end
71
+ end
72
+
73
+ def void(authorization, options = {})
74
+ document = Document.new(self, @options) do
75
+ add_order_form(authorization) do
76
+ add_transaction(:Void)
77
+ end
78
+ end
79
+
80
+ commit(document)
81
+ end
82
+
83
+ private
84
+ def credit_new_order(money, creditcard, options)
85
+ document = Document.new(self, @options) do
86
+ add_order_form do
87
+ add_consumer(options) do
88
+ add_creditcard(creditcard)
89
+ end
90
+ add_transaction(:Credit, money)
91
+ end
92
+ end
93
+
94
+ commit(document)
95
+ end
96
+
97
+ def credit_existing_order(money, authorization, options)
98
+ order_id, _ = authorization.split(":")
99
+ document = Document.new(self, @options) do
100
+ add_order_form(order_id) do
101
+ add_transaction(:Credit, money)
102
+ end
103
+ end
104
+
105
+ commit(document)
106
+ end
107
+
108
+ def parse(body)
109
+ parser = Parser.new(body)
110
+ response = parser.parse
111
+ Response.new(response[:success], response[:message], response,
112
+ :test => test?,
113
+ :authorization => response[:authorization],
114
+ :avs_result => response[:avsresponse],
115
+ :cvv_result => response[:cvv_result],
116
+ :order_id => response[:order_id],
117
+ :raw_response => response[:raw_response]
118
+ )
119
+ end
120
+
121
+ def commit(document)
122
+ url = (test? ? TEST_URL : LIVE_URL)
123
+ data = ssl_post(url, document.to_xml)
124
+ parse(data)
125
+ end
126
+
127
+ class Parser
128
+ def initialize(response)
129
+ @response = response
130
+ end
131
+
132
+ def parse
133
+ doc = REXML::Document.new(@response)
134
+ auth_type = find(doc, "//Transaction/Type").to_sym
135
+
136
+ message = find(doc, "//Message/Text")
137
+ if message.blank?
138
+ message = find(doc, "//Transaction/CardProcResp/CcReturnMsg")
139
+ end
140
+
141
+ case auth_type.to_sym
142
+ when :Credit, :Void
143
+ success = find(doc, "//CcReturnMsg") == "Approved."
144
+ else
145
+ success = find(doc, "//Transaction/AuthCode").present?
146
+ end
147
+
148
+ {
149
+ :success => success,
150
+ :message => message,
151
+ :authorization =>
152
+ [find(doc, "//OrderFormDoc/Id"), find(doc, "//Transaction/Id")].join(":"),
153
+ :avs_result => find(doc, "//Transaction/AvsRespCode"),
154
+ :cvv_result => find(doc, "//Transaction/Cvv2Resp"),
155
+ :order_id => find(doc, "//OrderFormDoc/Transaction/Id"),
156
+ :raw_response => @response
157
+ }
158
+ end
159
+
160
+ def find(doc, xpath)
161
+ REXML::XPath.first(doc, xpath).try(:text)
162
+ end
163
+ end
164
+
165
+ class Document
166
+ attr_reader :type, :xml
167
+
168
+ PAYMENT_INTERVALS = {
169
+ :days => 'D',
170
+ :months => 'M'
171
+ }
172
+
173
+ EPDQ_CARD_TYPES = {
174
+ :visa => 1,
175
+ :master => 2,
176
+ :switch => 9,
177
+ :maestro => 10,
178
+ }
179
+
180
+ def initialize(gateway, options = {}, document_options = {}, &block)
181
+ @gateway = gateway
182
+ @options = options
183
+ @document_options = document_options
184
+ @xml = Builder::XmlMarkup.new(:indent => 2)
185
+ build(&block)
186
+ end
187
+
188
+ def to_xml
189
+ @xml.target!
190
+ end
191
+
192
+ def build(&block)
193
+ xml.instruct!(:xml, :version => '1.0')
194
+ xml.EngineDocList do
195
+ xml.DocVersion "1.0"
196
+ xml.EngineDoc do
197
+ xml.ContentType "OrderFormDoc"
198
+ xml.User do
199
+ xml.Name(@options[:login])
200
+ xml.Password(@options[:password])
201
+ xml.ClientId({ :DataType => "S32" }, @options[:client_id])
202
+ end
203
+ xml.Instructions do
204
+ if @document_options[:no_fraud]
205
+ xml.Pipeline "PaymentNoFraud"
206
+ else
207
+ xml.Pipeline "Payment"
208
+ end
209
+ end
210
+ instance_eval(&block)
211
+ end
212
+ end
213
+ end
214
+
215
+ def add_order_form(order_id=nil, group_id=nil, &block)
216
+ xml.OrderFormDoc do
217
+ xml.Mode 'P'
218
+ xml.Id(order_id) if order_id
219
+ xml.GroupId(group_id) if group_id
220
+ instance_eval(&block)
221
+ end
222
+ end
223
+
224
+ def add_consumer(options=nil, &block)
225
+ xml.Consumer do
226
+ if options
227
+ xml.Email(options[:email]) if options[:email]
228
+ billing_address = options[:billing_address] || options[:address]
229
+ if billing_address
230
+ xml.BillTo do
231
+ xml.Location do
232
+ xml.Address do
233
+ xml.Street1 billing_address[:address1]
234
+ xml.Street2 billing_address[:address2]
235
+ xml.City billing_address[:city]
236
+ xml.StateProv billing_address[:state]
237
+ xml.PostalCode billing_address[:zip]
238
+ xml.Country billing_address[:country_code]
239
+ end
240
+ end
241
+ end
242
+ end
243
+ end
244
+ instance_eval(&block)
245
+ end
246
+ end
247
+
248
+ def add_creditcard(creditcard)
249
+ xml.PaymentMech do
250
+ xml.CreditCard do
251
+ xml.Type({ :DataType => 'S32' }, EPDQ_CARD_TYPES[creditcard.brand.to_sym])
252
+ xml.Number creditcard.number
253
+ xml.Expires({ :DataType => 'ExpirationDate', :Locale => 826 }, format_expiry_date(creditcard))
254
+ if creditcard.verification_value.present?
255
+ xml.Cvv2Indicator 1
256
+ xml.Cvv2Val creditcard.verification_value
257
+ else
258
+ xml.Cvv2Indicator 5
259
+ end
260
+ xml.IssueNum(creditcard.issue_number) if creditcard.issue_number.present?
261
+ end
262
+ end
263
+ end
264
+
265
+ def add_transaction(auth_type, amount = nil, options = {})
266
+ @auth_type = auth_type
267
+ xml.Transaction do
268
+ xml.Type @auth_type.to_s
269
+ if options[:payment_number] && options[:payment_number] > 1
270
+ xml.CardholderPresentCode({ :DataType => 'S32' }, 8)
271
+ else
272
+ xml.CardholderPresentCode({ :DataType => 'S32' }, 7)
273
+ end
274
+ if options[:payment_number]
275
+ xml.PaymentNumber({ :DataType => 'S32' }, options[:payment_number])
276
+ end
277
+ if options[:total_payments]
278
+ xml.TotalNumberPayments({ :DataType => 'S32' }, options[:total_payments])
279
+ end
280
+ if amount
281
+ xml.CurrentTotals do
282
+ xml.Totals do
283
+ xml.Total({ :DataType => 'Money', :Currency => 826 }, amount)
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+ # date must be formatted MM/YY
291
+ def format_expiry_date(creditcard)
292
+ month_str = "%02d" % creditcard.month
293
+ if match = creditcard.year.to_s.match(/^\d{2}(\d{2})$/)
294
+ year_str = "%02d" % match[1].to_i
295
+ else
296
+ year_str = "%02d" % creditcard.year
297
+ end
298
+ "#{month_str}/#{year_str}"
299
+ end
300
+ end
301
+ end
302
+ end
303
+ end
304
+
@@ -247,6 +247,7 @@ module ActiveMerchant #:nodoc:
247
247
 
248
248
  def authorize_post_data(params = {})
249
249
  params[:language] = '2'
250
+ params[:cms] = 'activemerchant'
250
251
  params[:accepturl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?accept=1'
251
252
  params[:declineurl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?decline=1'
252
253
  params[:merchantnumber] = @options[:login]
@@ -65,7 +65,7 @@ module ActiveMerchant #:nodoc:
65
65
 
66
66
  def build_xml_request(money, credit_card, options, &block)
67
67
  card_number = credit_card.respond_to?(:number) ? credit_card.number : ''
68
- hash_data = generate_hash_data(options[:order_id], @options[:terminal_id], card_number, amount(money), security_data)
68
+ hash_data = generate_hash_data(format_order_id(options[:order_id]), @options[:terminal_id], card_number, amount(money), security_data)
69
69
 
70
70
  xml = Builder::XmlMarkup.new(:indent => 2)
71
71
  xml.instruct! :xml, :version => "1.0", :encoding => "UTF-8"
@@ -135,7 +135,7 @@ module ActiveMerchant #:nodoc:
135
135
 
136
136
  def add_order_data(xml, options, &block)
137
137
  xml.tag! 'Order' do
138
- xml.tag! 'OrderID', options[:order_id]
138
+ xml.tag! 'OrderID', format_order_id(options[:order_id])
139
139
  xml.tag! 'GroupID'
140
140
 
141
141
  if block_given?
@@ -156,6 +156,11 @@ module ActiveMerchant #:nodoc:
156
156
  format(value, :two_digits)
157
157
  end
158
158
 
159
+ # OrderId field must be A-Za-z0-9_ format and max 36 char
160
+ def format_order_id(order_id)
161
+ order_id.to_s.gsub(/[^A-Za-z0-9_]/, '')[0...36]
162
+ end
163
+
159
164
  def add_addresses(xml, options)
160
165
  xml.tag! 'AddressList' do
161
166
  if billing_address = options[:billing_address] || options[:address]
@@ -175,18 +180,22 @@ module ActiveMerchant #:nodoc:
175
180
  end
176
181
 
177
182
  def add_address(xml, address)
178
- xml.tag! 'Name', address[:name]
183
+ xml.tag! 'Name', normalize(address[:name])
179
184
  address_text = address[:address1]
180
- address_text << " #{address[:address2]}" if address[:address2]
181
- xml.tag! 'Text', address_text
182
- xml.tag! 'City', address[:city]
183
- xml.tag! 'District', address[:state]
185
+ address_text << " #{ address[:address2]}" if address[:address2]
186
+ xml.tag! 'Text', normalize(address_text)
187
+ xml.tag! 'City', normalize(address[:city])
188
+ xml.tag! 'District', normalize(address[:state])
184
189
  xml.tag! 'PostalCode', address[:zip]
185
- xml.tag! 'Country', address[:country]
186
- xml.tag! 'Company', address[:company]
190
+ xml.tag! 'Country', normalize(address[:country])
191
+ xml.tag! 'Company', normalize(address[:company])
187
192
  xml.tag! 'PhoneNumber', address[:phone].to_s.gsub(/[^0-9]/, '') if address[:phone]
188
193
  end
189
-
194
+
195
+ def normalize(text)
196
+ ActiveSupport::Inflector.transliterate(text,'')
197
+ end
198
+
190
199
  def add_transaction_data(xml, money, options)
191
200
  xml.tag! 'Transaction' do
192
201
  xml.tag! 'Type', options[:gvp_order_type]
@@ -207,7 +216,7 @@ module ActiveMerchant #:nodoc:
207
216
  success = success?(response)
208
217
 
209
218
  Response.new(success,
210
- success ? 'Approved' : "Declined (Reason: #{response[:reason_code]} - #{response[:error_msg]})",
219
+ success ? 'Approved' : "Declined (Reason: #{response[:reason_code]} - #{response[:error_msg]} - #{response[:sys_err_msg]})",
211
220
  response,
212
221
  :test => test?,
213
222
  :authorization => response[:order_id])
@@ -41,7 +41,7 @@ module ActiveMerchant #:nodoc:
41
41
  COUNTRY = 'IND'
42
42
  CURRENCY = 'INR'
43
43
  OTHER_DETAILS = 'NULL'
44
- EDIT_ALLOWED = 'N'
44
+ EDIT_ALLOWED = 'Y'
45
45
 
46
46
  PHONE_CODES = {
47
47
  'IN' => '91',
@@ -0,0 +1,33 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Valitor
5
+ autoload :Return, 'active_merchant/billing/integrations/valitor/return.rb'
6
+ autoload :Helper, 'active_merchant/billing/integrations/valitor/helper.rb'
7
+ autoload :Notification, 'active_merchant/billing/integrations/valitor/notification.rb'
8
+
9
+ mattr_accessor :test_url
10
+ self.test_url = 'https://testvefverslun.valitor.is/1_1/'
11
+
12
+ mattr_accessor :production_url
13
+ self.production_url = 'https://vefverslun.valitor.is/1_1/'
14
+
15
+ def self.test?
16
+ (ActiveMerchant::Billing::Base.integration_mode == :test)
17
+ end
18
+
19
+ def self.service_url
20
+ (test? ? test_url : production_url)
21
+ end
22
+
23
+ def self.notification(params, options={})
24
+ Notification.new(params, options.merge(:test => test?))
25
+ end
26
+
27
+ def self.return(query_string, options={})
28
+ Return.new(query_string, options.merge(:test => test?))
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,82 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Valitor
7
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
8
+ include RequiresParameters
9
+
10
+ DEFAULT_SUCCESS_TEXT = "The transaction has been completed."
11
+
12
+ def initialize(order, account, options={})
13
+ options[:currency] ||= 'ISK'
14
+ super
15
+ add_field 'Adeinsheimild', '0'
16
+ add_field 'KaupandaUpplysingar', '0'
17
+ add_field 'SlokkvaHaus', '0'
18
+ @security_number = options[:credential2]
19
+ @amount = options[:amount]
20
+ @order = order
21
+ end
22
+
23
+ mapping :account, 'VefverslunID'
24
+ mapping :currency, 'Gjaldmidill'
25
+
26
+ mapping :order, 'Tilvisunarnumer'
27
+
28
+ mapping :notify_url, 'SlodTokstAdGjaldfaeraServerSide'
29
+ mapping :return_url, 'SlodTokstAdGjaldfaera'
30
+ mapping :cancel_return_url, 'SlodNotandiHaettirVid'
31
+
32
+ mapping :success_text, 'SlodTokstAdGjaldfaeraTexti'
33
+
34
+ mapping :language, 'Lang'
35
+
36
+ def authorize_only
37
+ add_field 'Adeinsheimild', '1'
38
+ end
39
+
40
+ def collect_customer_info
41
+ add_field 'KaupandaUpplysingar', '1'
42
+ end
43
+
44
+ def hide_header
45
+ add_field 'SlokkvaHaus', '1'
46
+ end
47
+
48
+ def product(id, options={})
49
+ raise ArgumentError, "Product id #{id} is not an integer between 1 and 500" unless id.to_i > 0 && id.to_i <= 500
50
+ requires!(options, :amount, :description)
51
+ options.assert_valid_keys([:description, :quantity, :amount, :discount])
52
+
53
+ add_field("Vara_#{id}_Verd", options[:amount])
54
+ add_field("Vara_#{id}_Fjoldi", options[:quantity] || "1")
55
+
56
+ add_field("Vara_#{id}_Lysing", options[:description]) if options[:description]
57
+ add_field("Vara_#{id}_Afslattur", options[:discount] || '0')
58
+
59
+ @products ||= []
60
+ @products << id.to_i
61
+ end
62
+
63
+ def signature
64
+ raise ArgumentError, "Security number not set" unless @security_number
65
+ parts = [@security_number, @fields['Adeinsheimild']]
66
+ @products.sort.uniq.each do |id|
67
+ parts.concat(["Vara_#{id}_Fjoldi", "Vara_#{id}_Verd", "Vara_#{id}_Afslattur"].collect{|e| @fields[e]})
68
+ end if @products
69
+ parts.concat(%w(VefverslunID Tilvisunarnumer SlodTokstAdGjaldfaera SlodTokstAdGjaldfaeraServerSide Gjaldmidill).collect{|e| @fields[e]})
70
+ Digest::MD5.hexdigest(parts.compact.join(''))
71
+ end
72
+
73
+ def form_fields
74
+ product(1, :amount => @amount, :description => @order) if Array(@products).empty?
75
+ @fields[mappings[:success_text]] ||= DEFAULT_SUCCESS_TEXT
76
+ @fields.merge('RafraenUndirskrift' => signature)
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_merchant/billing/integrations/valitor/response_fields'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Valitor
7
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
8
+ include ResponseFields
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,91 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Valitor
7
+ module ResponseFields
8
+ def success?
9
+ valid?
10
+ end
11
+ alias :complete? :success?
12
+
13
+ def test?
14
+ @options[:test]
15
+ end
16
+
17
+ def order
18
+ params['Tilvisunarnumer']
19
+ end
20
+
21
+ def received_at
22
+ params['Dagsetning']
23
+ end
24
+
25
+ def transaction_id
26
+ params['VefverslunSalaID']
27
+ end
28
+
29
+ def status
30
+ "OK"
31
+ end
32
+
33
+ def card_type
34
+ params['Kortategund']
35
+ end
36
+
37
+ def card_last_four
38
+ params['KortnumerSidustu']
39
+ end
40
+
41
+ def authorization_number
42
+ params['Heimildarnumer']
43
+ end
44
+
45
+ def transaction_number
46
+ params['Faerslunumer']
47
+ end
48
+
49
+ def customer_name
50
+ params['Nafn']
51
+ end
52
+
53
+ def customer_address
54
+ params['Heimilisfang']
55
+ end
56
+
57
+ def customer_zip
58
+ params['Postnumer']
59
+ end
60
+
61
+ def customer_city
62
+ params['Stadur']
63
+ end
64
+
65
+ def customer_country
66
+ params['Land']
67
+ end
68
+
69
+ def customer_email
70
+ params['Tolvupostfang']
71
+ end
72
+
73
+ def customer_comment
74
+ params['Athugasemdir']
75
+ end
76
+
77
+ def valid?
78
+ unless @valid
79
+ @valid = if(security_number = @options[:password])
80
+ (params['RafraenUndirskriftSvar'] == Digest::MD5.hexdigest("#{security_number}#{order}"))
81
+ else
82
+ true
83
+ end
84
+ end
85
+ @valid
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_merchant/billing/integrations/valitor/response_fields'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Valitor
7
+ class Return < ActiveMerchant::Billing::Integrations::Return
8
+ include ResponseFields
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = "1.10.0"
2
+ VERSION = "1.11.0"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemerchant
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
4
+ hash: 59
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 10
8
+ - 11
9
9
  - 0
10
- version: 1.10.0
10
+ version: 1.11.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tobias Luetke
@@ -36,7 +36,7 @@ cert_chain:
36
36
  hPaSTyVU0yCSnw==
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2011-01-20 00:00:00 +01:00
39
+ date: 2011-02-14 00:00:00 +01:00
40
40
  default_executable:
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
@@ -47,12 +47,12 @@ dependencies:
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- hash: 7
50
+ hash: 19
51
51
  segments:
52
52
  - 2
53
53
  - 3
54
- - 2
55
- version: 2.3.2
54
+ - 8
55
+ version: 2.3.8
56
56
  type: :runtime
57
57
  version_requirements: *id001
58
58
  - !ruby/object:Gem::Dependency
@@ -112,6 +112,7 @@ files:
112
112
  - lib/active_merchant/billing/gateway.rb
113
113
  - lib/active_merchant/billing/gateways/authorize_net.rb
114
114
  - lib/active_merchant/billing/gateways/authorize_net_cim.rb
115
+ - lib/active_merchant/billing/gateways/barclays_epdq.rb
115
116
  - lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb
116
117
  - lib/active_merchant/billing/gateways/beanstream.rb
117
118
  - lib/active_merchant/billing/gateways/beanstream_interac.rb
@@ -238,6 +239,11 @@ files:
238
239
  - lib/active_merchant/billing/integrations/two_checkout/notification.rb
239
240
  - lib/active_merchant/billing/integrations/two_checkout/return.rb
240
241
  - lib/active_merchant/billing/integrations/two_checkout.rb
242
+ - lib/active_merchant/billing/integrations/valitor/helper.rb
243
+ - lib/active_merchant/billing/integrations/valitor/notification.rb
244
+ - lib/active_merchant/billing/integrations/valitor/response_fields.rb
245
+ - lib/active_merchant/billing/integrations/valitor/return.rb
246
+ - lib/active_merchant/billing/integrations/valitor.rb
241
247
  - lib/active_merchant/billing/integrations.rb
242
248
  - lib/active_merchant/billing/response.rb
243
249
  - lib/active_merchant/billing.rb
metadata.gz.sig CHANGED
Binary file